PTA编程题(11~15)
文章目录
1011 A+B 和 C (15 分)
题意
输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。
思路
- 1.请判断 A+B 是否大于 C。
坑点
- 1.无。
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=10+5;
int num[N];
//int ans[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
double a,b,c;
cin>>a>>b>>c;
if((a+b)>c)
{
num[i]=1;
}
if((a+b)<=c)
{
num[i]=0;
}
}
//cout<<"Case #";
for(int i=1;i<=n;i++)
{
if(num[i]==0)
{
cout<<"Case #"<<i<<": false"<<endl;
}
else
{
cout<<"Case #"<<i<<": true"<<endl;
}
}
return 0;
}
总结
签到题。
1012 数字分类 (20 分)
题意
每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。
对给定的 N 个正整数按题目要求输出。数字间以空格分隔,但行末不得有多余空格。
思路
- 1.按照题目要求进行判断就行了
坑点
- 1.注意输出格式。
代码
#include <iostream>
using namespace std;
int main(){
int sum1 = 0,sum2 = 0,sum4 = 0;//sum和cnt的下角标和A的下标相对应
int cnt2 = 0,cnt3 = 0,cnt4 = 0,cnt5 = 0;
int n;
cin >> n;
int k = -1;//用于交错求和
int num;
int maxn = 0;
while(n--){
cin >> num;
if(num%5==0&&num%2==0){
sum1 += num;
}else if(num%5==1){
k *= -1;//交错求和
cnt2++;
sum2 += k*num;
}else if(num%5==2){
cnt3++;
}else if(num%5==3){
cnt4++;
sum4 += num;
}else if(num%5==4){
if(num>maxn)
maxn = num;
}
}
if(sum1!=0)
{
printf("%d",sum1);
}
else
{
printf("N");
}
if(cnt2!=0)//注意这里,不能写sum2
{
printf(" %d",sum2);
}
else
{
printf(" N");
}
if(cnt3!=0)
{
printf(" %d",cnt3);
}
else
{
printf(" N");
}
if(cnt4!=0)
{
printf(" %.1lf",sum4*1.0/cnt4);
}
else
{
printf(" N");
}
if(maxn!=0)
{
printf(" %d",maxn);
}
else
{
printf(" N");
}
return 0;
}
总结
签到题
1013 数素数 (20 分)
题意
输入在一行中给出 M 和 N,其间以空格分隔。
输出所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
思路
- 1.现任给两个正整数 M≤N≤10的4次方,
坑点
- 1.注意素数的判断
代码
#include<stdio.h>
#include<math.h>
//判断素数
int xu(int x)
{
int flag = 1;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i == 0)
{
flag=0;
}
}
return flag;
}
int main()
{
int m,n;
scanf("%d %d", &m, &n);
int num[10000];
num[0]=2;
int j=1;
for(int i=3;j<10000;i++)
{
if(xu(i))
{
num[j] = i;
j++;
}
}
int k=1;
for(int i=m;i<=n;i++)
{
if(k%10 != 0 && i!=n)
{
printf("%d ", num[i-1]);
}
else if(k==n)
{
printf("%d", num[i-1]);
}
else
{
printf("%d\n", num[i-1]);
}
k = k+1;
}
}
总结
素数的判断,签到题。
1014 福尔摩斯的约会 (20 分)
题意
输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。
在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。
思路
- 1.字符相等,而且字符必须是大写字母,且必须在’A’ ~ ‘G’ 之间。(星期几)
- 2.字符相等,而且字符必须在’A’ ~ ‘N’ 或 ‘0’ ~ '9’之间 (小时)
- 3.字符相等, 而且必须是字母。(分钟)
坑点
- 1.输出格式的注意。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
int i,flag=0;
char s[7][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
char s1[60],s2[60],s3[60],s4[60];
scanf("%s",s1);
scanf("%s",s2);
scanf("%s",s3);
scanf("%s",s4);
for(i=0;(s1[i]!='\0')&&(s2[i]!='\0');i++)
{
if(s1[i]==s2[i]){
if(flag==0&&s1[i]>='A'&&s1[i]<='G')
{
printf("%s",s[s1[i]-'A']);
flag=1;
continue;
}
if(flag==1)
{
if(s1[i]>='0'&&s1[i]<='9')
{
printf(" 0%c",s1[i]);
break;
}
if(s1[i]>='A'&&s1[i]<='N')
{
printf(" %d",s1[i]-'A'+10);
break;
}
}
}
}
for(i=0;(s3[i]!='\0')&&(s4[i]!='\0');i++)
{
if(s3[i]==s4[i]&&s3[i]>='A'&&s3[i]<='z')
{
printf(":%02d",i);
break;
}
}
return 0;
}
总结
自己没有做出来的原因是自己的对于字符串的使用不十分的熟练。
1015 德才论 (25 分)
题意
输入第一行给出 3 个正整数
输出第一行首先给出达到最低分数线的考生人数 M,随后 M 行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
思路
- 1.录取的学生分为4类:
- 2.第一类学生:如果德分>=H&&才分>=H,按照德分才分的总分降序排列录取,若总分相同,则按德分降序,若德分并列,则按准考证号升序排列。
- 3.第二类学生:如果德分>=H&&才分<H,按照德分才分的总分降序排列录取,若总分相同,则按德分降序,若德分并列,则按准考证号升序排列,二类学生排在一类学生之后。
- 4.第三类学生:如果德分<H&&才分<H&&德分>=才分,按照德分才分的总分降序排列录取,若总分相同,则按德分降序,若德分并列,则按准考证号升序排列,三类学生排在二类学生之后。
第四类学生:不满足第一二三类的条件,但满足录取条件的学生。排在第三类学生之后。
坑点
- 1.建议使用sort排序,不然的话可能会超时。
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct student
{
int a;
int d;
int c;
int sum;
}stu[100000],stu1[100000],stu2[100000],stu3[100000],stu4[100000];
int cmp(struct student a, struct student b) {
if (a.sum!=b.sum)
return a.sum>b.sum;
else if (a.d!=b.d)
return a.d>b.d;
else
return a.a<b.a;
}
int main()
{
int N,L,H,i,M=0;
int j=0,k=0,l=0,m=0;
scanf("%d %d %d",&N,&L,&H);
for(i=0;i<N;i++)
{
scanf("%d %d %d",&stu[i].a,&stu[i].d,&stu[i].c);
stu[i].sum=stu[i].d+stu[i].c;
}
for(i=0;i<N;i++)
{
if(stu[i].d>=L&&stu[i].c>=L)
{
M++;
if(stu[i].d>=H&&stu[i].c>=H)
{
stu1[j]=stu[i];
j++;
}
else if(stu[i].d>=H&&stu[i].c<H)
{
stu2[k]=stu[i];
k++;
}
else if(stu[i].d<H&&stu[i].c<H&&stu[i].d>=stu[i].c)
{
stu3[l]=stu[i];
l++;
}
else
{
stu4[m]=stu[i];
m++;
}
}
}
sort(stu1, stu1+j, cmp);
sort(stu2, stu2+k, cmp);
sort(stu3, stu3+l, cmp);
sort(stu4, stu4+m, cmp);
printf("%d\n",M);
for(i=0;i<j;i++)
{
printf("%d %d %d\n",stu1[i].a,stu1[i].d,stu1[i].c);
}
for(i=0;i<k;i++)
{
printf("%d %d %d\n",stu2[i].a,stu2[i].d,stu2[i].c);
}
for(i=0;i<l;i++)
{
printf("%d %d %d\n",stu3[i].a,stu3[i].d,stu3[i].c);
}
for(i=0;i<m;i++)
{
printf("%d %d %d\n",stu4[i].a,stu4[i].d,stu4[i].c);
}
return 0;
}
总结
自己没有审题清楚,没有看清每一个判断条件,也没有想到所以sort排序,不然的话错误的可能性就会变小。