PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)

本文分享了作者参加PAT-B级考试的经历,详细记录了备考过程、考试心得及满分经验。文中提供了多道题目的C语言实现代码,涵盖算法、数据结构、字符串处理等领域,适合准备参加PAT考试的同学参考学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目集地址

报名了12月的PAT-B,先试试水。

已完成:2018/10/22 — 2018/11/14 


更新:(2018/12/09)PAT乙级考试100分!

考试代码已更新

冬天坐火车跑去考试冻懵了,来年对战PAT甲级考试!


目录

目录

题目集地址

目录

1001害死人不偿命的(3n+1)猜想

1002写出这个数

1003我要通过!

1004成绩排名

1005继续(3n+1)猜想

1006换个格式输出整数

1007素数对猜想

1008数组元素循环右移问题

1009说反话

1010一元多项式求导

1011A+B 和 C

1012数字分类

1013数素数

1014福尔摩斯的约会

1015德才论

1016部分A+B

1017A除以B

1018锤子剪刀布

1019数字黑洞

1020月饼

1021个位数统计

1022D进制的A+B

1023组个最小数

1024科学计数法

1025反转链表

1026程序运行时间

1027打印沙漏

1028人口普查

1029旧键盘

1030完美数列

1031查验身份证

1032挖掘机技术哪家强

1033旧键盘打字

1034有理数四则运算

1035插入与归并

1036跟奥巴马一起编程

1037在霍格沃茨找零钱

1038统计同成绩学生

1039到底买不买

1040有几个PAT

1041考试座位号

1042字符统计

1043输出PATest

1044火星数字

1045快速排序

1046划拳

1047编程团体赛

1048数字加密

1049数列的片段和

1050螺旋矩阵

1051复数乘法

1052卖个萌

1053住房空置率

1054求平均值

1055集体照

1056组合数的和

1057数零壹

1058选择题

1059C语言竞赛

1060爱丁顿数

1061判断题

1062最简分数

1063计算谱半径

1064朋友数

1065单身狗

1066图像过滤

1067试密码

1068万绿丛中一点红

1069微博转发抽奖

1070结绳

1071小赌怡情

1072开学寄语

1073多选题常见计分法

1074宇宙无敌加法器

1075链表元素分类

1076Wifi密码

1077互评成绩计算

1078字符串压缩与解压

1079延迟的回文数

1080MOOC期终成绩

1081检查密码

1082射击比赛

1083是否存在相等的差

1084外观数列

1085PAT单位排行

1086就不告诉你

1087有多少不同的值

1088三人行

1089狼人杀-简单版

1090危险品装箱

>>以下5题为2018/12/09PAT参赛时所写

1091N-自守数

1092最好吃的月饼

1093字符串A+B

1094谷歌的招聘

1095解码PAT准考证

END


1001害死人不偿命的(3n+1)猜想

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int num;
	scanf("%d",&num);
	int cnt=0;
	while(num!=1)
	{
		cnt++;
		if(num%2)
			num=(3*num+1)/2;
		else
			num=num/2;
	}
	printf("%d\n",cnt);
	return EXIT_SUCCESS;
} 

so so so so easy。


1002写出这个数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char **argv)
{
	char* bignumber=(char*)calloc(105,sizeof(char));
	scanf("%s",bignumber);
	int sum=0;
	for(int i=0;i<strlen(bignumber);i++)
		sum+=bignumber[i]-'0';
	char sp[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	int list[105]={0},index=0;
	do
	{
		int now=sum%10;
		sum/=10;
		list[index++]=now;
	}
	while(sum);
	for(int i=index-1;i>=0;i--)
		printf("%s%c",sp[list[i]],i==0?'\n':' ');
	return EXIT_SUCCESS;
} 

so so easy。


1003我要通过!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		char str[105];
		scanf("%s",str);
		int state=0,i,Afront=0,Amiddle=0,Alater=0;
		for(i=0;i<strlen(str);i++)
		{
			if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')
				break;
			if(str[i]=='P')
				if(state==0)
					state=1;
				else
					break;
			if(str[i]=='A')
				if(state==1)
					state=2;	
				else if(state==2)
					Amiddle++;
				else if(state==0)
					Afront++;
				else
					Alater++;
			if(str[i]=='T')
				if(state==2)
					state=3;
				else
					break;
		}
		while(Amiddle)
		{
			Alater-=Afront;
			Amiddle--;
		}
		if(i<strlen(str)||state!=3||Afront!=Alater)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return EXIT_SUCCESS;
} 

分析题目三个通过条件可知。字符串中不能出现P、A、T之外的字符;PT之间只有一个A时(PAT),前后可以加上相同个数的A;PT中每多一个A(>2),后面加上前面个数个A。

统计字符串中P、T前中后A的个数判断即可。


1004成绩排名

#include<stdio.h>
#include<stdlib.h>
struct student
{
	char name[15];
	char IDnumber[15];
	int score;
};
typedef struct student student;
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	student max={"","",0},min={"","",100};
	while(cnt--)
	{
		student new;
		scanf("%s%s%d",new.name,new.IDnumber,&new.score);
		if(new.score>max.score)
			max=new;
		if(new.score<min.score)
			min=new;
	}
	printf("%s %s\n",max.name,max.IDnumber);
	printf("%s %s\n",min.name,min.IDnumber);
	return EXIT_SUCCESS;
}

so so easy。


1005继续(3n+1)猜想

#include<stdio.h>
#include<stdlib.h>
int book[4500]={0};
void getsp(int num)
{
	if(book[num])
		return;
	while(num!=1)
	{
		if(num%2)
			num=(3*num+1)/2;
		else
			num=num/2;
		book[num]=1;
	}
}
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int num;
	int array[101]={0};
	while(cnt--)
	{
		scanf("%d",&num);
		getsp(num);
		array[num]=1;
	}
	int firstblood=0;
	for(int i=100;i>0;i--)
		if(array[i]&&book[i]==0&&firstblood==0)
		{
			printf("%d",i);
			firstblood=1;
		}
		else if(array[i]&&book[i]==0)
			printf(" %d",i);
	putchar('\n');
	return EXIT_SUCCESS;
}

略坑。题目意思是第一个直接执行3n+1猜想,并记录过程中的每个数,注意是过程数;后面的每个数先判断是否已经记录过,记录过就直接跳过(记录过后面算就没意义了),没记录过就执行3n+1猜想并记录过程数。

再挨个判断每个数是否在记录中,记录中存在则输出。记录过程的数组开大点,4500左右。


1006换个格式输出整数

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int num;
	scanf("%d",&num);
	int chundred=num/100;
	while(chundred--)	putchar('B');
	num%=100;
	int cten=num/10;
	while(cten--)	putchar('S');
	num%=10;
	int st=1;
	while(num>=st)
	{
		putchar('0'+st);
		st++;	
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

so so easy。


1007素数对猜想

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int getsp(int num)
{
	int sum=0;
	int history=2;
	for(int k=2;k<=num;k++)
	{
		int is=0;
		for(int i=2;i<=(int)sqrt(k);i++)
			if(k%i==0)
			{
				is=1;
				break;
			}
		if(!is&&k-history==2)
			sum++;
		if(!is)
			history=k;
	}
	return sum;
}
int main(int argc,char **argv)
{
	int num;
	scanf("%d",&num);
	printf("%d\n",getsp(num));
	return EXIT_SUCCESS;
}

挨个计算素数,判断当前值和上一个历史值之差是否为 2 。


1008数组元素循环右移问题

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int num,rr;
	scanf("%d%d",&num,&rr);
	int array[105]={0};
	for(int i=1;i<=num;i++)
		scanf("%d",&array[i]);
	int begin=num-rr%num+1;
	
	for(int i=1;i<=num;i++)
	{
		if(begin>num)
			begin=1;
		printf("%d%c",array[begin++],i==num?'\n':' ');
	}
	return EXIT_SUCCESS;
}

模拟实现汇编的 RR 。


1009说反话

#include<stdio.h>
#include<string.h>
char str[85];
int book[85][2];
int main(int argc,char** argv)
{
  	scanf("%[^\n]",str);
  	int ind,ins=strlen(str),con=0,booknow=0;
	for(ind=0;ind<ins;ind++)
	{
		if(str[ind]!=' '&&!con)
		{
			con=1;
			book[booknow][0]=ind;
		}
		else if(str[ind]==' '&&con)
		{
			con=0;
			book[booknow++][1]=ind;
		}
	}
	if(con)
		book[booknow++][1]=ins;
	for(ind=booknow-1;ind>=0;ind--)
	{
		for(ins=book[ind][0];ins<book[ind][1];ins++)
			printf("%c",str[ins]);
		printf("%c",ind==0?'\n':' ');
	}
  	return 0;
}

记录每个单词的起始和终止位置。


1010一元多项式求导

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int sp[1005][2];
	int i=0;
	while(scanf("%d%d",&sp[i][0],&sp[i][1])!=EOF)
		i++;
	int firstblood=0;
	for(int j=0;j<=i-1;j++)
		if(sp[j][0]*sp[j][1])
		{
			if(firstblood==0)
				firstblood=1;
			else
				putchar(' ');
			printf("%d %d",sp[j][0]*sp[j][1],sp[j][1]-1);
		}
	if(!firstblood)
		printf("0 0");
	putchar('\n');
	return EXIT_SUCCESS;
}

小小小坑。存在负指数。


1011A+B 和 C

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) (a<b?b:a)
#define min(a,b) (a>b?b:a)
int main(int argc, char *argv[])
{
	int cnt;
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		long long a,b,c;
		scanf("%ld%ld%ld",&a,&b,&c);
		if(a+b>c)
			printf("Case #%d: true\n",i);
		else
			printf("Case #%d: false\n",i);
	} 
	return 0;
}

so so so so easy……


1012数字分类

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int A1=0,A2=0,A3=0,A5=0,A2p=-1,A2els=0;
	double A4=0.0,A4p=0.0;
	while(cnt--)
	{
		int num;
		scanf("%d",&num);
		if(num%5==0&&num%2==0)
			A1+=num;
		if(num%5==1)
		{
			A2p*=-1;
			A2+=A2p*num;
                        A2els=1;
		}
		if(num%5==2)
		{
			A3++;
		}
		if(num%5==3)
		{
			A4+=num;
			A4p++;
		}
		if(num%5==4)
		{
			if(num>A5)
				A5=num;
		}
	}
	if(A1==0)
		printf("N ");
	else
		printf("%d ",A1);
	if(A2els==0)
		printf("N ");
	else
		printf("%d ",A2);
	if(A3==0)
		printf("N ");
	else
		printf("%d ",A3);
	if(A4p==0.0)
		printf("N ");
	else
		printf("%.1lf ",A4/A4p);
	if(A5==0)
		printf("N\n");
	else
		printf("%d\n",A5);
	return EXIT_SUCCESS;
}

小小小坑,判断每一个情况是否有值。


1013数素数

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int ispre(int num)
{
	if(num==1)
		return 0;
	if(num==2)
		return 1;
	for(int i=2;i<=num/i;i++)
	{
		if(num%i==0)
			return 0;
	}
	return 1;
}
int array[10002];
int main(int argc,char **argv)
{
	int M,N,cnt=0;
	scanf("%d%d",&M,&N);
	int i,j;
	for(i=2,j=1;j<=10000;i++)
	{
		if(ispre(i))
			array[j++]=i;
	}
	for(i=M;i<=N;i++)
	{
		cnt++;
		printf("%d",array[i]);
		if(cnt%10==0||i==N)
			printf("\n");
		else
			printf(" ");
	}
	return EXIT_SUCCESS;
} 

so so so easy,先打表,按要求依次输出。


