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;
}