#include<stdio.h>
#include<string.h> int main(){
float w[];
float t[];
float l[];
char a[];
float x[];
int i;
float sum;
memset(w,,sizeof(w));
memset(t,,sizeof(w));
memset(l,,sizeof(w)); for(i=;i<;i++){
scanf("%f %f %f",&w[i],&t[i],&l[i]);
} for(i=;i<;i++){
//x[i]=max(w[i],t[i],l[i]);
if(w[i]>t[i]&&w[i]>l[i]){
x[i]=w[i];
a[i]='W';
}
else if(t[i]>l[i]){
x[i]=t[i];
a[i]='T';
}
else{
x[i]=l[i];
a[i]='L';
}
}
sum=(x[]*x[]*x[]*0.65-)*;
printf("%c %c %c %.2f",a[],a[],a[],sum);
return ;
}
也是非常简单的一道题,没什么好说的
1012(重要!!)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
struct stu{
int id;
int c;
int m;
int e;
int a;
char br;
int rank;
};
bool cmpbyA(stu A,stu B){
return A.a>B.a;
}
bool cmpbyC(stu A,stu B){
return A.c>B.c;
}
bool cmpbyM(stu A,stu B){
return A.m>B.m;
}
bool cmpbyE(stu A,stu B){
return A.e>B.e;
}
int main(){
int i,j;
int n1,n2;
int t;
int score,r;
vector<stu> v;
freopen("in2.txt","r",stdin);
scanf("%d %d",&n1,&n2);
for(i=;i<n1;i++){
stu s;
scanf("%d %d %d %d",&(s.id),&(s.c),&(s.m),&(s.e));
s.a=(s.c+s.m+s.e)/;
v.push_back(s);
}
score=-;
r=;
sort(v.begin(),v.end(),cmpbyA);
for(i=;i<v.size();i++){
if(v[i].a!=score)
r=i+;
score=v[i].a;
v[i].rank=r;
v[i].br='A';
}
sort(v.begin(),v.end(),cmpbyC);
for(i=;i<v.size();i++){
if(v[i].c!=score)
r=i+;
score=v[i].c;
if(v[i].rank>r){
v[i].rank=r;
v[i].br='C';
}
}
sort(v.begin(),v.end(),cmpbyM);
for(i=;i<v.size();i++){
if(v[i].m!=score)
r=i+;
score=v[i].m;
if(v[i].rank>r){
v[i].rank=r;
v[i].br='M';
}
}
sort(v.begin(),v.end(),cmpbyE);
for(i=;i<v.size();i++){
if(v[i].e!=score)
r=i+;
score=v[i].e;
if(v[i].rank>r){
v[i].rank=r;
v[i].br='E';
}
}
for(i=;i<n2;i++){
scanf("%d",&t);
for(j=;j<n1;j++){
if(t==v[j].id){
printf("%d %c\n",v[j].rank,v[j].br);
break;
}
else if(t!=v[j].id&&j==n1-)
printf("N/A\n");
}
}
return ;
}
教科书一般的代码,从这个代码可以学到很多:
c++中vector容器的应用,使用此容器,直接将结构体装入容器内,直接利用vector本身的函数就可以非常方便的进行排序、计算大小等。
注意排名时候的名词并列的情况,本程序提供了一个非常优秀的处理方案,一定要学会使用。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std; vector<int> v[];
int t[];
int cend[];
int n,m,k,q;
int main(){
int i,j;
int s,f;
freopen("in.txt","r",stdin);
memset(t,,sizeof(t));
memset(cend,,sizeof(cend));
for(i=;i<;i++){
v[i].clear();
}
scanf("%d%d%d%d",&n,&m,&k,&q);
for(i=;i<=k;i++){
scanf("%d",&t[i]);
}
j=;
for(i=;i<=n*m;i++){
v[j].push_back(i);
if(i<=n) cend[i]=t[i];
else cend[i]=cend[i-n]+t[i];
if(j!=n-) j++;
else j=;
} for(i=n*m+;i<=k;i++){
int min=;
for(j=;j<n;j++){
if(cend[v[j].front()]<min){
min=cend[v[j].front()];
s=j;
}
}
cend[i]=cend[v[s].back()]+t[i]; v[s].erase(v[s].begin());
v[s].push_back(i);
}
for(i=;i<q;i++){
scanf("%d",&f);
if((cend[f]-t[f])>*) printf("Sorry\n");
else{
printf("%02d:%02d\n",cend[f]/+,cend[f]%);
}
}
return ;
}
利用上次学会的vector容器可以非常方便的解决这个问题。本质就是一个队列问题。
刚开始还是没有思路,虽然知道是个队列但是无法下手,后来参考大神的代码明白了要将整个队伍分成两部分考虑,一部分是黄线内的,他们的时间可以直接根据队伍确定,另一部分是黄线外,就必须要通过队列的出入时间来确定。理清这个思路,代码就其实比较容易实现。
提交的时候遇到了几个问题,一个是我的变量命名,不要和vector方法重名,比如说end,以后代码中要注意;另一个是这道题的一个细节,之前没有把题意弄清,一定要注意最后的判断条件,本题容易出错的地方:是在17:00及以后开始服务的客户输出"Sorry",而不是17:00之前结束服务的输出"Sorry";
如客户cId是16:59开始服务,服务时间为2,则输出的应该是17:01,而不是"Sorry"。这些都查好改过以后,就AC了。
#include<stdio.h>
#include<string.h>
#include<math.h>
bool isp(int x)
{
if(x<)
return false;
if(x==||x==)
return true;
for(int i=;i*i<=x;i++)
{
if(x%i==)
return false;
}
return true;
}
int main(){
int n,d;
char r[];
int i,k,sum;
freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
if(n<)
break;
scanf("%d",&d);
if(isp(n)){
memset(r,'\0',sizeof(r));
i=;
sum=;
while(n!=){
r[i]=n%d+'';
n=n/d;
i++;
}
k=;
for(i=strlen(r)-;i>=;i--){
sum+=(r[i]-'')*k;
k*=d;
}
if(isp(sum))
printf("Yes\n");
else
printf("No\n");
}
else
printf("No\n"); }
return ;
}
还算是自己有思路的一道题,基本不用任何参考自己做了出来,就是有点小问题,一定要注意到原来的数字也要是质数!
还有对于质数的判断,这道题的方法就作为参考,以后的质数都这样来判断。
我自己的方法是将每一位都转化为为字符串来处理,还算是比较简单。
还有一种比较好的(高端)方法是利用队列,关键代码如下:
if(isPrime(n))
{
queue<int>q;
while(n!=)
{
q.push(n%d);
n=n/d;
}
int reverse=;
while(!q.empty())
{
reverse=reverse*d;
reverse=reverse+q.front();
q.pop();
}
if(isPrime(reverse))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
其实吧。。思路都一样
#include<stdio.h>
#include<string.h> int main(){
int n,b;
int i,j;
int c[];
scanf("%d %d",&n,&b);
if(n==){
printf("Yes\n0");
return ;
}
//memset(c,'\0',sizeof(c));
i=;
while(n!=){
c[i]=n%b;
n=n/b;
i++;
}
int l=i;
int flag=;
for(i=,j=l-;i<j;i++,j--){
if(c[i]!=c[j]){
flag=;
break;
}
}
if(flag==)
printf("No\n");
else
printf("Yes\n");
for(i=l-;i>=;i--)
printf(i==?"%d\n":"%d ",c[i]); return ;
}
其实是一道很简单的题,关键就是十进制的转换。转换之后的储存。利用最简单的int数组就可以了,完全不需要其他容器或是我自己用的char数组的辅助就可以解决。希望给自己一个启示,以后不要把这种题目给复杂化了。
还有一点是这种对称的题的判断,从两头一起移动判断最合适,结束条件为i<j即可。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int n;
node *left;
node *right;
};
queue<node *> q;
vector<int> v;
node* buildtree(int *a,int *b,int n){
if(n<=) return NULL;
node *root=(node *)malloc(sizeof(node));
root->left=NULL;
root->right=NULL;
root->n=a[n-];
int i=;
for(i=;i<n;i++){
if(b[i]==a[n-])
break;
}
root->left=buildtree(a,b,i);
root->right=buildtree(a+i,b+i+,n-i-);
return root;
}
void levelorder(node *tree){
if(tree!=NULL) q.push(tree);
while(!q.empty()){
node *t=q.front();
if(t->left!=NULL) q.push(t->left);
if(t->right!=NULL) q.push(t->right);
v.push_back(t->n);
q.pop();
}
}
int main(){
int a[],b[];
int i,n;
freopen("in.txt","r",stdin);
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&a[i]);
for(i=;i<n;i++)
scanf("%d",&b[i]);
node *tree=buildtree(a,b,n);
levelorder(tree);
for(i=;i<n;i++){
printf(i==n-?"%d\n":"%d ",v[i]);
}
return ;
}
第一次接触树的题目,这是一个很经典的题目。包括了树的结构体的定义、树的生成、利用容器实现各种遍历、递归算法的实现。最关键的是遍历的转换,利用两个遍历还原整个二叉树(其中必须有一个是中序遍历)作为一个经典的题目,一定要利用这个题打开树类题目的思路。