1014福尔摩斯的约会

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	char str1[100],str2[100],str3[100],str4[100];
	scanf("%s%s%s%s",str1,str2,str3,str4);
	char week[10][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
	int first=-1,secend=-1,third=-1;
	for(int i=0;;i++)
	{
		if(str1[i]==str2[i]&&first!=-1)
		{
			if(isdigit(str1[i]))
			{
				secend=str1[i]-'0';
				break;
			}
			else if(str1[i]>='A'&&str1[i]<='N')
			{
				secend=str1[i]-'A'+10;
				break;
			}
		}
		if(str1[i]==str2[i]&&first==-1&&(str1[i]>='A'&&str1[i]<='G'))
		{
			first=str1[i]-'A';
		}
	}
	for(int i=0;;i++)
	{
		if(str3[i]==str4[i]&&third==-1&&isalpha(str3[i]))
		{
			third=i;
			break;
		}
	}
	printf("%s %02d:%02d\n",week[first],secend,third);
	return EXIT_SUCCESS;
}

小小坑。A-N和A-G的范围不能用无脑直接用isupper……。


1015德才论

#include<stdio.h>
#include<stdlib.h>
struct man
{
	int number,de,cai;
	int rank;
};
struct man sp[100000];	
int compare(const void *a,const void *b)
{
	const struct man *as=a;
	const struct man *bs=b;
	if(as->rank!=bs->rank)
		return -(as->rank-bs->rank);
	else if((as->de+as->cai)!=(bs->de+bs->cai))
		return -(as->de+as->cai)+(bs->de+bs->cai);
	else if(as->de!=bs->de)
		return -(as->de-bs->de);
	else
		return as->number-bs->number;
}
int main(void)
{
	int N,baseline,additionline;
	scanf("%d%d%d",&N,&baseline,&additionline);
	int index=0,sum=0;
	while(N--)
	{
		int a,b,c,d;
		scanf("%d%d%d",&a,&b,&c);
		if(b<baseline||c<baseline)
			continue;
		sum++;
		if(b>=additionline&&c>=additionline)
		{
			d=4;
			sp[index].number=a;
			sp[index].de=b;
			sp[index].cai=c;
			sp[index++].rank=d;
			continue;
		}
		if(b>=additionline&&c<additionline)
		{
			d=3;
			sp[index].number=a;
			sp[index].de=b;
			sp[index].cai=c;
			sp[index++].rank=d;
			continue;
		}
		if(b>=c&&b<additionline&&c<additionline)
		{
			d=2;
			sp[index].number=a;
			sp[index].de=b;
			sp[index].cai=c;
			sp[index++].rank=d;
			continue;
		}
		d=1;
		sp[index].number=a;
		sp[index].de=b;
		sp[index].cai=c;
		sp[index++].rank=d;
	}
	qsort(sp,index,sizeof(struct man),compare);
	printf("%d\n",sum);
	for(int i=0;i<index;i++)
	{
		printf("%d %d %d\n",sp[i].number,sp[i].de,sp[i].cai);
	}
	return EXIT_SUCCESS;
}

编写compare函数借助qsort即可,STL的sort同理。


1016部分A+B

#include<stdio.h>
#include<stdlib.h>
int getnum(int sp,int key)
{
	int sumn=0;
	while(sp)
	{
		int sol=sp%10;
		if(sol==key)
			sumn=sumn*10+key;
		sp/=10;
	}
	return sumn;
}
int main(int argc,char *argv[])
{
	int a,as,b,bs;
	scanf("%d%d%d%d",&a,&as,&b,&bs);
	printf("%d\n",getnum(a,as)+getnum(b,bs));
	return EXIT_SUCCESS;
}

so easy。提取符合的每一位相加。


1017A除以B

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char bignumber[1005];
	char div[1005];
	scanf("%s",bignumber);
	int key;
	scanf("%d",&key);
	int mod=0,index=0,firstblood=0;
	for(int i=0;i<strlen(bignumber);i++)
	{
		mod+=bignumber[i]-'0';
		if(key>mod)
		{
			mod*=10;
			if(firstblood)
				div[index++]='0';
			continue;
		}
		if(!firstblood)
			firstblood=1;
		div[index++]=mod/key+'0';
		mod=mod%key*10;
	}
	if(index==0)
	  div[index++]='0';
	div[index]=0;
	printf("%s %d\n",div,mod/10);
	return EXIT_SUCCESS;
}

小坑,存在除数为 0 的情况。


1018锤子剪刀布

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt;
	scanf("%d%*c",&cnt);
	int wina[5]={0},winb[5]={0},wa=0,wb=0,equ=0,max;
	char maxa='B',maxb='B';
	while(cnt--)
	{
		char q,w;
		scanf("%c %c%*c",&q,&w);
		if(q=='C'&&w=='J'||q=='J'&&w=='B'||q=='B'&&w=='C')
		{
			wa++;
			if(q=='B')wina[1]++;
			if(q=='C')wina[2]++;
			if(q=='J')wina[3]++;
			max=wina[1],maxa='B';
			if(wina[2]>max)
				max=wina[2],maxa='C';
			if(wina[3]>max)
				max=wina[3],maxa='J';
			continue;
		}
		else if(w=='C'&&q=='J'||w=='J'&&q=='B'||w=='B'&&q=='C')
		{
			wb++;
			if(w=='B')winb[1]++;
			if(w=='C')winb[2]++;
			if(w=='J')winb[3]++;
			max=winb[1],maxb='B';
			if(winb[2]>max)
				max=winb[2],maxb='C';
			if(winb[3]>max)
				max=winb[3],maxb='J';
			continue;
		}
		else
		  equ++;
	}
	printf("%d %d %d\n%d %d %d\n",wa,equ,wb,wb,equ,wa);
	printf("%c %c\n",maxa,maxb);
	return EXIT_SUCCESS;
}

so easy。统计输赢情况。


1019数字黑洞

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int whole;
	scanf("%d",&whole);
	int a[5],firstblood=0;
	while(whole!=6174&&whole!=0||firstblood==0)
	{
		if(!firstblood)
			firstblood=1;
		a[1]=whole%10;
		a[2]=whole/10%10;
		a[3]=whole/100%10;
		a[4]=whole/1000%10;
		for(int i=1;i<4;i++)
			for(int j=1;j<=4-i;j++)
				if(a[j]>a[j+1])
				{
					int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
		int big=a[1]+a[2]*10+a[3]*100+a[4]*1000;
		int small=a[4]+a[3]*10+a[2]*100+a[1]*1000;
		whole=big-small;
		printf("%04d - %04d = %04d\n",big,small,whole);
	}
	return EXIT_SUCCESS;
}

小坑,输入是6174的情况。


1020月饼

#include<stdio.h>
#include<stdlib.h>
//#define HOST
typedef struct
{
	double si;
	double sum,num;
}moon;
moon cakes[1005]={0};
int compare(const void *a,const void *b)
{
	const moon *sa=(const moon*)a;
	const moon *sb=(const moon*)b;
	if(sb->si>sa->si)
		return 1;
	if(sb->si<sa->si)
		return -1;
	return 0; 
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int n,need;
	scanf("%d%d",&n,&need);
	for(int i=0;i<n;i++)
		scanf("%lf",&cakes[i].num);
	for(int i=0;i<n;i++)
		scanf("%lf",&cakes[i].sum);
	for(int i=0;i<n;i++)
		cakes[i].si=cakes[i].sum/cakes[i].num;
	qsort(cakes,n,sizeof(moon),compare);
	double ans=0.0;
	for(int i=0;i<n;i++)
	{
		if(need<=cakes[i].num)
		{
			ans+=cakes[i].si*need;
			break;
		}
		else
		{
			ans+=cakes[i].sum;
			need-=cakes[i].num;
		}
	}
	printf("%.2lf\n",ans);
	return EXIT_SUCCESS;
}

小坑。第二行第三行输入的库存和总价题目说明是正数,可以是小数的。


1021个位数统计

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char bignumber[1005];
	int book[10]={0};
	scanf("%s",bignumber);
	for(int i=0;i<strlen(bignumber);i++)
		book[bignumber[i]-'0']++;
	for(int i=0;i<10;i++)
		if(book[i])
			printf("%d:%d\n",i,book[i]);
	return EXIT_SUCCESS;
}

so so so so easy。统计各个数字出现个数输出。


1022D进制的A+B

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int* tobasenumber(long long original,int base)
{
	static int array[30]={0},index=1;
	if(!original)
	  array[index++]=0;
	while(original)
	{
		array[index++]=original%base;
		original/=base;
	}
	array[0]=index-1;
	return array;
}
int main(int argc,char *argv[])
{
	long long a,b;
	scanf("%lld%lld",&a,&b);
	long long sum=a+b;
	int base;
	scanf("%d",&base);
	int *point=tobasenumber(sum,base);
	for(int i=point[0];i>0;i--)
		printf("%d",point[i]);
	putchar('\n');
	return EXIT_SUCCESS;
}

小坑。存在和为 0 的情况。


