暑期集训sort

来源:互联网 发布:夏普网络电视机 编辑:程序博客网 时间:2024/05/29 15:01

点击打开链接


A题:开门人和关门人

简单的结构体排序。。

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;struct people{char num[20];int come;int out;}an[5000];bool cmp1(people a,people b){return a.come<b.come;}bool cmp2(people a,people b){return a.out>b.out;}int main(){int n,m,i;scanf("%d",&n);while(n--){scanf("%d",&m);for(i=0;i<m;i++){int h,m,s;scanf("%s",an[i].num);scanf("%d:%d:%d",&h,&m,&s);an[i].come=h*3600+m*60+s;scanf("%d:%d:%d",&h,&m,&s);an[i].out=h*3600+m*60+s;}sort(an,an+m,cmp1);printf("%s ",an[0].num);sort(an,an+m,cmp2);printf("%s\n",an[0].num);}return 0;}
B题:excel排序

就是考虑每一种排序方法的要求

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;struct student{char num[10];char name[10];int grade;}p[100010];bool cmp1(student a,student b){int t=strcmp(a.num,b.num);if(t==-1)return true;else return false;}bool cmp2(student a,student b){int t=strcmp(a.name,b.name);if(t==0){int m=strcmp(a.num,b.num);if(m==-1)return true;else return false;}else {if(t==-1)return true;else return false;}}bool cmp3(student a,student b){if(a.grade==b.grade){int m=strcmp(a.num,b.num);if(m==-1)return true;else return false;}else return a.grade<b.grade;}int main(){int n,c,kase=1;while(scanf("%d%d",&n,&c)&&n!=0){for(int i=0;i<n;i++){scanf("%s %s %d",p[i].num,p[i].name,&p[i].grade);}switch(c){case 1:{sort(p,p+n,cmp1);break;}case 2:{sort(p,p+n,cmp2);break;}case 3:{sort(p,p+n,cmp3);break;}}printf("Case %d:\n",kase++);for(int i=0;i<n;i++){printf("%s %s %d\n",p[i].num,p[i].name,p[i].grade);}}return 0;}
C题:前m大的数

要考虑时间复杂度问题,有可能时间超限

#include<cstdio>#include<algorithm>using namespace std;int an[3000],bn[1000000];bool cmp(int a,int b){return a>b;}int main(){int n,m;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++)scanf("%d",&an[i]);sort(an,an+n,cmp);int t=0;if(m<n) n=m;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){bn[t++]=an[i]+an[j];}}sort(bn,bn+n*(n-1)/2,cmp);for(int i=0;i<m;i++)printf("%d%c",bn[i],i==m-1?'\n':' ');}return 0;}
D题:统计同成绩学生人数

一道水水的题,不过当时心态有点乱。。

#include<cstdio>#include<algorithm>using namespace std;int main(){int n,m,a[1000];while(scanf("%d",&n)&&n!=0){int p=0,i;for(i=0;i<n;i++){scanf("%d",&a[i]);}scanf("%d",&m);for(i=0;i<n;i++){if(a[i]==m) {p++;}}printf("%d\n",p);}return 0;}
E题:稳定排序

需要加一个标记整数,作为序列号,使得能够稳定排序

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct student{char name[55];int num;int ni;}p[300],q[300];bool cmp(student a,student b){if(a.num==b.num) return a.ni<b.ni;else return a.num>b.num;}int main(){int n,x,y,i;while(scanf("%d",&n)!=EOF){x=y=0;for(i=0;i<n;i++){scanf("%s %d",p[i].name,&p[i].num);p[i].ni=i+1;}for(i=0;i<n;i++){scanf("%s %d",q[i].name,&q[i].num);q[i].ni=i+1;}sort(p,p+n,cmp);for(i=0;i<n;i++){if(strcmp(p[i].name,q[i].name)){x=1;}if(p[i].num!=q[i].num){y=1;break;}}if(y==1) printf("Error\n");else if(x==1) printf("Not Stable\n");if(x==0&&y==0) printf("Right\n");if(x==1||y==1) for(i=0;i<n;i++){printf("%s %d\n",p[i].name,p[i].num);}}return 0;}
F题:What Is Your Grade?
这个写的有点麻烦了。。

#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>using namespace std;struct score{int num;int ti;int time;int score;}p[100];bool cmp1(score a,score b){if(a.ti==b.ti) return a.time<b.time;else return a.ti>b.ti;}bool cmp2(score a,score b){return a.num<b.num;}int main(){int n,a[6];while(scanf("%d",&n)&&n>0){int i,j,h,m,s;for(i=0;i<n;i++){scanf("%d%d:%d:%d",&p[i].ti,&h,&m,&s);p[i].time=h*3600+m*60+s;p[i].num=i+1;}sort(p,p+n,cmp1);memset(a,0,sizeof(a));for(i=0;i<n;i++){switch(p[i].ti){case 0:{a[0]++;p[i].score=50;break;}case 1:{a[1]++;break;}case 2:{a[2]++;break;}case 3:{a[3]++;break;}case 4:{a[4]++;break;}case 5:{a[5]++;p[i].score=100;break;}}}for(i=a[5];i<n;i++){if(i<a[5]+a[4]/2) p[i].score=95;else if(i<a[5]+a[4]) p[i].score=90;else if(i<a[5]+a[4]+a[3]/2) p[i].score=85;else if(i<a[5]+a[4]+a[3]) p[i].score=80;else if(i<a[5]+a[4]+a[3]+a[2]/2) p[i].score=75;else if(i<a[5]+a[4]+a[3]+a[2]) p[i].score=70;else if(i<a[5]+a[4]+a[3]+a[2]+a[1]/2) p[i].score=65;else if(i<a[5]+a[4]+a[3]+a[2]+a[1]) p[i].score=60;}sort(p,p+n,cmp2);for(i=0;i<n;i++){printf("%d\n",p[i].score);}printf("\n");}return 0;}
G题:Bear and Three Balls

先排序,然后把重复的去掉就行。

#include<cstdio>#include<algorithm>using namespace std;int main(){int n,i,an[50],bn[50],p,m;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++)scanf("%d",&an[i]);sort(an,an+n);p=0;m=0;for(i=0;i<n;i++){if(an[i]==an[i-1]&&i!=0) continue;bn[p++]=an[i];}for(int j=0;j<p-2;j++){if(bn[j]==bn[j+1]-1&&bn[j]==bn[j+2]-2){m=1;break;}}if(m) printf("YES\n");else printf("NO\n");}return 0;}
H题:今年暑假不AC(贪心)
贪心算法,区间相关问题。

先将结束时间给排序,每次选区间1,排序后扫描一次即可。

#include<cstdio>#include<algorithm>using namespace std;struct time {int begin;int end;}p[100];bool cmp(time a,time b){return a.end<b.end;}int main(){int n,m,i;while(scanf("%d",&n)&&n!=0){for(i=0;i<n;i++)scanf("%d%d",&p[i].begin,&p[i].end);sort(p,p+n,cmp);m=1;int q=0;for(i=1;i<n;i++){if(p[i].begin<p[q].end) continue;else {q=i;m++;}}printf("%d\n",m);}return 0;}









原创粉丝点击