A1025
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
long long int number;//序号代码,什么时候用long long int
int local,score;//所在的考场是1还是2
int localrank,finalrank;//自己在本考场的排名,自己在所有的排名
};
bool cmp1(node a,node b)
{
return (a.score!=b.score)?a.score>b.score:a.number<b.number;
} //
int main()
{
int n,m;
scanf("%d",&n);//输入考场数
vector<node> final;//两个考场合在一起的数组
for(int i=0;i<n;i++)
{
scanf("%d",&m);//输入考生数
vector<node> v(m);//定义v[m]动态数组
for(int j=0;j<m;j++)
{
scanf("%lld %d",&v[j].number,&v[j].score);
v[j].local=i+1; //记录一下在哪个考场
}
sort(v.begin(),v.end(),cmp1);
v[0].localrank=1;
final.push_back(v[0]);//存入合在一起的数组里
for(int j=1;j<m;j++)
{
v[j].localrank=(v[j-1].score==v[j].score)?(v[j-1].localrank):(j+1);
final.push_back(v[j]);
}
}
//记录考生一共有多少,两个考场考生按照总成绩排名,依次输出number,总成绩排名,
//在哪个考场(1还是2),在自己考场的排名
sort(final.begin(),final.end(),cmp1);
printf("%d\n",final.size());
final[0].finalrank=1;
for(int i=1;i<final.size();i++)
{
final[i].finalrank=(final[i-1].score==final[i].score)?(final[i-1].finalrank):(i+1);
}
for(int i=0;i<final.size();i++)
{
printf("%013lld %d %d %d\n",final[i].number,final[i].finalrank,final[i].local,final[i].localrank);
}//这里是踩分点
return 0;
}
什么时候用long long int
A1028
这是我这些天唯一一个靠自己写出来的题
//A1028
//column列,表格能根据任何列分类记录
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
string name;
long long int id;
int grade;
};
bool cmp1(node a,node b)//c=1
{
return a.id<b.id;
}
bool cmp2(node a,node b)
{
return (a.name!=b.name)?a.name<b.name:a.id<b.id;
}
bool cmp3(node a,node b)
{
return (a.grade!=b.grade)?a.grade<b.grade:a.id<b.id;
}
int main()
{
int n,c;//如果c=1记录必须按照id从小到大输出
//如果c=2记录必须按照名字字母增加输出
//如果c=3记录必须按照成绩增加输出
//如果有学生有相同的名字或成绩,他们必须按照id从小到大输出
scanf("%d %d",&n,&c);
vector<node> student(n);
for(int i=0;i<n;i++)
{
scanf("%lld",&student[i].id);
cin>>student[i].name;
scanf("%d",&student[i].grade);
} //把这些都输入完之后再输出
if(c==1)
{
sort(student.begin(),student.end(),cmp1);
}
if(c==2)
{
sort(student.begin(),student.end(),cmp2);
}
if(c==3)//if里面判断是否为那个数的时候一定要写==号,否则编译不出错,我也找不出来
{
sort(student.begin(),student.end(),cmp3);
}
for(int i=0;i<n;i++)
{
printf("%06lld ",student[i].id);//一定要确定好位数6,%06lld,否则输出不正确
cout<<student[i].name;
printf(" %d",student[i].grade);
printf("\n");
}
return 0;
}
A1055 我写的代码超时。。。。
//A1055
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>//用到了strcmp函数
using namespace std;
struct node{
char name[10];
int age,worth;
};
bool cmp(node a,node b)
{
if(a.worth!=b.worth)//if多不超时
return a.worth>b.worth;
else if(a.age != b.age)
return a.age < b.age;
else
return (strcmp(a.name, b.name) < 0);
} //strcmp函数两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
//s1<s2时返回为负数,s1>s2时返回为正数,s1=s2时返回为0
//a.name<b.name不对,以后都用strcmp函数
int main()
{
int n,k,m,amin,amax;//m是输出的最大值
scanf("%d %d",&n,&k);//n是人的总数,k是问题的总数
vector<node> v(n);
for(int i=0;i<n;i++)
{
scanf("%s %d %d",&v[i].name,&v[i].age,&v[i].worth);
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<k;i++)
{
scanf("%d %d %d",&m,&amin,&amax);
vector<node> t;
for(int j=0;j<v.size();j++)
{
if(v[j].age>=amin&&v[j].age<=amax)
t.push_back(v[j]);
}
printf("Case #%d:\n",i+1);
int flag=0;
for(int a=0;a<m&&a<t.size();a++)
{
printf("%s %d %d\n",t[a].name,t[a].age,t[a].worth);
flag=1;
}
if(flag==0)
printf("None");
}
//对于每一个问题首先输出Case #X:x就是从1开始的问题数
//然后输出m个富有的人,她们的年龄在这个范围内
//每个人的信息占一行,name age worth
//输出必须按照worth由大到小的顺序
//如果worth相等,就按照age由小到大的顺序
//如果worth和age都一样,就按照名字由小到大的顺序
//如果没找到人,输出None
return 0;
}