1023组个最小数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	int book[10]={0};
	for(int i=0;i<10;i++)
		scanf("%d",&book[i]);
	int index=1;
	while(book[index]==0)
		index++;
	book[index]--;
	printf("%d",index);
	index=0;
	while(index<=9)
	{
		if(!book[index])
		{
			index++;
			continue;	
		}
		printf("%d",index);
		book[index]--;
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

so easy。第一个数从1开始取最小数,后面的数从零开始取。


1024科学计数法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char str[11000];
	scanf("%s",str);
	int ends=0;
	for(int i=1;;i++)
		if(str[i]=='E')
		{
			ends=i;
			break;
		}
	int psss=0,endall=strlen(str)-1,copyends=ends+2;
	while(endall>=copyends)
	{
		psss=psss*10+str[copyends]-'0';
		copyends++;
	}
	if(str[ends+1]=='-')
		psss=-psss;
	if(str[0]=='-')
		putchar(str[0]);
	if(psss>0)
	{
		printf("%c",str[1]);
		for(int i=0;i<ends-3||i<psss;i++)
		{
			if((i==psss)&&(i<ends-3))
				putchar('.');
			if(i<ends-3)
				putchar(str[i+3]);
			else
				putchar('0');
		}
	}
	else if(psss<0)
	{
		putchar('0');
		putchar('.');
		for(int i=1;i<abs(psss);i++)
			putchar('0');
		putchar(str[1]);
		for(int i=0;i<ends-3;i++)
			putchar(str[i+3]);
	}
	else
	{
		for(int i=1;i<ends;i++)
			putchar(str[i]);
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

先把输入处理成有效数字、正负号、指数值几部分,后根据指数正、负、零,分析输出即可。


1025反转链表

#include<stdio.h>
#include<stdlib.h>
//#define HOST
typedef struct
{
	int data;
	int next;
}node;
node sp[100005]={0};
int ans[100005]={0};
void reverse(int left,int right)
{
	while(left<right)
	{
		int temp=ans[left];
		ans[left]=ans[right];
		ans[right]=temp;
		left++,right--;
	}
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int begin,cnt,isp;
	scanf("%d%d%d",&begin,&cnt,&isp);
	for(int i=0;i<cnt;i++)
	{
		int temp;
		scanf("%d",&temp);
		scanf("%d%d",&sp[temp].data,&sp[temp].next);
	}
	int index=0;
	while(begin!=-1)
	{
		ans[index++]=begin;
		begin=sp[begin].next;
	}
	for(int i=0;i<(index)/isp;i++)
	{
		int left=i*isp,right=(i+1)*isp-1;
		reverse(left,right);
	}
	printf("%05d %d",ans[0],sp[ans[0]].data);
	for(int i=1;i<index;i++)
		printf(" %05d\n%05d %d",ans[i],ans[i],sp[ans[i]].data);
	printf(" -1\n");
	return EXIT_SUCCESS;
}

读取链表数据,转换成数组存储。逐一反转数组即可。


1026程序运行时间

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int time1,time2;
	scanf("%d%d",&time1,&time2);
	float time=(time2-time1)/100.0-(time2-time1)/100;
	if(time>=0.5)
		time=(time2-time1)/100+1;
	else
		time=(time2-time1)/100;
	int sp=time;
	printf("%02d:%02d:%02d\n",sp/3600,sp%3600/60,sp%3600%60);
	return EXIT_SUCCESS;
}

so so easy。得到程序运行秒数后,四舍五入成整数后按格式输出。


1027打印沙漏

#include<stdio.h>
int main(int argc,char** argv)
{
	int sum;
	char ch;
	scanf("%d %c",&sum,&ch);
	int i=1,msum=1,fk=sum-msum;
	while(fk>=(i+2)*2)
	{
		i+=2;
		msum+=2*i;
		fk=sum-msum;
	}
	int ins=i;
	while(ins>1)
	{
		int ind=ins,inf=(i-ins)/2;
		while(inf--)
			putchar(' ');
		while(ind--)
			putchar(ch);
		putchar('\n');
		ins-=2;
	}
	int inf=(i-1)/2;
	while(inf--)
		putchar(' ');
	putchar(ch);
	putchar('\n');
	ins=3;
	while(ins<=i)
	{
		int ind=ins,inf=(i-ins)/2;
		while(inf--)
			putchar(' ');
		while(ind--)
			putchar(ch);
		putchar('\n');
		ins+=2;
	}
	printf("%d\n",fk);
	return 0;
}

老题目,先计算好沙漏第一行字符个数和剩余值,循环输出即可。


1028人口普查

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct member
{
	char name[10];
	int year,month,day;
}member;

int compare(member x,member y)
{
	if(x.year==y.year)
		if(x.month==y.month)
			if(x.day==y.day)
				return 0;
			else
				return x.day-y.day;
		else
			return x.month-y.month;
	else
		return x.year-y.year;
}
int check(member x)
{
	if(x.year>2014)
		return 1;
	if(x.year==2014)
	{
		if(x.month>9)
			return 1;
		if(x.month==9)
			if(x.day>6)
				return 1;
	}
	if(x.year<1814)
		return 1;
	if(x.year==1814)
	{
		if(x.month<9)
			return 1;
		if(x.month==9)
			if(x.day<6)
				return 1;
	}
	return 0;
}
int main(int argc, char *argv[])
{
	int cnt;
	scanf("%d",&cnt);
	member maxn,minn;
	int sumcurrect=0,firstblood=0;
	while(cnt--)
	{
		member now;
		scanf("%s%d/%d/%d",now.name,&now.year,&now.month,&now.day);
		if(check(now))
			continue;
		sumcurrect++;
		if(!firstblood)
		{
			firstblood=1;
			maxn=minn=now;
		}
		else
		{
			if(compare(now,maxn)>0)
				maxn=now;
			if(compare(minn,now)>0)
				minn=now;	
		}		
	}
	if(firstblood)
		printf("%d %s %s\n",sumcurrect,minn.name,maxn.name);
	else
		printf("0\n");
	return 0;
}

天坑。存在没有一个满足的人的情况(只输出一个 0 ),还需考虑只有一个满足的人的情况(最大最小输出同一个人的名字)。


1029旧键盘

#include<stdio.h>
#include<ctype.h>
int book[128]={0};
char stack[1000]={0};
int main(int argc,char** agrv)
{
	char str1[1000],str2[1000];
	scanf("%s%s",str1,str2);
	int point1=0,point2=0,point3=0;
	while(str1[point1])
	{
		if(str1[point1]==str2[point2])
		{
			point1++;
			point2++;
		}
		else
		{
			int sp=toupper(str1[point1]);
			if(book[sp]==0)
			{
				book[sp]=1;
				stack[point3++]=sp;
			}
			point1++;
		}
	}
	stack[point3]=0;
	printf("%s\n",stack);
	return 0;
}

so easy。


1030完美数列

#include<stdio.h>
#include<stdlib.h>
#define max(x,y) ((x>y)?(x):(y))
long long array[100005];
int compare(const void *a,const void *b)
{
	return (*(long long*)a-*(long long*)b);
}
int main(int argc,char **argv)
{
	int cnt,k;
	scanf("%d%d",&cnt,&k);
	for(int i=0;i<cnt;i++)
	{
		scanf("%lld",&array[i]);
	}
	qsort(array,cnt,sizeof(long long),compare);
	int sp=0;
	for(int i=0;i<cnt;i++)
		for(int j=i+sp;j<cnt;j++)
			if(array[i]*k<array[j])
				break;
			else
				sp=max(sp,j-i+1);
	printf("%d\n",sp);
	return EXIT_SUCCESS;
}

排序后循环查找最大可能值。


1031查验身份证

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt;
	scanf("%d",&cnt);
	int table[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	int allok=1;
	while(cnt--)
	{
		char idcardnumber[20];
		scanf("%s",idcardnumber);
		int sum=0;
		for(int i=0;i<17;i++)
			sum+=(idcardnumber[i]-'0')*table[i];
		sum%=11;
		char book[20]={'1','0','X','9','8','7','6','5','4','3','2'};
		if(book[sum]!=idcardnumber[17])
		{
			if(allok)
				allok=0;
			printf("%s\n",idcardnumber);
		}
	}
	if(allok)
		printf("All passed\n");
	return EXIT_SUCCESS;
}

按所给计算方法判断是否通过。


1032挖掘机技术哪家强

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt,max=0;
	scanf("%d",&cnt);
	int *array=(int*)calloc(100005,sizeof(int));
	while(cnt--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		array[a]+=b;
		if(array[max]<array[a])
			max=a;
	}
	printf("%d %d\n",max,array[max]);
	free(array);
	return EXIT_SUCCESS;
}

so easy。


1033旧键盘打字

#include <stdio.h>
#include <ctype.h>
int main(int argc,char** argv)
{
 char A[128] = {0}, ch;
 while ((ch = getchar()) != '\n')
  A[ch]++;
 while ((ch = getchar()) != '\n')
  if ((isupper(ch) && A[43]) || A[toupper(ch)])
  continue;
  else
  putchar(ch);
 return 0;
}

记录第一个字符串出现字符,过滤第二个字符串。


1034有理数四则运算

#include<stdio.h>
#include<stdlib.h>
#define mabs(a) (a<0?(-a):(a))
long long gcd(long long m,long long n)
{
	if(m<0)
		m=-m;
	if(n<0)
		n=-n;
	return (m%n?gcd(n,m%n):n);
}
void printnum(long long a,long long b)
{
    if (b == 0)
	{
        printf("Inf");
        return;
    }
    int sign=1;
    if((a<0&&b>0)||(a>0&&b<0))
    {
    	sign=-1;
	}
	a=mabs(a);
	b=mabs(b);
    int temp=gcd(a, b);
    a/=temp;
    b/=temp;
    if(sign==-1)
		printf("(-");
    if(b==1)
        printf("%lld", a);
	else if(a>b)
        printf("%lld %lld/%lld",a/b,a%b,b);
    else
        printf("%ld/%ld", a, b);
    if(sign==-1)
		printf(")");
	return;
}
int main(int argc,char **argv)
{
	long long a[2],b[2];
	scanf("%lld/%lld %lld/%lld",&a[0],&a[1],&b[0],&b[1]);
	printnum(a[0],a[1]);
	printf(" + ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[1]+a[1]*b[0],a[1]*b[1]);
	putchar('\n');
	printnum(a[0],a[1]);
	printf(" - ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[1]-a[1]*b[0],a[1]*b[1]);
	putchar('\n');
	printnum(a[0],a[1]);
	printf(" * ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[0],a[1]*b[1]);
	putchar('\n');
	printnum(a[0],a[1]);
	printf(" / ");
	printnum(b[0],b[1]);
	printf(" = ");
	printnum(a[0]*b[1],a[1]*b[0]);
	putchar('\n');
	return EXIT_SUCCESS;
}

坑。必须使用long long。分成两部分,一部分是直接计算分子、分母值及格式输出;另一部分是化简分子、分母为要求的格式。


1035插入与归并

#include<stdio.h>
#include<stdlib.h>
//#define HOST
void InsertionSort(int *arr,int begin,int len) 
{
	if(begin>=len)
		begin=len-1;
	int temp=arr[begin];
	for(int i=begin-1;i>=0;i--)
	{
		if(arr[i]>temp)
			arr[i+1]=arr[i],arr[i]=temp;
		else
		 	break;
 	}
 	return;
}
void MergeSort(int *arr,int begin,int len)
{
	if(begin>=len)
		begin=len;
	int start=0,end=0;
	for(int i=0;i<len;i+=begin)
	{
		start=i;
		end=(start+begin>len?len:start+begin);
		for(int m=end-1;m>=start;m--)
		{
			int iloc=-1,max=arr[start],l=0;
			for(l=start;l<=m;l++)
				if(arr[l]>=max)
					iloc=l,max=arr[l]; 
			if(iloc>=0)
				arr[iloc]=arr[l-1],arr[l-1]=max;  
		}
	}
	return;
}
int match(int *diff1,int *diff2,int len)
{
    for(int i=0;i<len;i++)
    	if(diff1[i]!=diff2[i])
			return 0;
    return 1;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
    int cnt,num1[105]={0},num2[105]={0},num1s[105]={0};
    scanf("%d",&cnt);
    for(int i=0;i<cnt;i++)
		scanf("%d",&num1[i]);
    for(int i=0;i<cnt;i++)
		scanf("%d",&num2[i]);
    for(int i=0;i<cnt;i++) 
		num1s[i]=num1[i];
    for(int i=1;i<cnt;i++)
    {
        InsertionSort(num1s,i,cnt);
        if(match(num2,num1s,cnt))
        {
            printf("Insertion Sort\n"); 
            InsertionSort(num1s,i+1,cnt);
            for(int j=0;j<cnt;j++)
				printf("%d%c",num1s[j],j==cnt-1?'\n':' ');
            return EXIT_SUCCESS;
        }
    }
    for(int i=1;i<=2*cnt;i*=2)
    {
        MergeSort(num1,i,cnt);
        if(match(num2,num1,cnt))
        {
            printf("Merge Sort\n");
            MergeSort(num1,2*i,cnt);
            for(int j=0;j<cnt;j++)
				printf("%d%c",num1[j],j==cnt-1?'\n':' ');
            return 0;
        }
    }       
    return EXIT_SUCCESS;
}

考察插入排序和归并排序。一步一步进行插入/归并排序,如果出现与目标序列一致则输出排序种类,再进行一次对应排序后输出序列。


1036跟奥巴马一起编程

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int cnt;
	char ch;
	scanf("%d %c",&cnt,&ch);
	for(int i=1;i<=cnt;i++)
		putchar(ch);
	putchar('\n');
	for(int i=1;i<=(int)((cnt/2.0)+0.5)-2;i++)
	{
		putchar(ch);
		for(int j=1;j<=cnt-2;j++)
			putchar(' ');
		putchar(ch);
		putchar('\n');
	}
	for(int i=1;i<=cnt;i++)
		putchar(ch);
	putchar('\n');	
	return EXIT_SUCCESS;
}

so easy。


1037在霍格沃茨找零钱

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int a,b,c;
	int x,y,z;
	scanf("%d.%d.%d",&a,&b,&c);
	scanf("%d.%d.%d",&x,&y,&z);
	int abc,xyz;
	abc=c+b*29+a*17*29;
	xyz=z+y*29+x*17*29;
	abc-=xyz;
	if(abc>0)
		putchar('-');
	else
		abc=-abc;
	printf("%d.%d.%d\n",abc/(17*29),abc%(17*29)/29,abc%(17*29)%29);
	return EXIT_SUCCESS;
}

so easy。单位转换。


1038统计同成绩学生

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int *array=(int*)calloc(101,sizeof(int));
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		int score;
		scanf("%d",&score);
		array[score]++;
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int sp;
		scanf("%d",&sp);
		printf("%d",array[sp]);
		if(cnt)
			printf(" ");
	}
	free(array);
	return EXIT_SUCCESS;
}

so so so easy。


1039到底买不买

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
	int *array=(int*)calloc(128,sizeof(int));
	char sp;
	int total=0;
	while(sp=getchar(),sp!='\n')
	{
		array[sp]++;
		total++;	
	}
	while(sp=getchar(),sp!='\n')
	{
		array[sp]--;
		total--;	
	}
	int require=0,none=1,redundant=0;
	for(int i=1;i<128;i++)
	{
		if(array[i]<0)
		{
			if(none)
				none=0;
			require+=-array[i];		
		}
		if(array[i]>0)
			redundant+=array[i]; 
	}
	if(none)
		printf("Yes %d\n",redundant);
	else
		printf("No %d\n",require);
	free(array);
	return EXIT_SUCCESS;
}

