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

题目集地址

报名了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
#include
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
#include
#include
int main(int argc,char **argv)
{
	char* bignumber=(char*)calloc(105,sizeof(char));
	scanf("%s",bignumber);
	int sum=0;
	for(int i=0;i=0;i--)
		printf("%s%c",sp[list[i]],i==0?'\n':' ');
	return EXIT_SUCCESS;
} 

so so easy。


1003我要通过!

#include
#include
#include
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

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

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


1004成绩排名

#include
#include
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

so so easy。


1005继续(3n+1)猜想

#include
#include
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
#include
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
#include
#include
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
#include
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
#include
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=0;ind--)
	{
		for(ins=book[ind][0];ins

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


1010一元多项式求导

#include
#include
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
#include
#include
#define max(a,b) (ab?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
#include
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
#include
#include
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
#include
#include
#include
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
#include
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=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=c&&b

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


1016部分A+B

#include
#include
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
#include
#include
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;imod)
		{
			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
#include
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
#include
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
#include
//#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->sisi)
		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

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


1021个位数统计

#include
#include
#include
int main(int argc,char *argv[])
{
	char bignumber[1005];
	int book[10]={0};
	scanf("%s",bignumber);
	for(int i=0;i

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


1022D进制的A+B

#include
#include
#include
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
#include
#include
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
#include
#include
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

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


1025反转链表

#include
#include
//#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

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


1026程序运行时间

#include
#include
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
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
#include
#include
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
#include
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
#include
#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

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


1031查验身份证

#include
#include
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
#include
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]

so easy。


1033旧键盘打字

#include 
#include 
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
#include
#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
#include
//#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;ilen?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

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


1036跟奥巴马一起编程

#include
#include
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
#include
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
#include
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
#include
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
#include
#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
#include
#include
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
#include
#include
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
#include
#include
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
#include
#include
#include
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
#include
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int sp[100001][3],dp[100001];
	for(int i=0;ileftmax)
			leftmax=sp[i][0];
	}
	int rightmin=1<<30;
	for(int i=cnt-1;i>=0;i--)
	{
		sp[i][2]=rightmin;
		if(sp[i][0]=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

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

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

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


1046划拳

#include
#include
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
#include
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
#include
#include
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
#include
int main(int argc,char **argv)
{
	int cnt;
	scanf("%d",&cnt);
	int i;
	double sum=0.0,temp;
	for(i=1;i<=cnt;i++)
	{
		scanf("%lf",&temp);
		sum+=(double)(cnt-i+1)*(double)(i)*temp;
	}
	printf("%.2f\n",sum);
	return EXIT_SUCCESS;
} 

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


1050螺旋矩阵

#include
#include
#include
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的大小范围,须动态申请内存空间。

PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)_第1张图片


1051复数乘法

#include
#include
#include
//#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
#include
#include
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
#include
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(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
#include
#include
#include
#include
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
#include
#include
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=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
#include
int main(int argc,char **argv)
{
	int cnt; 
	scanf("%d",&cnt);
	int array[10]={0};
	for(int i=0;i

so so so so easy。


1057数零壹

#include
#include
#include
#include
int main(int argc,char **argv)
{
	char str[100005]={0};
	scanf("%[^\n]",str);
	unsigned int sum=0;
	for(int i=0;i>=1;
	}
	printf("%d %d\n",zero,one);
	return EXIT_SUCCESS;
} 

so so so so easy。


1058选择题

#include
#include
#include
//#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;ibookmax)
					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

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


1059C语言竞赛

#include
#include
#include
#include
//#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
#include
#include
//#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

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


1061判断题

#include
#include
//#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
#include
#include
#include
//#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

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


1063计算谱半径

#include
#include
#include
//#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
#include
#include
//#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
#include
#include
//#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
#include
//#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=left&&temp<=right)
				temp=replace;
			printf("%03d%c",temp,j==n-1?'\n':' ');
		}
	return EXIT_SUCCESS;
}

so so so so easy。


1067试密码

#include
#include
#include
//#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
#include
#include
//#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;i1)
		printf("Not Unique\n");
	else
		printf("(%d, %d): %d\n",spj+1,spi+1,matrix[spi][spj]);
	return EXIT_SUCCESS;
}

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


1069微博转发抽奖

#include
#include
#include
#include
//#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

so easy。


1070结绳

#include
#include
//#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
#include
//#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&&ab)||(!sp&&a

so so easy。


1072开学寄语

#include
#include
#include
//#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

so so easy。


1073多选题常见计分法

#include
#include
#include
#include
#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

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


1074宇宙无敌加法器

#include
#include
#include
//#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)
			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
#include
#include
//#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=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

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

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


1076Wifi密码

#include
#include
#include
int main(int argc,char **argv)
{
	int cnt,ins;
	scanf("%d",&cnt);
	int ans[105]={0};
	for(ins=0;ins

so so so easy。


1077互评成绩计算

#include
#include
#include
#define Max(a,b) (amaxs)
			{
				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
#include
#include
#include
#include
//#define HOST
void ya(char *str)
{
	int i=0,len=strlen(str),nowlen=0;
	char sp=str[0];
	while(i1)
				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

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


1079延迟的回文数

#include
#include
#include
#include
//#define HOST
bool check(char *num)
{
	int left=0,right=strlen(num)-1;
	while(left=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
#include
#include
#include
#include
//#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;i0&&ks0&&lssp[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=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 快。

PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)_第2张图片


1081检查密码

#include
#include
#include
#include
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

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


1082射击比赛

#include
#include
#include
#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

so so so so easy。


1083是否存在相等的差

#include
#include
//#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
#include
#include
//#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>%s\n",i+1,array);
	}
	printf("%s\n",array); 
	return EXIT_SUCCESS;
}

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


1085PAT单位排行

#include
#include
#include
#include
#include
//#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=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

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

PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)_第3张图片


1086就不告诉你

#include
#include
//#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
#include
#include
//#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
#include
#include
//#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(jiamy)printf(" Cong");
			if(yi==my)printf(" Ping");
			if(yimy)printf(" Cong\n");
			if(bing==my)printf(" Ping\n");
			if(bing

so easy。


1089狼人杀-简单版

#include
#include
#include
#include
//#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;i0))
    				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
#include
#include
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

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

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

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

PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)_第4张图片


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


1091N-自守数

#include
#include
#include
#include
#include
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
#include
#include
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

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

1093字符串A+B

#include
#include
#include
#include
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

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

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

1094谷歌的招聘

#include
#include
#include
#include
#include
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

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

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

1095解码PAT准考证

#include
#include
#include
#include
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;imax)
								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

 

 

 

你可能感兴趣的:(PAT,PAT)