根据第一个字符串统计第二个字符串,多出/缺少的字符数。


1040有几个PAT

#include<stdio.h>
#include<stdlib.h>
#define MOD 1000000007
int main(int argc,char *argv[])
{
	int p=0,pa=0,pat=0;
	char sp;
	while(sp=getchar(),sp!='\n')
	{
		if(sp=='P')
			p++;
		if(sp=='A')
		{
			pa+=p;
			pa%=MOD;
		}
		if(sp=='T')
		{
			pat+=pa;
			pat%=MOD;
		}
	}
	printf("%d\n",pat);
	return EXIT_SUCCESS;
}

每个A都可以和前面任意一个P配对,每个T都可以和前面任意一个PA配对。还需不断的取余。

(a+b+c)%d==(a%d+b%d+c%d)%d


1041考试座位号

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	char ID[20];
	int num;
}student;
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	student *sp=(student*)calloc(cnt+1,sizeof(student));
	while(cnt--)
	{
		student now;
		int index;
		scanf("%s %d %d",now.ID,&index,&now.num);
		strcpy(sp[index].ID,now.ID);
		sp[index].num=now.num;
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int index;
		scanf("%d",&index);
		printf("%s %d\n",sp[index].ID,sp[index].num);
	}
	free(sp);
	return EXIT_SUCCESS;
} 

so easy。结构体数组存取。


1042字符统计

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	int alpha[26]={0};
	char ch;
	while((ch=getchar())!=EOF)
		if(isalpha(ch))
			alpha[tolower(ch)-'a']++;
	int max=0,sp;
	for(int i=25;i>=0;i--)
		if(alpha[i]>=max)
			sp=i,max=alpha[i];
	printf("%c %d\n",sp+'a',max);
	return EXIT_SUCCESS;
} 

将字母变成小写后,统计出现个数。逆序查找最大值。


1043输出PATest

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	int alpha[7]={0};
	char ch;
	int sum=0;
	while((ch=getchar())!=EOF)
	{
		if(ch=='P')
			alpha[1]++,sum++;
		if(ch=='A')
			alpha[2]++,sum++;
		if(ch=='T')
			alpha[3]++,sum++;
		if(ch=='e')
			alpha[4]++,sum++;
		if(ch=='s')
			alpha[5]++,sum++;
		if(ch=='t')
			alpha[6]++,sum++;
	}
	char sp[7]={0,'P','A','T','e','s','t'};
	while(sum)
		for(int i=1;i<=6;i++)
			if(alpha[i]>0)
			{
				alpha[i]--;
				sum--;
				putchar(sp[i]);
			}
	return EXIT_SUCCESS;
}

so so easy,筛选输出。


1044火星数字

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
char mars1[13][4]={"","tam","hel","maa","huh","tou","kes",\
"hei","elo","syy","lok","mer","jou"};
char mars2[13][5]={"tret","jan","feb","mar","apr","may","jun",\
"jly","aug","sep","oct","nov","dec"};
void tomars(int num)
{
	int sp1=num/13,sp2=num%13;
	if(sp1)
		printf("%s",mars1[sp1]);
	if(sp1&&sp2)
		putchar(' ');
	if((!sp2&&!sp1)||sp2)
		printf("%s",mars2[sp2]);
	putchar('\n');
	return;
}
void toearth(char *str)
{
	int sum=0;
	char temp[4]="",temps[5]="";
	sscanf(str,"%s%s",temp,temps);
	int sp1,sp2;
	for(int i=1;i<=12;i++)
		if(!strcmp(mars1[i],temp))
		{
			sum+=i*13;
			break;
		}
	for(int i=0;i<=12;i++)
		if(!strcmp(mars2[i],temps)||!strcmp(mars2[i],temp))
		{
			sum+=i;
			break;
		}
	printf("%d\n",sum);
	return;
}
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		char str[20]={0};
		scanf("%*c%[^\n]",str);
		if(isdigit(str[0]))
		{
			int num;
			sscanf(str,"%d",&num);
			tomars(num);
		}
		else
			toearth(str);
	}
	return EXIT_SUCCESS;
} 

花里胡哨版进制转换,用sscanf从字符串中读取可以简便许多。


1045快速排序

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int sp[100001][3],dp[100001];
	for(int i=0;i<cnt;i++)
		scanf("%d",&sp[i][0]);
	int leftmax=0;
	for(int i=0;i<cnt;i++)
	{
		sp[i][1]=leftmax;
		if(sp[i][0]>leftmax)
			leftmax=sp[i][0];
	}
	int rightmin=1<<30;
	for(int i=cnt-1;i>=0;i--)
	{
		sp[i][2]=rightmin;
		if(sp[i][0]<rightmin)
			rightmin=sp[i][0];
	}
	int index=0,sum=0;
	for(int i=0;i<cnt;i++)
	{
		int ok=1;
		if(sp[i][1]>=sp[i][0])
			ok=0;
		if(sp[i][2]<=sp[i][0])
			ok=0;
		if(ok)
		{
			sum++;
			dp[index++]=sp[i][0];
		}
	}
	printf("%d\n",sum);
	for(int i=0;i<index;i++)
	{ 
		printf("%d",dp[i]);
		if(i!=index-1)
			putchar(' '); 
	}
	putchar('\n');
	return EXIT_SUCCESS;
} 

此题天坑!首先如果输入 0 的话,得到的输出应该是 0后面跟两个回车……测试点2就是输入为0。

其次,题目中说按递增顺序输出这些元素。意思是按原顺序输出,并不用递增排序。

于是跑一遍左侧最大值、右侧最小值,选择满足要求的输出就完事了……


1046划拳

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int suma=0,sumb=0;
	while(cnt--)
	{
		int a,b,sa,sb;
		scanf("%d%d%d%d",&a,&sa,&b,&sb);
		if(a+b==sa&&a+b!=sb)
			suma++;
		if(a+b==sb&&a+b!=sa)
			sumb++;
	}
	printf("%d %d\n",sumb,suma);
	return EXIT_SUCCESS;
}

so so so so easy。


1047编程团体赛

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt;
	int score[1001]={0};
	scanf("%d",&cnt);
	while(cnt--)
	{
		int team,member;
		scanf("%d-%*d",&team);
		scanf("%d",&member);
		score[team]+=member;
	}
	int max=0;
	for(int i=1;i<=1000;i++)
	{
		if(score[i]>score[max])
			max=i;
	}
	printf("%d %d\n",max,score[max]);
	return EXIT_SUCCESS;
}

so so so easy。


1048数字加密

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char gotch(int num)
{
	if(num>=0&&num<=9)
		return num+'0';
	else if(num==10)
		return 'J';
	else if(num==11)
		return 'Q';
	else if(num==12)
		return 'K';
	return -1;
}
int main(int argc,char **argv)
{
	char *ans=NULL,*other=NULL;
	char num1[105],num2[105];
	scanf("%s%s",num1,num2);
	int i,sp=1;
	int len1=strlen(num1)-1,len2=strlen(num2)-1;
	if(len1>len2)
		ans=num1;
	else
		ans=num2;
	for(i=strlen(ans)-1;i>=0;i--)
	{
		char temp1,temp2;
		if(len1<0)
			temp1='0';
		else
			temp1=num1[len1--];
		if(len2<0)
			temp2='0';
		else
			temp2=num2[len2--];
		if(sp)
		{
			ans[i]=gotch(((temp1-'0')+(temp2-'0'))%13);
			sp=0;
		}
		else
		{		
			ans[i]=temp2-temp1;
			if(ans[i]<0)
				ans[i]+='0'+10;
			else
				ans[i]+='0';
			sp=1;
		}
	}
	printf("%s\n",ans);
	return EXIT_SUCCESS;
} 

天坑!题目并没有说明白数字A可能比数字B长,测试点2和5就是数字A比数字B长的情况,这时需要短的数字补零。

显而易见的做法是反转字符串,然后把短的补零,再逐位计算。

。。然而我并不想写reverse函数。

1.判断哪个数字长,指针指向长的数字。

2.两数字从个位开始逐位计算,如果有一个数字的索引 <0 则去值为 ‘0’ 。

3.输出指针所指的字符串。


1049数列的片段和

#include<iostream>
using namespace std;
int main(int argc,char *argv[])
{
    int cnt;cin>>cnt;
    long double sum=0.0;
    for(int i=1;i<=cnt;++i)
    {
        long double temp;cin>>temp;
        sum+=temp*i*(cnt+1-i);
    }
    printf("%.2Lf\n",sum);
    return 0;
}

每个数出现的个数是(左边数的个数+1)*(右边数的个数+1)。


1050螺旋矩阵

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int compare(const void *a,const void *b)
{
	return -*(const int*)a+*(const int*)b;
}
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int i,j,index=1;
	int *array=(int*)calloc(cnt+1,sizeof(int));
	for(i=1;i<=cnt;i++)
		scanf("%d",&array[i]);
	qsort(array+1,cnt,sizeof(int),compare); 
	int n=(int)floor(sqrt(cnt)),m;
	while(cnt%n)
		n--;
	m=cnt/n;
	int **matrix=(int**)calloc(m+5,sizeof(int*));
	for(i=0;i<=m+5;i++)
		matrix[i]=(int*)calloc(n+5,sizeof(int));
	i=j=1;
	while(cnt>0)
	{
		while(matrix[i][j]==0&&j<=n)
			matrix[i][j++]=array[index++],cnt--;
		j--,i++;
		while(matrix[i][j]==0&&i<=m)
			matrix[i++][j]=array[index++],cnt--;
		i--,j--;
		while(matrix[i][j]==0&&j>=1)
			matrix[i][j--]=array[index++],cnt--;
		j++,i--;
		while(matrix[i][j]==0&&i>=1)
			matrix[i--][j]=array[index++],cnt--;
		i++,j++;
	}
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			printf("%d%c",matrix[i][j],j==n?'\n':' ');
	return EXIT_SUCCESS;
}

free函数竟然会导致运行时错误。。肯能是PAT这里只能申请堆内存不能释放??

没有说明N的大小范围,须动态申请内存空间。


1051复数乘法

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	double R1,R2,P1,P2;
	scanf("%lf%lf%lf%lf",&R1,&P1,&R2,&P2);
	double t1=R1*cos(P1),r1=R1*sin(P1),t2=R2*cos(P2),r2=R2*sin(P2);
	double ans1=t1*t2-r1*r2;
	double ans2=t1*r2+t2*r1;
	if(ans1>-0.005&&ans1<0.0)
		ans1=0.0;
	if(ans2>-0.005&&ans2<0.0)
		ans2=0.0;
	printf("%.2lf%+.2lfi\n",ans1,ans2); 
	return EXIT_SUCCESS;
}

小坑。须注意 0.0 ~ -0.005 之间四舍五入成 -0.0 的问题,应是 +0.0 。


1052卖个萌

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int get(char out[][10])
{
	char temp;
	int index=0,spdex=0;
	while((temp=getchar())!='\n')
	{
		if(temp=='[')
		{
			index=0;
			while((temp=getchar())!=']')
				out[spdex][index++]=temp;
			out[spdex][index]=0;
			spdex++;
		}
	}
	return spdex;
}
int main(int argc,char **argv)
{
	char shou[15][10]={0};
	char yan[15][10]={0};
	char kou[15][10]={0};
	int shoumax=get(shou);
	int yanmax=get(yan);
	int koumax=get(kou);
	int cnt; 
	scanf("%d",&cnt);
	while(cnt--)
	{
		int t1,t2,t3,t4,t5;
		scanf("%d%d%d%d%d",&t1,&t2,&t3,&t4,&t5);
		if((t1<1||t1>shoumax)||(t2<1||t2>yanmax)||(t3<1||t3>koumax)||(t4<1||t4>yanmax)||(t5<1||t5>shoumax))
		{
			printf("Are you kidding me? @\\/@\n");
			continue;
		}
		printf("%s",shou[t1-1]);
		putchar('(');
		printf("%s",yan[t2-1]);
		printf("%s",kou[t3-1]);
		printf("%s",yan[t4-1]);
		putchar(')');
		printf("%s",shou[t5-1]);
		putchar('\n');
	}
	return EXIT_SUCCESS;
} 

小坑。不知道是不是编码类型不对,在笔记本上运行读取不了貌似是日语的字符。一开始用扫描集读取一行也失败了,失败原因应该就是日语字符读取失败直接退出了。


1053住房空置率

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt,lday; 
	double limit;
	scanf("%d%lf%d",&cnt,&limit,&lday);
	int maybe=0,able=0;
	for(int j=0;j<cnt;j++)
	{
		int cnts,mb=0;
		double input;
		scanf("%d",&cnts);
		for(int i=0;i<cnts;i++)
		{
			scanf("%lf",&input);
			if(input<limit)
				mb++;
		}
		if(mb>(cnts/2))
		{
			if(cnts>lday)
				able++;
			else
			 	maybe++;
		}
	}
	printf("%.1lf%% %.1lf%%\n",(double)maybe/cnt*100.0,(double)able/cnt*100.0);
	return EXIT_SUCCESS;
} 

坑!题目中说的是“ 若观察期超过某给定阈值 ”,并不是低于电量低于某给定的阈值e的天数…

看题的时候想当然了,理解错的话测试点1,2就会过不去。


1054求平均值

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
bool check(char *s)
{
	int i=0;
	if(s[0]=='-')
		i++;
	for(;s[i]&&s[i]!='.';i++)
		if(!isdigit(s[i]))
			return false; 
	if(s[i]=='.')
		for(int j=i+1;s[j];j++)
			if(!isdigit(s[j])||j-i>2)
				return false;  
	double temp=fabs(atof(s));
	if(temp>1000.0)
		return false;
	return true;
}
int main(int argc,char **argv) 
{
	int cnt;
	scanf("%d",&cnt);
	int ins=0;
	double sum=0.0;
	while(cnt--)
	{
		char str[100]={0};
		scanf("%s",str);
		if(check(str))
		{
			ins++;
			sum+=atof(str);
		}
		else
			printf("ERROR: %s is not a legal number\n",str);
	}
	if(ins)
	{
		if(ins==1)
			printf("The average of 1 number is %.2lf\n",sum);
		else
			printf("The average of %d numbers is %.2f\n",ins,sum/ins);
	}
	else
		printf("The average of 0 numbers is Undefined\n");
	return EXIT_SUCCESS; 
}

一上来就想用个sscanf骚操作。。一番操作浪费了一个多小时……

然后老老实实的先判断再 atof(str) 了。。。


1055集体照

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	char name[10];
	int high;
}student;
int compare(const void *a,const void *b)
{
	const student *sa=a;
	const student *sb=b;
	if(sa->high==sb->high)
		return strcmp(sa->name,sb->name);
	else
		return sb->high-sa->high;
}
int main(int argc,char **argv)
{
	int cnt,row;
	scanf("%d%d",&cnt,&row);
	int div=cnt/row,column=cnt%div+div;
	student class[10005];
	for(int i=0;i<cnt;i++)
		scanf("%s%d",class[i].name,&class[i].high);
	qsort(class,cnt,sizeof(student),compare);
	int temp[100005]={0},sum=1,index=0;
	temp[column/2+1]=index++;
	for(int i=1;;i++)
	{
		if(sum>=column)
			break;
		temp[column/2+1-i]=index++;
		sum++;
		if(sum>=column)
			break;
		temp[column/2+1+i]=index++;
		sum++;
	}
	for(int i=1;i<=column;i++)
		printf("%s%c",class[temp[i]].name,i==column?'\n':' ');
	for(int i=row-1;i>=1;i--)
	{
		sum=1;
		temp[div/2+1]=index++;
		int offset=1; 
		while(1)
		{
			if(sum>=div)
				break;
			temp[div/2+1-offset]=index++;
			sum++;
			if(sum>=div)
				break;
			temp[div/2+1+offset]=index++;
			sum++;
			offset++;
		}
		for(int j=1;j<=div;j++)
			printf("%s%c",class[temp[j]].name,j==div?'\n':' ');
	}
	return EXIT_SUCCESS;
} 

从高到低+字典序升序排列后,每一行安排好对应位置的编号,再依次输出即可。


1056组合数的和

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	int cnt; 
	scanf("%d",&cnt);
	int array[10]={0};
	for(int i=0;i<cnt;i++)
		scanf("%d",&array[i]);
	int sum=0;
	for(int i=0;i<cnt;i++)
		for(int j=0;j<cnt;j++)
		{
			if(i==j)
				continue;
			sum+=array[i]*10+array[j];
		}
	printf("%d\n",sum);
	return EXIT_SUCCESS;
} 

so so so so easy。


1057数零壹

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	char str[100005]={0};
	scanf("%[^\n]",str);
	unsigned int sum=0;
	for(int i=0;i<strlen(str);i++)
	{
		if(isalpha(str[i]))
		{
			char ch=tolower(str[i]);
			sum+=ch-'a'+1;
		}
	}
	int zero=0,one=0;
	while(sum)
	{
		if(sum&1)
			one++;
		else
			zero++;
		sum>>=1;
	}
	printf("%d %d\n",zero,one);
	return EXIT_SUCCESS;
} 

so so so so easy。


1058选择题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
typedef struct
{
	int score;
	int anssum;
	int anscnt;
	char ans[6];
}subject;
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt1,cnt2;
	scanf("%d%d",&cnt1,&cnt2);
	subject sp[105];
	for(int i=0;i<cnt2;i++)
	{
		scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);
		for(int j=0;j<sp[i].anscnt;j++)
			scanf("%*c%c",&sp[i].ans[j]);
		sp[i].ans[sp[i].anscnt]=0;
	}
	int book[105]={0},bookmax=0;
	while(cnt1--)
	{
		int sum=0;
		for(int i=0;i<cnt2;i++)
		{
			while(getchar()!='(');
			int xuan;
			char xuanans[6]={0};
			scanf("%d",&xuan);
			for(int j=0;j<xuan;j++)
				scanf("%*c%c",&xuanans[j]);
			getchar();
			if(xuan!=sp[i].anscnt||strcmp(xuanans,sp[i].ans))
			{
				book[i]++;
				if(book[i]>bookmax)
					bookmax=book[i];
				continue;
			}
			sum+=sp[i].score;
		}
		printf("%d\n",sum);
	}
	if(!bookmax)
		printf("Too simple\n");
	else
	{
		printf("%d",bookmax);
		for(int i=0;i<cnt2;i++)
			if(book[i]==bookmax)
				printf(" %d",i+1);
		putchar('\n');
	}
	return EXIT_SUCCESS;
} 

比对学生答案的字符串与标准字符串是否一致即可。


1059C语言竞赛

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
//#define HOST
bool check(int num)
{
	int i;
	for(i=2;i<=(int)sqrt(num);i++)
		if(num%i==0)
			break;
	if(i>(int)sqrt(num))
		return true;
	return false;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,ID[10005]={0}; 
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		int temp;
		scanf("%d",&temp);
		ID[temp]=i;	
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int temp;
		scanf("%d",&temp);
		if(!ID[temp])
			printf("%04d: Are you kidding?\n",temp);
		else if(ID[temp]==-1)
			printf("%04d: Checked\n",temp);
		else
		{
			if(ID[temp]==1)
				printf("%04d: Mystery Award\n",temp);
			else if(check(ID[temp]))
				printf("%04d: Minion\n",temp);
			else
				printf("%04d: Chocolate\n",temp);
			ID[temp]=-1;
		}
	}
	return EXIT_SUCCESS;
}

so easy。


1060爱丁顿数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int compare(const void *a,const void *b)
{
	return *(const int*)b-*(const int*)a;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt; 
	scanf("%d",&cnt);
	int array[100005];
	for(int i=0;i<cnt;i++)
		scanf("%d",&array[i]);
	qsort(array,cnt,sizeof(int),compare);
	int i;
	for(i=0;i<cnt;i++)
		if(array[i]<=i+1)
		{
			printf("%d\n",i);
			break;
		}
	if(i==cnt)
		printf("%d\n",i);
	return EXIT_SUCCESS;
}

递减排序后,遍历查找第一个不符合 array[i] > i+1 的位置输出即可。不要忘记全都满足的情况,测试点3就是此情况。


1061判断题

#include<stdio.h>
#include<stdlib.h>
//#define HOST
_Bool ans[105];
int score[105]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int stnum,tinum;
	scanf("%d%d",&stnum,&tinum);
	for(int i=1;i<=tinum;i++)
		scanf("%d",&score[i]);
	for(int i=1;i<=tinum;i++)
		scanf("%hd",&ans[i]);
	while(stnum--)
	{
		int temp,sum=0;
		for(int i=1;i<=tinum;i++)
		{
			scanf("%d",&temp);
			if(temp==ans[i])
				sum+=score[i];
		}
		printf("%d\n",sum);
	}
	return EXIT_SUCCESS;
}

so so so so easy。


1062最简分数

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
//#define HOST
int gcd(int m,int n)
{
	return (m%n?(gcd(n,m%n)):(n));
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int zi1,zi2,mu1,mu2,aim;
	scanf("%d/%d",&zi1,&mu1);
	scanf("%d/%d",&zi2,&mu2);
	scanf("%d",&aim);
	double qzi1=(zi1*((double)aim/(double)mu1));
	double qzi2=(zi2*((double)aim/(double)mu2));
	if(qzi1>qzi2)
	{double temp=qzi1;qzi1=qzi2;qzi2=temp;}
	zi1=(int)floor(qzi1);
	zi2=(int)ceil(qzi2);
	bool ok=false;
	for(int i=zi1+1;i<zi2;i++)
	{
		int temp=gcd(i,aim);
		if(temp==1)
			if(ok==false)
				printf("%d/%d",i,aim),ok=true;
			else
				printf(" %d/%d",i,aim);
	}
	putchar('\n');
	return EXIT_SUCCESS;
}

小坑。注意是两分数之间,并不包括两分数。


1063计算谱半径

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,a,b;
	double maxp=0.0;
	scanf("%d",&cnt);
	while(cnt--)
	{
		scanf("%d%d",&a,&b);
		double temp=sqrt(a*a+b*b);
		if(temp>maxp)
			maxp=temp;	
	}
	printf("%.2lf\n",maxp);
	return EXIT_SUCCESS;
}

so so so so easy。


1064朋友数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int getsum(int num)
{
	int sum=0;
	while(num)
	{
		sum+=num%10;
		num/=10;
	}
	return sum;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,ind=0;
	scanf("%d",&cnt);
	bool sp[50]={false};
	while(cnt--)
	{
		int temp;
		scanf("%d",&temp);
		temp=getsum(temp);
		if(sp[temp]==false)
		{
			sp[temp]=true;
			ind++;
		}
	}
	printf("%d\n",ind);
	bool ok=false;
	for(int i=0;i<50;i++)
		if(sp[i])
			if(ok==false)
				printf("%d",i),ok=true;
			else
				printf(" %d",i);
	putchar('\n');
	return EXIT_SUCCESS;
} 

so so so so easy。


1065单身狗

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int couple[1000000]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,sum=0;
	scanf("%d",&cnt);
	while(cnt--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		couple[a]=b+1;
		couple[b]=a+1;
	}
	scanf("%d",&cnt);
	while(cnt--)
	{
		int temp;
		scanf("%d",&temp);
		if(couple[temp]>0)
			couple[temp]=0;
		else
			couple[temp]=-1,sum++;
	}
	for(int i=0;i<=99999;i++)
		if(couple[i]>0&&couple[couple[i]-1]==0)
			couple[couple[i]-1]=-1,sum++;
	bool ok=false;
	printf("%d\n",sum);
	for(int i=0;i<=99999;i++)
		if(couple[i]==-1)
			if(ok==false)
				printf("%05d",i),ok=true;
			else
				printf(" %05d",i);
	return EXIT_SUCCESS;
}

微坑。一个单身狗都没有时,单身狗ID行应为空,所以不能在末尾加回车。


1066图像过滤

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int m,n,left,right,replace;
	scanf("%d%d%d%d%d",&m,&n,&left,&right,&replace);
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
		{
			int temp;
			scanf("%d",&temp);
			if(temp>=left&&temp<=right)
				temp=replace;
			printf("%03d%c",temp,j==n-1?'\n':' ');
		}
	return EXIT_SUCCESS;
}

so so so so easy。


1067试密码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt;
	char ans[25]={0};
	scanf("%s",ans);
	scanf("%d",&cnt);
	while(cnt)
	{
		char temp[250]={0};
		scanf("%*c%[^\n]",temp);
		if(temp[0]=='#'&&strlen(temp)==1)
			break;
		if(!strcmp(ans,temp))
		{
			printf("Welcome in\n");
			break;
		}
		printf("Wrong password: %s\n",temp);
		cnt--;
	}
	if(!cnt)
		printf("Account locked\n");
	return EXIT_SUCCESS;
}

坑。有几个需要注意的地方:1.用户尝试输入的密码大小不确定,稍微开大点;2.用户尝试输入的密码会包含空白字符;3.输入只有 ‘ # ’ 的时候退出……不能之判断第一个字符。


1068万绿丛中一点红

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int m,n,limit;
int matrix[1005][1005]={0};
bool check(int i,int j)
{
	const int move[8][2]={{-1,-1},{-1,0},{-1,1},{1,-1},{1,0},{1,1},{0,-1},{0,1}};
	for(int k=0;k<8;k++)
	{
		int tx=move[k][0]+i;
		int ty=move[k][1]+j;
		if(ty<0||ty>=n||tx<0||tx>=m)
			continue;
		if(abs(matrix[tx][ty]-matrix[i][j])<=limit)
			return false;
	}
	return true;
}
bool unique(int num,int x0,int y0)
{
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
		{
			if(i==x0&&j==y0)
				continue;
			if(matrix[i][j]==num)
				return false;
		}
	return true;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	scanf("%d%d%d",&n,&m,&limit);
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			scanf("%d",&matrix[i][j]);
	int sum=0,spi,spj;
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			if(check(i,j)&&unique(matrix[i][j],i,j))
				sum++,spi=i,spj=j;
	if(sum==0)
		printf("Not Exist\n");
	else if(sum>1)
		printf("Not Unique\n");
	else
		printf("(%d, %d): %d\n",spj+1,spi+1,matrix[spi][spj]);
	return EXIT_SUCCESS;
}

没有C++的map容器,又开不了那么大的数组,只能挨个确定唯一性,好在数据并不大。先确认差值符合再确定唯一性会快一些。


1069微博转发抽奖

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
//#define HOST
char queue[1005][25]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,jump,begin,sp=0;
	scanf("%d%d%d",&cnt,&jump,&begin);
	for(int i=1;i<=cnt;i++)
	{
		char temp[25]={0};
		scanf("%s",temp);
		if(i==begin)
		{
			bool go=false;
			for(int j=0;j<sp;j++)
				if(!strcmp(temp,queue[j]))
				{
					begin++;
					go=true;
					break;
				}
			if(go)
				continue;
			begin+=jump;
			printf("%s\n",temp);
			strcpy(queue[sp++],temp);
		}
	}
	if(!sp)
		printf("Keep going...\n");
	return EXIT_SUCCESS;
}

so easy。


1070结绳

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int compare(const void *a,const void *b)
{
	return *(const int*)a-*(const int*)b;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt; 
	scanf("%d",&cnt);
	int array[10005]={0};
	for(int i=1;i<=cnt;i++)
		scanf("%d",&array[i]);
	qsort(array+1,cnt,sizeof(int),compare);
	double lenth=(double)array[1];
	for(int i=2;i<=cnt;i++)
		lenth=lenth/2.0+array[i]/2.0;
	printf("%d\n",(int)lenth);
	return EXIT_SUCCESS;
}

想要取到所有绳子的最大长度,要保证最长的绳子减半的次数最少。排序后计算便是。


1071小赌怡情

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int all,cnt;
	scanf("%d%d",&all,&cnt);
	while(cnt--)
	{
		int a,b,sp,push;
		scanf("%d%d%d%d",&a,&sp,&push,&b);
		if(push>all)
		{
			printf("Not enough tokens.  Total = %d.\n",all);
			continue;
		}
		if((!sp&&a>b)||(sp&&a<b))
		{
			all+=push;
			printf("Win %d!  Total = %d.\n",push,all);
		}
		if((sp&&a>b)||(!sp&&a<b))
		{
			all-=push;
			printf("Lose %d.  Total = %d.\n",push,all);
		}
		if(all<=0)
		{
			printf("Game Over.\n");
			break;
		}
	}
	return EXIT_SUCCESS;
}

so so easy。


1072开学寄语

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,items; 
	scanf("%d%d",&cnt,&items);
	bool item[10000]={false};
	while(items--)
	{
		int temp;
		scanf("%d",&temp);
		item[temp]=true;
	}
	int stu=0,goods=0;
	while(cnt--)
	{
		char name[10]={0};
		int index,book[10]={0},z=0;
		scanf("%s%d",name,&index);
		while(index--)
		{
			int temp;
			scanf("%d",&temp);
			if(item[temp])
			{
				book[z++]=temp;
				goods++;
			}
		}
		if(z)
		{
			stu++;
			printf("%s:",name);
			for(int i=0;i<z;i++)
				printf(" %04d",book[i]);
			putchar('\n');
		}
	}
	printf("%d %d\n",stu,goods);
	return EXIT_SUCCESS;
}

so so easy。


1073多选题常见计分法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define Max(a,b) (a>b?(a):(b))
//#define HOST
typedef struct
{
	int score;
	int anssum;
	int anscnt;
	bool ans[6];
}subject;
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt1,cnt2;
	scanf("%d%d",&cnt1,&cnt2);
	subject sp[105];
	for(int i=0;i<cnt2;i++)
	{
		scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);
		for(int j=0;j<sp[i].anssum;j++)
			sp[i].ans[j]=false;
		for(int j=0;j<sp[i].anscnt;j++)
		{
			char temp;
			scanf("%*c%c",&temp);
			sp[i].ans[temp-'a']=true;
		}
	}
	int book[105][6]={0},bookmax=0;
	while(cnt1--)
	{
		double sum=0.0;
		for(int i=0;i<cnt2;i++)
		{
			while(getchar()!='(');
			int xuan;
			char xuanans[6]={0};
			bool zero=false;
			scanf("%d",&xuan);
			for(int j=0;j<sp[i].anssum;j++)
				if(sp[i].ans[j]==true)
					book[i][j]++;
			for(int j=0;j<xuan;j++)
			{
				char temp;
			 	scanf("%*c%c",&temp);
			 	if(sp[i].ans[temp-'a']==true)
			 		book[i][temp-'a']--;
				else
				{
					zero=true;
					book[i][temp-'a']++;
				}
			}
			getchar();
			if(xuan==sp[i].anscnt&&zero==false)
				sum+=(double)sp[i].score;
			else if(xuan!=sp[i].anscnt&&zero==false)
				sum+=(double)sp[i].score/2.0;
		}
		printf("%.1lf\n",sum);
	}
	for(int i=0;i<cnt2;i++)
		for(int j=0;j<6;j++)
			bookmax=Max(bookmax,book[i][j]);
	if(!bookmax)
		printf("Too simple\n");
	else
	{
		for(int i=0;i<cnt2;i++)
			for(int j=0;j<6;j++)
				if(book[i][j]==bookmax)
					printf("%d %d-%c\n",bookmax,i+1,j+'a');
	}
	return EXIT_SUCCESS;
} 

一道很麻烦的模拟题,由 1058 改编而成。需注意错题不单单是错误的选项,对的选项没选也算错误。


1074宇宙无敌加法器

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	char biao[20]={0};
	char biga[20]={0};
	char bigb[20]={0};
	char ans[50]={0};
	scanf("%s%s%s",biao,biga,bigb);
	int lenbiao=strlen(biao),lena=strlen(biga),lenb=strlen(bigb);
	int index=0;
	while(index<lena||index<lenb)
	{
		int a,b,c;
		if(index>=lena)
			a=0;
		else
			a=biga[lena-index-1]-'0';
		if(index>=lenb)
			b=0;
		else
			b=bigb[lenb-index-1]-'0';
		if(biao[lenbiao-index-1]=='0')
			c=10;
		else
			c=biao[lenbiao-index-1]-'0';
		ans[index]+=a+b;
		if(ans[index]>=c)
		{
			ans[index]-=c;
			ans[index+1]++;
		}
		ans[index++]+='0';
	}
	if(ans[index])
		ans[index]+='0';
	else
		index--;
	while(ans[index]=='0')
		index--;
	for(int i=index;i>=0;i--)
		putchar(ans[i]);
	if(index<0)
		putchar('0'); 
	putchar('\n');
	return EXIT_SUCCESS;
}

小坑。结果是 0 的时候确保输出一个 0 。


1075链表元素分类

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
struct
{
	int data,next;
}node[100005];
int arr[100005][3]={0};
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int st,n,k,ip;
	scanf("%d%d%d",&st,&n,&k);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&ip);
		scanf("%d%d",&node[ip].data,&node[ip].next);
	}
	int point=st,index[3]={0};
	while(point!=-1)
	{
		int data=node[point].data;
		if(data<0)
			arr[index[0]++][0]=point;
		else if(data>=0&&data<=k)
			arr[index[1]++][1]=point;
		else
			arr[index[2]++][2]=point;
		point=node[point].next;
	}
	bool fb=true;
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<index[i];j++)
		{
			if(fb)
			{
				printf("%05d %d ",arr[j][i],node[arr[j][i]].data);
				fb=false;
			}
			else
				printf("%05d\n%05d %d ",arr[j][i],arr[j][i],node[arr[j][i]].data); 
		}
	}
	printf("-1");
	return EXIT_SUCCESS;
}

存储链表后,从链表头开始遍历依次存下 <0、0<=&&<=k、>k 的地址。

按上面的顺序依次输出地址和数据。


1076Wifi密码

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(int argc,char **argv)
{
	int cnt,ins;
	scanf("%d",&cnt);
	int ans[105]={0};
	for(ins=0;ins<cnt;ins++)
	{
		char alpha,is='F';
		while(is!='T')
			scanf("%*c%c-%c",&alpha,&is);
		ans[ins]=alpha-'A'+1;
	}
	for(cnt=0;cnt<ins;cnt++)
		putchar('0'+ans[cnt]);
	putchar('\n');
	return EXIT_SUCCESS;
 } 

so so so easy。


1077互评成绩计算

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Max(a,b) (a<b?(b):(a))
#define Min(a,b) (a<b?(a):(b))
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,maxs;
	scanf("%d%d",&cnt,&maxs);
	for(int i=1;i<=cnt;i++)
	{
		int teacher,max=0,min=1<<30,sum=0,div=cnt-3;
		scanf("%d",&teacher);
		for(int j=1;j<cnt;j++)
		{
			int temp;
			scanf("%d",&temp);
			if(temp<0||temp>maxs)
			{
				div--;
				continue;
			}
			sum+=temp;
			max=Max(max,temp);
			min=Min(min,temp);
		}
		sum-=max;
		sum-=min;
		sum=(int)round(((double)sum/div+(double)teacher)/2.0);
		printf("%d\n",sum);
	}
	return EXIT_SUCCESS;
}

so so so easy。


1078字符串压缩与解压

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<ctype.h>
//#define HOST
void ya(char *str)
{
	int i=0,len=strlen(str),nowlen=0;
	char sp=str[0];
	while(i<len)
	{
		if(sp==str[i])
		{
			nowlen++;
		}
		else
		{
			if(nowlen>1)
				printf("%d",nowlen);
			putchar(sp);
			nowlen=1;
			sp=str[i];
		}
		i++;
	}
	if(nowlen>1)
		printf("%d",nowlen);
	putchar(sp);
	return;
}
void jie(char *str)
{
	int i=0,len=strlen(str);
	char sp,temp;
	while(i<len)
	{
		sp=str[i];
		if(isdigit(sp))
		{
			i++;
			int num=sp-'0';
			while(isdigit(str[i]))
			{
				num=num*10+str[i]-'0';
				i++;
			}
			temp=str[i];
			for(int k=1;k<=num;k++)
				putchar(temp);
		}
		else
			putchar(sp);
		i++;
	}
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	char ch,str[1005]={0};
	ch=getchar();
	scanf("%*c%[^\n]%*c",str);
	if(ch=='C')
		ya(str);
	else
		jie(str);
	putchar('\n');
	return EXIT_SUCCESS;
}

so so easy。上学期ACM校赛的一个签到题。


1079延迟的回文数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
//#define HOST
bool check(char *num)
{
	int left=0,right=strlen(num)-1;
	while(left<right)
	{
		if(num[left]!=num[right])
			return false;
		left++;
		right--;
	}
	return true;
}
char* transform(char *num)
{
	static char spnum[1200]={0};
	int left=0,right=strlen(num)-1,index=0;
	for(int i=right;i>=left;i--)
		spnum[index++]=num[i];
	return spnum;
}
char* Bigadd(char *num1,char *num2)
{
	int len=strlen(num1),i,j;
	static char sumnum[1200]={0};
	memset(sumnum,0,sizeof(sumnum));
	for(i=len;i>0;i--)
	{
		sumnum[i]+=num1[i-1]+num2[i-1]-2*'0';
		if(sumnum[i]>=10)
		{
			sumnum[i-1]++;
			sumnum[i]-=10;
		}
	}
	if(sumnum[0])
		i=1;
	for(j=0;j<=len;j++)
		sumnum[j]+='0';
	sumnum[j]=0;
	//printf(">>>%s %d\n",sumnum,i);
	if(!i)
		return (sumnum+1);
	return sumnum;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt=10;
	char num[1200]={0};
	scanf("%s",num);
	if(check(num))
		printf("%s is a palindromic number.\n",num);
	else
	{	
		while(cnt--)
		{
			char *temp1=transform(num);	
			char *temp2=Bigadd(num,temp1);
			printf("%s + %s = %s\n",num,temp1,temp2);
			strcpy(num,temp2);
			if(check(temp2))
				break;
		}
		if(cnt>-1)
			printf("%s is a palindromic number.\n",num);
		else
			printf("Not found in 10 iterations.\n");
	}
	return EXIT_SUCCESS;
}

大整数高精度运算这块总是写的很麻烦。。重复的翻转总怕出错。


1080MOOC期终成绩

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<math.h>
//#define HOST
typedef struct
{
	char name[25];
	int sum,gp,gm,gf;
}student;
typedef struct
{
	char name[25];
	int gnum;
}studentcopy;
student sp[10005]={0};
studentcopy sp2[10005]={0},sp3[10005]={0};
void getsp(int cnt1,int cnt2,int cnt3)
{
	int ks=0,ls=0;
	for(int i=0;i<cnt1;i++)
	{
		while(strcmp(sp[i].name,sp2[ks].name)>0&&ks<cnt2)
			ks++;
		while(strcmp(sp[i].name,sp3[ls].name)>0&&ls<cnt3)
			ls++;
		sp[i].gm=-1;
		if(strcmp(sp[i].name,sp2[ks].name)==0)
			sp[i].gm=sp2[ks].gnum;
		if(strcmp(sp[i].name,sp3[ls].name)==0)
			sp[i].gf=sp3[ls].gnum;
		if(sp[i].gm>sp[i].gf)
			sp[i].sum=(int)round(0.4*sp[i].gm+0.6*sp[i].gf);
		else
			sp[i].sum=sp[i].gf;
	}
}
int compare(const void *a,const void *b)
{
	const student *sa=(const student*)a;
	const student *sb=(const student*)b;
	if(sa->sum==sb->sum)
		return strcmp(sa->name,sb->name);
	return sb->sum-sa->sum;
}
int comforsp(const void *a,const void *b)
{
	const student *sa=(const student*)a;
	const student *sb=(const student*)b;
	return strcmp(sa->name,sb->name);
}
int comforcopy(const void *a,const void *b)
{
	const studentcopy *sa=(const studentcopy*)a;
	const studentcopy *sb=(const studentcopy*)b;
	return strcmp(sa->name,sb->name);
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt1,cnt2,cnt3;
	scanf("%d%d%d",&cnt1,&cnt2,&cnt3);
	char str[25]={0};
	int index1=0,index2=0,index3=0;
	while(cnt1--)
	{
		int temp;
		scanf("%s%d",sp[index1].name,&temp);
		if(temp>=200)
			sp[index1++].gp=temp;
	}
	while(cnt2--)
	{
		scanf("%s%d",sp2[index2].name,&sp2[index2].gnum);
		index2++;
	}
	while(cnt3--)
	{
		scanf("%s%d",sp3[index3].name,&sp3[index3].gnum);
		index3++;
	}
	qsort(sp,index1,sizeof(student),comforsp);
	qsort(sp2,index2,sizeof(studentcopy),comforcopy);
	qsort(sp3,index3,sizeof(studentcopy),comforcopy);
	getsp(index1,index2,index3);
	qsort(sp,index1,sizeof(student),compare);
	for(int i=0;i<index1;i++)
	{
		if(sp[i].sum>=60)
		{
			printf("%s",sp[i].name);
			printf(" %d",sp[i].gp);
			if(sp[i].gm!=-1)
				printf(" %d",sp[i].gm);
			else
				printf(" -1");
			printf(" %d",sp[i].gf);
			printf(" %d\n",sp[i].sum);
		}
	}
	return EXIT_SUCCESS;
}

坑坑坑坑坑坑坑坑坑坑!!!坑到爆炸!

纯C处理这种大规模可重复数据真的是太麻烦了,直接线性搜索名称最后一个测试点稳稳地超时。

解决方法是多开两个结构体数组用来存储期中、期末考试成绩,以 >=200分 的上机成绩作为参考,排序三个成绩的名称后,按顺序补全作为结果的结构体数组中的期中、期末成绩。

我的想法是找到同名的就把成绩复制过去,没成绩的就是 0 ,最后输出的时候过滤总成绩 <60 分的,期中考试是 0 的输出 -1 就是了。

结果。。最后一个测试点一直是WA??折腾了老一番,怎么改都不对。。

吃了顿饭冷静了下,发现期中考试会有家伙参加考试,然后考了个 0 分的。。。

2333,长教训了,算是自己逻辑不周吧。。

另>>:做出来竟然比用STL库 map 快。


1081检查密码

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
int main(int argc,char **argv)
{
	int cnt,inx;
	scanf("%d",&cnt);
	while(cnt--)
	{
		char str[100]={0};
		scanf("%*c%[^\n]",str);
		if(strlen(str)<6)
		{
			printf("Your password is tai duan le.\n");
			continue;
		}
		int h1=0,h2=0,flag=0;
		for(inx=0;inx<strlen(str);inx++)
		{
			if(!(isalnum(str[inx])||str[inx]=='.'))
			{
				printf("Your password is tai luan le.\n");
				flag=1;break;
			}
			if(isalpha(str[inx]))
				h1=1;
			if(isdigit(str[inx]))
				h2=1;		
		}
		if(flag)
			continue;
		if(h1==0&&h2==1)
			printf("Your password needs zi mu.\n");
		if(h2==0&&h1==1)
			printf("Your password needs shu zi.\n");
		if(h1==1&&h2==1)
			printf("Your password is wan mei.\n");
	}
	return EXIT_SUCCESS;
} 

小坑,密码串可能有空格。


1082射击比赛

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt; 
	scanf("%d",&cnt);
	int bestID,worseID,bs=INT32_MAX,ws=0;
	while(cnt--)
	{
		int temp,x,y;
		scanf("%d%d%d",&temp,&x,&y);
		x=x*x+y*y;
		if(x>ws)
		{
			ws=x;
			worseID=temp;
		}
		if(x<bs)
		{
			bs=x;
			bestID=temp;
		}
	} 
	printf("%04d %04d\n",bestID,worseID); 
	return EXIT_SUCCESS;
} 

so so so so easy。


1083是否存在相等的差

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,arr[10005]={0}; 
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		int temp;
		scanf("%d",&temp);
		arr[abs(temp-i)]++;
	}
	for(int i=10000;i>=0;i--)
		if(arr[i]>1)
			printf("%d %d\n",i,arr[i]);
	return EXIT_SUCCESS;
}

so so so so easy。


1084外观数列

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define HOST
char* tran(char* arr,int len)
{
	static char q[100000]={0};
	memset(q,0,sizeof(q));
	int index=0,isp=0,sp=0,take=arr[0];
	while(index<len)
	{
		if(take==arr[index])
			sp++;
		else
		{
			q[isp++]=take;
			int left=isp,right=isp-1;
			while(sp)
			{
				q[isp++]=sp%10+'0';
				sp/=10;
				right++;
			}
			while(left<right)
			{
				int temp=q[left];
				q[left]=q[right];
				q[right]=temp;
				left++,right--;
			}
			take=arr[index];
			sp=1;
		}
		index++;
	}
	q[isp++]=take;
	int left=isp,right=isp-1;
	while(sp)
	{
		q[isp++]=sp%10+'0';
		sp/=10;
		right++;		
	}
	while(left<right)
	{
		int temp=q[left];
		q[left]=q[right];
		q[right]=temp;
		left++,right--;
	}
	return q;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,k;
	char array[100000]={0};
	scanf("%d%d",&cnt,&k);
	array[0]=cnt+'0';
	for(int i=1;i<k;i++)
	{
		char *point=tran(array,strlen(array)); 
		strcpy(array,point); 
		//printf("%d>>%s\n",i+1,array);
	}
	printf("%s\n",array); 
	return EXIT_SUCCESS;
}

不能小看 N 最大只有 40 ,d=2 N=40 的时候,上万位都打不住。


1085PAT单位排行

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
//#define HOST
typedef struct
{
	char isp;
	double score;
	char name[20];
	int stnum,iscore;
}unit;
unit sp[100005]={0},ans[100005]={0};
int namecompare(const void *a,const void *b)
{
	const unit *sa=(const unit*)a;
	const unit *sb=(const unit*)b;
	return strcmp(sa->name,sb->name);
}
int anscompare(const void *a,const void *b)
{
	const unit *sa=(const unit*)a;
	const unit *sb=(const unit*)b;
	if(sa->iscore==sb->iscore)
	{
		if(sa->stnum==sb->stnum)
			return strcmp(sa->name,sb->name);
		return sa->stnum-sb->stnum;
	}
	return sb->iscore-sa->iscore;
}
void ges(char mode,double *to,double *from)
{
	if(mode=='T')
		*to+=*from*1.5;
	if(mode=='A')
		*to+=*from;
	if(mode=='B')
		*to+=*from/1.5;
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,index=0; 
	scanf("%d",&cnt);
	while(cnt--)
	{
		char ch,temp[10]={0};
		while((ch=getchar())=='\n');
		sp[index].isp=ch;
		scanf("%*s");
		scanf("%lf",&sp[index].score);
		scanf("%s",temp);
		for(int i=0;i<strlen(temp);i++)
			temp[i]=tolower(temp[i]);
		strcpy(sp[index].name,temp);
		index++;
	}
	qsort(sp,index,sizeof(unit),namecompare);
	int ind=0,jnd=0;
	while(jnd<index)
	{
		strcpy(ans[ind].name,sp[jnd].name);
		ans[ind].stnum=1;
		ges(sp[jnd].isp,&ans[ind].score,&sp[jnd].score);
		ind++,jnd++;
		int cut=1;
		while(jnd<index&&(!strcmp(ans[ind-cut].name,sp[jnd].name)))
		{
			ans[ind-cut].stnum++;
			ges(sp[jnd].isp,&ans[ind-cut].score,&sp[jnd].score);
			jnd++;
			if(jnd>=index)
				break;
		}
		ans[ind-1].iscore=(int)floor(ans[ind-1].score);
	}
	qsort(ans,ind,sizeof(unit),anscompare);
	int qt=0,diff=-1,qr=1;
	printf("%d\n",ind);
	for(int i=0;i<ind;i++)
	{
		if(diff!=ans[i].iscore)
		{
			diff=ans[i].iscore;	
			qt+=qr;
			qr=1;
		}
		else
			qr++;
		printf("%d %s %d %d\n",qt,ans[i].name,ans[i].iscore,ans[i].stnum);
	}
	return EXIT_SUCCESS;
}

C语言鸡肋的时候到了,什么辅助数据结构也没有,只能用结构体数组从头构建。处理加权分数的时候最后转成整形变量,后面的排序输出会方便很多,还不会出莫名其妙的错误。


1086就不告诉你

#include<stdio.h>
#include<stdlib.h>
//#define HOST
void print(int num)
{
	while(num%10==0)
		num/=10;
	while(num)
	{
		putchar(num%10+'0');
		num/=10;
	}
	putchar('\n');
	return;
}
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int a,b;
	scanf("%d%d",&a,&b);
	print(a*b); 
	return EXIT_SUCCESS;
}

so so so so easy。


1087有多少不同的值

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,sum=0;
	int book[10400]={false};
	scanf("%d",&cnt);
	for(int i=1;i<=cnt;i++)
	{
		int index=i/2+i/3+i/5;
		if(book[index]==false)
		{
			sum++;
			book[index]=true;
		}
	}
	printf("%d\n",sum); 
	return EXIT_SUCCESS;
}

so so so so easy。


1088三人行

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int my,x,y;
	scanf("%d%d%d",&my,&x,&y);
	for(int jia=99;jia>=10;jia--)
	{
		int yi=jia%10*10+jia/10;
		double bing=(double)yi/(double)y;
		if(fabs(bing-(fabs((double)jia-(double)yi))/x)<1e-6)
		{
			printf("%d",jia);
			if(jia>my)printf(" Cong");
			if(jia==my)printf(" Ping");
			if(jia<my)printf(" Gai");
			if(yi>my)printf(" Cong");
			if(yi==my)printf(" Ping");
			if(yi<my)printf(" Gai");
			if(bing>my)printf(" Cong\n");
			if(bing==my)printf(" Ping\n");
			if(bing<my)printf(" Gai\n");
			return EXIT_SUCCESS;	
		}
	}
	printf("No Solution\n");
	return EXIT_SUCCESS;
}

so easy。


1089狼人杀-简单版

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif
	int cnt,index,book[105]={0},sp[105]={0},ans[105];
	bool get=true;
    scanf("%d",&cnt);
    for(int i=1;i<=cnt;i++)
    	scanf("%d",&book[i]);
    for(int i=1;i<cnt;i++)
    {
    	for(int j=i+1;j<=cnt;j++)
    	{
    		memset(sp,0,sizeof(sp));
    		sp[i]=sp[j]=-1;
    		ans[0]=ans[1]=0;
    		index=0;
    		for(int k=1;k<=cnt;k++)
    		{
    			if((sp[abs(book[k])]==0&&book[k]<0)||(sp[book[k]]==-1&&book[k]>0))
    				ans[index++]=k;
			}
			if(index==2&&(sp[ans[0]]==0&&sp[ans[1]]==-1||sp[ans[1]]==0&&sp[ans[0]]==-1))
			{
				printf("%d %d\n",i,j);
				get=false;
				break;
			}
		}
		if(get==false)
			break;
	}
	if(get)
		printf("No Solution\n");
	return EXIT_SUCCESS;
}

枚举法。先尝试了下枚举撒谎的,发现很难判断是否正确的说出了狼人是哪两个,折腾半天失败告终…555…555…

枚举狼人就很简单了,谁说得和预设狼人不符,那么说的就是假话。再判断下是不是只有一个狼人说了假话就是了。


1090危险品装箱

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int sp[100000][105]={0};
int main(int argc,char **argv)
{
	int cnt1,cnt2;
	scanf("%d%d",&cnt1,&cnt2);
	while(cnt1--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		sp[a][sp[a][0]+1]=b;
		sp[a][0]++;
	}
	while(cnt2--)
	{
		bool book[100000]={false};
		int array[10001]={0};
		int cnt,pass=0;
		scanf("%d",&cnt);
		int num=0;
		while(cnt--)
		{
			scanf("%d",&array[num]);
			for(int index=1;index<=sp[array[num]][0];index++)
				book[sp[array[num]][index]]=true;
			num++;
		}
		for(int i=0;i<num;i++)
			if(book[array[i]])
				pass=1;
		if(pass)
			printf("No\n");
		else
			printf("Yes\n");
	}
	return EXIT_SUCCESS;
}

用二维数组先存储每个编号对应的若干个编号,sp[编号][0]存储总共对应着几个。

用布尔数组统计每个输入的所有不相容编号,之后查询如果有矛盾输出No,否则Yes。

看了看其他人做的,大多用的STL容器,自己对STL库的掌握还需要努力啊……


>>以下5题为2018/12/09PAT参赛时所写


1091N-自守数

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<math.h>
bool check(long long a,int b)
{
	int ts=0;
	if(b/10==0)
		ts=1;
	else if(b/100==0)
		ts=2;
	else
		ts=3;
	int isp=a%(int)pow(10,ts);
	if(isp==b)
		return true;
	return false;
}
int main(int argc,char **argv)
{
	//freopen("test.txt","r",stdin);
	int cnt;
	scanf("%d",&cnt);
	while(cnt--)
	{
		int temp;
		bool jump=false;
		scanf("%d",&temp);
		int i,j;
		for(i=1;i<10;i++)
		{
			long long sp=(long long)i*temp*temp;
			if(check(sp,temp))
			{
				printf("%d %lld\n",i,sp);
				break;
			}
		}
		if(i==10)
			printf("No\n");
	}
	return EXIT_SUCCESS;
}

so easy

1092最好吃的月饼

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int mat[1005]={0};
int max[1005]={0};
int maxmoon=0;
int main(int argc, char *argv[])
{
	int cnt,city,sp=0;
	scanf("%d%d",&cnt,&city);
	int is,js,i;
	for(is=1;is<=city;is++)
	{
		for(js=1;js<=cnt;js++)
		{
			if(is==1)
				scanf("%d",&mat[js]);
			else
			{
				int temp;
				scanf("%d",&temp);
				mat[js]+=temp;
			}
		}
	}
	for(js=1;js<=cnt;js++)
	{
		if(mat[js]>maxmoon)
		{
			maxmoon=mat[js];
			sp=0;
			max[sp++]=js;
		}
		else if(mat[js]==maxmoon)
		{
			max[sp++]=js;
		}
	}
	printf("%d\n",maxmoon);
	for(i=0;i<sp;i++)
		printf("%d%c",max[i],i==sp-1?'\n':' ');
	return 0;
}

统计每个城市的和,取最大值遍历。

1093字符串A+B

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
char str1[1000005]={0};
short int sp[128]={0};
char str2[1000005]={0};
int main(int argc, char *argv[])
{
	//freopen("test.txt","r",stdin);
	scanf("%[^\n]%*c",str1);
	scanf("%[^\n]%*c",str2);
	int i;
	for(i=0;i<strlen(str1);i++)
	{
		int temp=str1[i];
		if(sp[temp]==0)
			sp[temp]=1;
		else if(sp[temp]==1)
			sp[temp]=2;
	}
	for(i=0;i<strlen(str2);i++)
	{
		int temp=str2[i];
		if(sp[temp]==0)
			sp[temp]=1;
		else if(sp[temp]==1)
			sp[temp]=2;
	}
	for(i=0;i<strlen(str1);i++)
	{
		int temp=str1[i];
		if(sp[temp]!=10)
		{
			putchar(str1[i]);
			if(sp[temp]==2)
				sp[temp]=10;
		}
	}
	for(i=0;i<strlen(str2);i++)
	{
		int temp=str2[i];
		if(sp[temp]!=10)
		{
			putchar(str2[i]);
			if(sp[temp]==2)
				sp[temp]=10;
		}
	}
	putchar('\n');
	return 0;
}

考试时写的有点儿乱,循环里的变量都定义在了外面,怕不支持C99。

统计出现两次的字符,这些字符只能打印一次。

1094谷歌的招聘

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<math.h>
int  check(int num)
{
	int i;
	if(num<2)
		return false;
	for(i=2;i<=(int)sqrt(num);i++)
	{
		if(num%i==0)
			return false;
	}
	return true;
}
int getff(int num)
{
	int i=0;
	while(num)
	{
		num/=10;
		i++;
	}
	return i;
}
int main(int argc,char **argv)
{
	//freopen("test.txt","r",stdin);
	int len,cnt;
	scanf("%d%d",&len,&cnt);
	char number[1005]={0};
	scanf("%s",number);
	int i,j;
	for(i=0;i<=len-cnt;i++)
	{
		int temp=0;;
		for(j=0;j<cnt;j++)
		{
			temp*=10;
			temp+=number[i+j]-'0';
		}
		if(check(temp))
		{
			int k;
			for(k=1;k<=cnt-getff(temp);k++)
				printf("0");
			printf("%d\n",temp);
			break;
		}
	}
	if(i==len-cnt+1)
		printf("404\n");
	return EXIT_SUCCESS;
}

挨个取数字判断是否为素数即可。

小坑,不要忘了题目中说的保留前导零。

1095解码PAT准考证

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
typedef struct
{
	char rank;
	int kid;
	int date;
	int mid;
	int score;
}student;
student sp[10005]={0};
int compare(const void *a,const void *b)
{
	const student *sa=(const student*)a;
	const student *sb=(const student*)b;
	if(sa->score==sb->score)
	{
		if(sa->rank==sb->rank)
		{
			if(sa->kid==sb->kid)
			{
				if(sa->date==sb->date)
				{
					return sa->mid-sb->mid;
				}
				return sa->date-sb->date;
			}
			return sa->kid-sb->kid;
		}
		return sa->rank-sb->rank;
	}
	return sb->score-sa->score;
}
int main(int argc, char *argv[])
{
	//freopen("test.txt","r",stdin);
	int N,M;
	scanf("%d%d",&N,&M);
	int i;
	for(i=0;i<N;i++)
	{
		char temp[20]={0};
		scanf("%s",temp);
		sscanf(temp,"%c%3d%6d%d",&sp[i].rank,&sp[i].kid,&sp[i].date,&sp[i].mid);
		scanf("%d",&sp[i].score);
	}
	qsort(sp,N,sizeof(student),compare);
	int j;
	for(j=1;j<=M;j++)
	{
		int number,temp;
		char ctemp;
		scanf("%d",&number);
		switch(number)
		{
			case 1:
				while((ctemp=getchar())==' ');
				printf("Case %d: %d %c\n",j,number,ctemp);
				{
					int i;
					bool isq=false;
					for(i=0;i<N;i++)
					{
						if(sp[i].rank==ctemp)
						{
							printf("%c%03d%06d%03d %d\n",sp[i].rank,sp[i].kid,sp[i].date,sp[i].mid,sp[i].score);
							isq=true;							
						}
					}
					if(isq==false)
						printf("NA\n");
				}
				break;
			case 2:
				scanf("%d",&temp);
				printf("Case %d: %d %03d\n",j,number,temp);
				{
					int i,sumstu=0,sumscore=0;
					for(i=0;i<N;i++)
					{
						if(sp[i].kid==temp)
						{
							sumstu++;
							sumscore+=sp[i].score;
						}
					}
					if(!sumstu)
						printf("NA\n");
					else
						printf("%d %d\n",sumstu,sumscore);
				}
				break;
			case 3:
				scanf("%d",&temp);
				printf("Case %d: %d %06d\n",j,number,temp);
				{
					int i,ksp[1000]={0},max=0;
					bool isha=false;
					for(i=0;i<N;i++)
					{
						if(sp[i].date==temp)
						{
							isha=true;
							ksp[sp[i].kid]++;
							if(ksp[sp[i].kid]>max)
								max=ksp[sp[i].kid];
						}
					}
					for(i=max;i>0;i--)
					{
						int j;
						for(j=101;j<=999;j++)
							if(ksp[j]==i)
							{
								printf("%d %d\n",j,i);
							}
					}
					if(isha==false)
						printf("NA\n");
				}
				break;
			default:
				break;
		}
	}
	return 0;
}

这次考试最麻烦的一道题,要求很多。

每个指令没输出都要输出NA,所有前导零都不可省略。其他的正常来就是了。


END

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值