PAT乙级题解31-60
31
#include<bits/stdc++.h>
using namespace std;
char z[11]={'1','0','X','9','8','7','6','5','4','3','2'};//校验位
int weight[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //权重
bool check(string &str){ //检查是否合理的函数
bool ret=true;
int i=0,sum=0;
for(i=0;i<17;i++){
if(str[i]>='0'&&str[i]<='9') //如果是数字累加计算
sum+=(str[i]-'0')*weight[i];
else{
ret=false;break; //如果前17位中出现非数字,则不合理
}
}
if(str[17]!=z[sum%11]) ret=false; //如果校验位出错,也认为不合理
return ret;
}
int main(){
int n,cnt=0;
string str;
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>str;
if(check(str)==false){ //对每一个进行判定,如果不合理则输出
cnt++;
cout<<str<<endl;
}
}
if(cnt==0) cout<<"All passed";
return 0;
}
32
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,maxid,maxsore=-1; //记录做高学校的编号和分数,最高分数初始化为-1
map<int,int> mp; //用于统计不同学校的分数,第一参数为学校编号,第二个为分数
scanf("%d",&n);
for(int i=0;i<n;i++){
int id,score;
scanf("%d%d",&id,&score);
mp[id]+=score; //累加学校的分数
if(mp[id]>maxsore){ //如果有最高分出现,则更新参数
maxid=id; maxsore=mp[id];
}
}
printf("%d %d",maxid,maxsore); //输出结果
return 0;
}
33
#include<bits/stdc++.h>
using namespace std;
int main(){
char ch;
int cnt=0;
map<char,int> mp; //使用map标记是否是坏键,如果是,标记为1(不能标记为0,不然mp[]会默认添加一组键值,初始化为0)
while((ch=getchar())!='\n'){
if(ch>='A'&&ch<='Z') ch=ch-'A'+'a'; //转化为小写统计
mp[ch]=1;
}
while((ch=getchar())!='\n'){
if(ch>='A'&&ch<='Z') //大写需要特判,如果字符键和换挡键有任意一个损坏,则不可输出
if(mp[ch-'A'+'a']==1||mp['+']==1) continue;
if(mp[ch]==1) continue;
else{ //如果没坏则输出结果
putchar(ch);
cnt++;
}
}
if(cnt==0) putchar('\n'); //如果没有输出一个字符,打印空行
return 0;
}
34
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){ //求公约数
return !b?a:gcd(b,a%b);
}
void Print_fen(ll a,ll b){ //打印分数
if(a*b==0){ //特判
printf("%s",b==0?"Inf":"0"); //如果分子是0,打印0,如果分母是0打印Inf
return;
}
bool fu=(a<0&&b>0)||(a>0&&b<0); //确定符号
a=abs(a);b=abs(b); //分子分母取绝对值
ll zheng=a/b; //如果是假分数,先计算整数部分
if(fu) printf("(-"); //如果是负数,打印括号和负号
if(zheng!=0)printf("%lld",zheng); //输出整数部分
if(a%b){ //如果有分数部分
if(zheng!=0) putchar(' '); //如果同时又整数部分和分数部分,打印空格
a%=b; //对a取余,由于通分采用辗转相除法求公约数,所以取余有助于减少循环次数
ll tmp=gcd(a,b); //计算分子分母的公约数
a/=tmp;b/=tmp; //约分并输出结果
printf("%lld/%lld",a,b); //打印结果
}
if(fu) putchar(')'); //如果是负数,补充括号
}
int main(){
ll a,b,c,d;
scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d); //读入两个分数的分子分母
//分别输出四种计算
Print_fen(a,b);printf(" + ");Print_fen(c,d);printf(" = ");Print_fen(a*d+b*c,b*d);putchar('\n');
Print_fen(a,b);printf(" - ");Print_fen(c,d);printf(" = ");Print_fen(a*d-b*c,b*d);putchar('\n');
Print_fen(a,b);printf(" * ");Print_fen(c,d);printf(" = ");Print_fen(a*c,b*d);putchar('\n');
Print_fen(a,b);printf(" / ");Print_fen(c,d);printf(" = ");Print_fen(a*d,b*c);putchar('\n');
return 0;
}
35
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[100],mid[100];
int n,i,j;
cin>>n;
for(i=0;i<n;i++) //读入初始序列
cin>>a[i];
for(i=0;i<n;i++) //读入中间序列
cin>>mid[i];
for(i=0;i<n-1;i++){ //找到中间序列中前部分已排序列的下一个元素 ,并用j记录下标
if(mid[i+1]<mid[i]){
j=i+1;break;
}
}
for(j;j<n;j++) //如果中间序列从j开始往后都与输入序列相同,则说明前面部分的有序序列是插入排序
if(a[j]!=mid[j]) break;
if(j==n){ //如果是插入排序,将j标记的元素插入到已排序列
cout<<"Insertion Sort"<<'\n'; //可以直接用sort从a开始到j标记的下一个元素进行排序,sort排序的参数左闭右开
sort(a,a+i+2);
}
else{ //如果不是插入排序就是归并排序,手动模拟,每一步排序过程,直到与中间序列匹配,再排一次并输出;
cout<<"Merge Sort"<<'\n';
int k=1,flag=1; //用k来表示归并每组的元素个数,初始为1,每次×2;flag标记是否匹配,如果匹配则不在归并排序
while(flag){
flag=0; //初始化标记
for(i=0;i<n;i++) //对中间序列进行匹配,如果不匹配,则将flag置为1,使排序继续进行一个轮次
if(a[i]!=mid[i]) { flag=1; break; }//※※※》注意》 把匹配放在前边以便于检查初始序列,而且,如果匹配得到,循环下部分还能继续一轮排序,最后可以输出
k=k*2; //分组内元素个数乘2
for(i=0;i<n/k;i++)//遍历数组,对每各组进行组归并,元素个数少,直接sort排序就行,
sort(a+i*k,a+(i+1)*k);
sort(a+n/k*k,a+n);//如果不能刚好分为整数组,会有最后一组不满足k个元素,单独对最后剩余的元素排序,n/k表示的分组个数
}
}
for(i=0;i<n;i++){ //最后输出中间序列继续一轮排序的结果
if(i) putchar(' ');
printf("%d",a[i]);
}
return 0;
}
36
#include<bits/stdc++.h>
using namespace std;
void Print_ch(char ch,int n){
for(int i=0;i<n;i++)
putchar(ch);
}
int main(){
int hang,lie;
char ch;
scanf("%d %c",&lie,&ch);
hang=lie%2==0?lie/2:(lie+2)/2; //如果是偶数直接除以2,如果是奇数,四舍五入取整
for(int i=0;i<hang;i++){
if(i==0||i==hang-1) //第一行和最后一行打满字符
Print_ch(ch,lie);
else{ //中间行只开头结尾打印
putchar(ch);
Print_ch(' ',lie-2);
putchar(ch);
}
putchar('\n');
}
return 0;
}
37
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll a,b,c,a1,b1,c1;
ll P,A;
scanf("%lld.%lld.%lld %lld.%lld.%lld",&a,&b,&c,&a1,&b1,&c1);
P=a*17*29+b*29+c; //读入并计算价格
A=a1*17*29+b1*29+c1;
if(A<P){ //判负
swap(A,P); putchar('-');
}
A-=P; //计算最后输出结果
printf("%lld.%lld.%lld",A/(17*29),A/29%17,A%29); //格式化输出
return 0;
}
38
#include<bits/stdc++.h>
using namespace std;
int main(){
int cnt[101]={0}; //统计分数,百分制,数组开到101个即可
int n,score;
scanf("%d",&n); //读入n个成绩并计数
for(int i=0;i<n;i++){
scanf("%d",&score);
cnt[score]++;
}
scanf("%d",&n); //读取查询个数
for(int i=0;i<n;i++){ //查询输出,并控制格式
if(i) putchar(' ');
scanf("%d",&score);
printf("%d",cnt[score]);
}
return 0;
}
39
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1,str2;
map<char,int> have,need; //统计已有的数量和需求的数量
int neednum=0,flag=1; //统计不足时候的需求量,flag表示是否可以购买
cin>>str1>>str2;
for(int i=0;i<str1.size();i++) //分别统计
have[str1[i]]++;
for(int i=0;i<str2.size();i++)
need[str2[i]]++;
for(auto it=need.begin();it!=need.end();it++){ //遍历需求
if(have[it->first]<it->second){
flag=0; neednum+=it->second-have[it->first];//如果某种颜色不足,修改标记,统计不足时候的需求量
}
}
if(flag) printf("Yes %d",str1.size()-str2.size()); //根据标记按照要求输出结果
else printf("No %d",neednum);
return 0;
}
40
#include<bits/stdc++.h>
#define NN 1000000007
using namespace std;
int main(){
int Pcnt=0,Tcnt=0,n=0,cnt=0;
char str[100005]={0},ch;
while((ch=getchar())!='\n'){ //读入字符串,并统计T的个数
if(ch=='T') Tcnt++;
str[n++]=ch;
}
for(int i=0;i<n;i++){ //遍历字符串
switch(str[i]){
case 'P':Pcnt++;break; //统计每一个A左侧P的个数
case 'T':Tcnt--;break; //统计每一个A右侧T的个数
case 'A':cnt+=Pcnt*Tcnt; cnt%=NN;break; //根据排列组合,每一个A可以和左侧的P和右侧的T组合成一个PAT,因此计数相乘并统计累加,然后按照要求取余数
}
}
printf("%d",cnt); //输出结果
return 0;
}
41
#include<bits/stdc++.h>
using namespace std;
typedef struct student{ //学生信息结构体,准考证号和考试座位号
string id;
int num;
}STU;
int main(){
map<int,STU> mp; //建立机试座位号和学生信息的对应关系
int n,tmp;
STU temp;
scanf("%d",&n);
for(int i=0;i<n;i++){ //读入学生信息
cin>>temp.id>>tmp>>temp.num;
mp[tmp]=temp;
}
scanf("%d",&n);
for(int i=0;i<n;i++){ //按照查询输出学生信息
scanf("%d",&tmp);
cout<<mp[tmp].id<<' '<<mp[tmp].num<<endl;
}
return 0;
}
42
#include<bits/stdc++.h>
using namespace std;
int main(){
int maxnum=-1,cnt[26]={0},id;
char ch;
while((ch=getchar())!='\n'){
if(isalpha(ch)==false) continue; //非字母不加入统计
if(ch>='A'&&ch<='Z') ch=ch-'A'+'a'; //转换为小写
id=ch-'a'; //映射到计数表的数组下标
cnt[id]++;
maxnum=cnt[id]>maxnum?cnt[id]:maxnum; //记录最大值
}
for(int i=0;i<26;i++) //从字母序小到大第一个出现次数最多的输出打印
if(cnt[i]==maxnum){
printf("%c %d",'a'+i,maxnum); break;
}
return 0;
}
43
#include<bits/stdc++.h>
using namespace std;
int main(){
int cnt[6]={0},flag=1; //统计每种字符的个数
char ch,Table[]="PATest";
while((ch=getchar())!='\n'){
switch(ch){
case 'P':cnt[0]++;break;
case 'A':cnt[1]++;break;
case 'T':cnt[2]++;break;
case 'e':cnt[3]++;break;
case 's':cnt[4]++;break;
case 't':cnt[5]++;break;
}
}
while(flag){ //当标记为1时循环
flag=0; //初始化为0,如果还有字符剩余,修改标记为1
for(int i=0;i<6;i++){
if(cnt[i]>0){ //输出存在的字符
putchar(Table[i]);
if(cnt[i]--) flag=1; //如果字符剩余不为0,修改标记
}
}
}
return 0;
}
44
#include<bits/stdc++.h>
using namespace std;
string High[]={"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
string Low[]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
void MtoE(string &str){ //火星文转地球数字
int num=0;
if(str.size()<5){ //字符串小于五个的 小于13或者时13的整数倍(整数倍只有高位,没有低位的0)
for(int i=0;i<13;i++) //小于13的
if(Low[i]==str) { num=i; break; }
for(int i=0;i<13;i++) //只有高位的13的整倍数
if(High[i]==str) { num=i*13; break; }
}
else{ //字符串大于5个的,一定是有低位和高位
string high=str.substr(0,3); //取高位
string low=str.substr(4,str.size()-4); //取低位
for(int i=0;i<13;i++){ //计算结果
if(low==Low[i]) num+=i;
if(high==High[i]) num+=13*i;
}
}
printf("%d\n",num);
}
void EtoM(string &str){
int num;
sscanf(str.c_str(),"%d",&num); //字符串转为数字
if(num>=13){ //对于超过13的
cout<<High[num/13]; //输出高位
if(num%13){ putchar(' '); cout<<Low[num%13]<<endl; } //如果不是13整倍数,输出空格和低位
else putchar('\n'); //如果是整倍数,输出换行
}
else //小于13的直接输出
cout<<Low[num%13]<<endl;
}
int main(){
int n;
string temp;
scanf("%d\n",&n);
for(int i=0;i<n;i++){ //读入数据根据第一位判断字符是火星文,数字是地球数
getline(cin,temp);
if(isalpha(temp[0])) MtoE(temp);
else EtoM(temp);
}
return 0;
}
45
解法一
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,max=0;
cin>>n;
vector<int> a(n),b(n),out;
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b.begin(),b.end());
for(int i=0;i<n;i++){
if(a[i]==b[i]&&a[i]>max)
out.push_back(a[i]);
max=a[i]>max?a[i]:max;
}
cout<<out.size()<<endl;
for(int i=0;i<out.size();i++){
if(i) putchar(' ');
cout<<out[i];
}
putchar('\n'); //没有换行则会有格式错误
return 0;
}
解法二
//使用数组的方式存储,时间会节省一半
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,max=0,cnt=0;
scanf("%d",&n);
int* a=(int*)malloc(sizeof(int)*n); //a用于存储原始序列
int* b=(int*)malloc(sizeof(int)*n); //b用于存储排序后的序列
for(int i=0;i<n;i++){ //读取数据
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n); //对b进行排序
for(int i=0;i<n;i++){
if(a[i]==b[i]&&a[i]>max) //遍历原始序列,如果当前元素刚好在排好之后的位置上,且都大于左侧的值(题目中所有数据不相同,所以大于左侧,一定都小于右侧)
a[cnt++]=a[i]; //满足这样的主元要求,则进行保存,这里为了节省空间,直接把需要输出的结果覆盖更新保存在a中
max=a[i]>max?a[i]:max;
}
cout<<cnt<<endl; //输出结果
for(int i=0;i<cnt;i++){
if(i) putchar(' ');
cout<<a[i];
}
putchar('\n'); //没有换行则测试点2会有格式错误(很迷的测试点,所以建议将来所有的输出最后都多一个换行)
return 0;
}
46
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,jia,jia1,yi,yi1;
int jia_cnt=0,yi_cnt=0; //计数器
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&jia,&jia1,&yi,&yi1);
int temp=jia+yi;
if(jia1==temp&&yi1==temp) continue; //如果平局则继续下一轮
else if(jia1==temp) yi_cnt++; //如果甲赢了,乙喝酒
else if(yi1==temp) jia_cnt++; //如果乙赢了,甲喝酒
}
printf("%d %d",jia_cnt,yi_cnt); //输出结果
return 0;
}
47
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,maxid,maxscore=0;
int cnt[1001]={0}; //记录每一队得分数
scanf("%d\n",&n);
for(int i=0;i<n;i++){
int id,num,score;
scanf("%d-%d %d\n",&id,&num,&score); //读入分数
cnt[id]+=score; //统计累加
if(cnt[id]>maxscore){ //更新最高成绩和队伍编号
maxid=id; maxscore=cnt[id];
}
}
printf("%d %d",maxid,maxscore); //输出结果
return 0;
}
48
#include<bits/stdc++.h>
using namespace std;
int main(){
string strA,strB;
cin>>strA>>strB;
reverse(strA.begin(),strA.end()); //将两个字符串逆序
reverse(strB.begin(),strB.end());
int len=strB.size()-strA.size(); //对较短的字符串补充0(此题最终输出的位数为最长的字符串位数)
if(len>0) for(int i=0;i<len;i++) strA+='0';
else for(int i=0;i<-len;i++) strB+='0';
for(int i=0;i<strB.size();i++){
int tmp=0;
if((i+1)%2==1){ //奇数位处理
tmp=strA[i]-'0'+strB[i]-'0';
tmp%=13;
switch(tmp){
case 10:strB[i]='J';break;
case 11:strB[i]='Q';break;
case 12:strB[i]='K';break;
default:strB[i]='0'+tmp;break;
}
}
else{ //处理偶数位
tmp=strB[i]-strA[i];
if(tmp<0) tmp+=10;
strB[i]='0'+tmp;
}
}
reverse(strB.begin(),strB.end()); //结果逆置后输出最后结果
cout<<strB;
return 0;
}
49
#include<bits/stdc++.h>
using namespace std;
int main(){
long double sum=0.0;
long double temp;
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%Lf",&temp); //将数列片段每组一行,统计发现每一个数字的个数规律,累加计算
sum+=temp*(n-(i-1))*i; //把temp写在前边,保证每一步的乘法都是long double运算 (更新了数据,测试点2的数值范围较大)
}
printf("%.2Lf",sum);
return 0;
}
//long double 的读入和输出都要LF才能打到要求的精度
50
#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
//坐标运动的四种模式,按照向下为x轴正向,向右为y轴正向建立坐标系
int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; //0表示坐标向右移动,1表示坐标向下移动,2表示向左移动,3表示向上移动
int main(){
int n,a[maxn]={0};
int hang,lie; //需要输出的行数和列数
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n); //从小到大排序,然后从后往前开始遍历填充螺旋数组
lie=int(sqrt(1.0*n)); //行数和列数一定等于开方数或者分布在开方数的两侧,小的那个一是列,大的那个是行
for(int i=lie;i>=0;i--){ //计算行列数
if(n%i==0){
lie=i,hang=n/i;break;
}
}
//创建一个行数和列数都大一圈的数组空间用于填充数据,used数组用于标记某个位置是否已填充,作为坐标变换的判断边界之一
int num[hang+1][lie+1]={0},used[hang+1][lie+1]={0}; //****两个数组最好手动初始化一下,有时候编译器可能不会自动初始化,容易出错
int x=1,y=1,M=0; //坐标从(1,1)开始,第一步都是向右移动坐标,M代表移动模式
while(n){ //完成n个数据的填充
num[x][y]=a[n]; //填充当前坐标
used[x][y]=1; //更新标记
if(x+dx[M]<1||x+dx[M]>hang||y+dy[M]<1||y+dy[M]>lie||used[x+dx[M]][y+dy[M]])
M=(M+1)%4; //如果x到达最外层或者y到达最外层边界,或者填充碰到了已填充的外层,则变更坐标移动方式
x+=dx[M],y+=dy[M]; //产生下一组坐标
n--; //更新计数器
}
for(int i=1;i<=hang;i++){ //输出结果
for(int j=1;j<=lie;j++){
if(j!=1) putchar(' ');
printf("%d",num[i][j]);
}
putchar('\n');
}
return 0;
}
51
#include<bits/stdc++.h>
using namespace std;
int main(){
double r1,p1,r2,p2;
double a1,b1,a2,b2,a,b;
scanf("%lf %lf %lf %lf",&r1,&p1,&r2,&p2);
a1=r1*cos(p1);b1=r1*sin(p1); //转化成常规的负数表示方法
a2=r2*cos(p2);b2=r2*sin(p2);
a=a1*a2-b1*b2; b=a1*b2+a2*b1; //负数计算
if(a>-0.005&&a<0) a=0; //当a或者b大于-0.005的时候,比如-0.004由于四舍五入,变成-0.00,输出的仍然是负号,但是0应该输出+,需要提前处理
if(b>-0.005&&b<0) b=0;
printf("%.2f%+.2fi",a,b); //+.2f 用于控制显示正负号,并且保留两位小数
return 0;
}
52
#include<bits/stdc++.h>
using namespace std;
const int NUM=5;
void getemoj(vector<string> &emoj){
char ch;
string str;
while(1){
ch=getchar();
if(ch=='\n') return; //读取到换行符,说明该类型的表情已经读取完毕
else if(ch=='[') str=""; //如果读到左括号,清空临时字符串,准备接受一个表情
else if(ch==']') emoj.push_back(str); //如果读到右括号,表明str中已经存储了一个表情,记录到数组中
else str+=ch; //读取的字符串累加(由于表情用括号包起来,所以多余的会被清空,这里可能直接掠过其他字符)
}
}
int main(){
vector<string> emojs[3];
for(int i=0;i<3;i++) getemoj(emojs[i]); //获取表情
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int a,b,c,d,e;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);//读入数据,并判断数据的合法性
if(max(a,e)>emojs[0].size()||max(b,d)>emojs[1].size()||c>emojs[2].size()||min(a,e)<1||min(b,d)<1||c<1)
printf("Are you kidding me? @\\/@");
else //输出结果
cout<<emojs[0][a-1]<<'('<<emojs[1][b-1]<<emojs[2][c-1]<<emojs[1][d-1]<<')'<<emojs[0][e-1];
putchar('\n');
}
return 0;
}
53
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
#define low(a,b) ((a)-(b)<(-eps)) //浮点数比较,如果a-b的值小于某一个很小的负值,说明a在b的左侧
int N,D;
double E;
int IS_Empty(){
int ret=0,k,cnt=0; //cnt用于统计用电量低于阈值的天数
double e;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%lf",&e);
if(low(e,E)) cnt++; //满足条件的进行统计
}
if(cnt*2>k) ret=1; //如果满足可能空置返回1
if(k>D&&ret==1) ret=2; //如果满足空置条件返回2
return ret;
}
int main(){
int cnt1=0,cnt2=0;
scanf("%d %lf %d",&N,&E,&D);
for(int i=0;i<N;i++){
int tag=IS_Empty();
if(tag==2) cnt2++; //根据返回值进行判定
else if(tag==1) cnt1++;
}
printf("%.1f%% %.1f%%",(100.0*cnt1)/N,(100.0*cnt2)/N); //输出结果,%的输出要注意语法
return 0;
}
54
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,cnt=0;
double temp,sum=0.0;
char a[50],b[50];
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%s",a); //每次读取一个字符串到a
sscanf(a,"%lf",&temp); //a转化成数字
sprintf(b,"%.2f",temp); //数字转化成字符串,这里转化的字符串一定要保留成2位小数,才会是合法的字符
int tag=0,len=strlen(a); //a为原始字符串,所以比较以a长度为准,比如7.123小数位数超过要求
for(int i=0;i<len&&tag==0;i++) //比较a和b如果相同,说明这个字符串是合法格式的数字,否则不合要求,tag改为1
if(a[i]!=b[i]) tag=1;
if(tag||temp<-1000||temp>1000) //如果格式不合法,或者数据范围不合理,输出错误信息
printf("ERROR: %s is not a legal number\n",a);
else{
sum+=temp; //合法输入进行统计
cnt++;
}
}
if(cnt==1) //分类进行输出
printf("The average of 1 number is %.2f\n",sum);
else if(cnt!=0)
printf("The average of %d numbers is %.2f\n",cnt,sum/cnt);
else
printf("The average of 0 numbers is Undefined");
return 0;
}
55
#include<bits/stdc++.h>
using namespace std;
typedef struct student{
string name;
int high;
}STU;
bool cmp(STU &a,STU &b){
if(a.high!=b.high) return a.high>b.high;
else return a.name<b.name;
}
int main(){
int N,K;
scanf("%d %d",&N,&K);
STU DATA[N];
for(int i=0;i<N;i++) //读入数据
cin>>DATA[i].name>>DATA[i].high;
sort(DATA,DATA+N,cmp); //按照身高从高到低排序,同身高按照名字字典序排列
vector< vector<string> > out(K); //输出的二维数组
int num=N/K; //计算每一排人数
for(int i=0;i<K;i++){ //初始化每一排数组大小
if(i==0) out[i].resize(N-(K-1)*num);//如果有剩余放在最后一排
else out[i].resize(num);
}
num=0;
for(int i=0;i<K;i++){
int cnt=out[i].size(); //获取每一排人数
int mid=cnt/2; //计算中间位置,题目中从1开始,如果这里用下标表示,则不用+1
out[i][mid]=DATA[num++].name; //放置中间位置
int l=mid,r=mid; //左右两侧的位置指针,初始化为中间位置
while(1){
l--,r++;
if(l>=0) out[i][l]=DATA[num++].name; //在合法范围内放置,先放置摄影师视角的左侧
if(r<cnt)out[i][r]=DATA[num++].name; //再放置摄影师视角的右侧
if(l<0) break; //显然左侧的人数大于等于右侧(以摄影师视角的左右侧),所以只判定左侧到达边界说明这一排站位结束
}
}
for(int i=0;i<K;i++){ //输出结果并控制格式
for(int j=0;j<out[i].size();j++){
if(j) putchar(' ');
cout<<out[i][j];
}
putchar('\n');
}
return 0;
}
56
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,num[10]={0},sum=0;
scanf("%d",&N);
for(int i=0;i<N;i++) //读入数据
scanf("%d",&num[i]);
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){ //每两个数字进行组合
sum+=num[i]*10+num[j]; //ab 和 ba两个组合形式都进行累加
sum+=num[j]*10+num[i];
}
}
printf("%d",sum);
return 0;
}
57
#include<bits/stdc++.h>
using namespace std;
int main(){
int num=0,cnt1=0,cnt0=0;
char ch;
while((ch=getchar())!='\n'){ //累加每一个字母的数值
if(ch>='a'&&ch<='z') num+=ch-'a'+1;
else if(ch>='A'&&ch<='Z') num+=ch-'A'+1;
}
if(num) //当有字符串存在时,进行进制转换
do{
if(num%2==0) cnt0++; //如果有一位是0
else cnt1++; //如果有一位是1
num/=2;
}while(num);
printf("%d %d",cnt0,cnt1); //输出统计出的0和1的个数
return 0;
}
58
#include<bits/stdc++.h>
using namespace std;
typedef struct question{ //问题结构体,采用一个五位整数记录正确答案,比如选a则是10000,ab为11000,ac为10100
int score,ans,cnt=0; //因为没有不合理答案,所以可以统一认为所有的都是五个选项,没有的那一位就是0,不妨碍判定
}QU;
int main(){
int N,M,maxerror=0;
scanf("%d %d\n",&N,&M); //使用scanf的格式参数控制过滤多余的字符
vector<QU> v(M+1);
for(int i=1;i<=M;i++){
int score,num,right;
char ch;
scanf("%d %d %d",&score,&num,&right);
v[i].score=score,v[i].ans=0; //初始化并读入每一个题目的成绩和答案
while((ch=getchar())!='\n'){
switch(ch){ //ans累加每一个答案的权值,构成一个整数代表正确答案
case 'a':v[i].ans+=10000;break;
case 'b':v[i].ans+=1000;break;
case 'c':v[i].ans+=100;break;
case 'd':v[i].ans+=10;break;
case 'e':v[i].ans+=1;break;
}
}
}
for(int i=0;i<N;i++){
int sum=0,id=0,score=0; //用于比对答案的sum,题目标号计数器id,当前学生成绩累加score
char ch;
while((ch=getchar())!='\n'){ //对于每一组学生回答的答案,进行判定
switch(ch){ //先处理每一个答案位
case 'a':sum+=10000;break;
case 'b':sum+=1000;break;
case 'c':sum+=100;break;
case 'd':sum+=10;break;
case 'e':sum+=1;break;
case '(':sum=0;break; //遇到左括号说明到了一个新题目
case ')':{
id++; //如果遇到右括号,说明当前题目已经读取完毕,题号计数器累加
if(sum==v[id].ans) score+=v[id].score; //比对答案,累计分数
else{ v[id].cnt++; maxerror=max(maxerror,v[id].cnt);} //如果错误累计该题目的错误人数,并获取最大错误数量
}
}
}
printf("%d\n",score); //输出当前学生的得分
}
if(maxerror==0) printf("Too simple");//如果没有人错
else{
printf("%d",maxerror); //按照要求输出最后的结果
for(int i=1;i<=M;i++)
if(v[i].cnt==maxerror) printf(" %d",i);
}
return 0;
}
59
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10010
bool Prime[MAXN];
int Rank[MAXN]={0}; //用于记录学生排名
void getPrime(){ //筛选法获取素数表
fill(Prime,Prime+MAXN,true);
Prime[0]=Prime[1]=false;
for(int i=2;i<MAXN;i++){
if(Prime[i]){
for(int j=i+i;j<sqrt(1.0*MAXN);j+=i)
Prime[j]=false;
}
}
}
int main(){
getPrime();
int N,id;
scanf("%d",&N);
for(int i=1;i<=N;i++){ //读取id并记录排名,这里*10是为了保留出个位作为是否领奖的标记,初始为0,领取后置为1
scanf("%d",&id);
Rank[id]=10*i;
}
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&id);
printf("%04d: ",id);
if(Rank[id]==0) printf("Are you kidding?"); //如果不在列表中出现过
else{
int rank=Rank[id]/10,check=Rank[id]%10; //获取排名和发放标记
if(check==0){ //如果未发放过
Rank[id]++; //更新发放标记
if(rank==1) printf("Mystery Award"); //根据排名输出奖品类型
else if(Prime[rank]) printf("Minion");
else printf("Chocolate");
}
else printf("Checked"); //如果发放过,按要求输出
}
putchar('\n'); //结果换行
}
return 0;
}
60
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++) scanf("%d",&a[i]); //读入数据
sort(a,a+n,cmp); //从大到小排序
int ans=0;
while(ans<n&&a[ans]>ans+1) ans++; //在满足下标的范围内,统计满足的天数,为保证ans下标有效性,ans<n判定放在前边
printf("%d",ans); //由于从大到小排列,所以ans下标总共有ans+1天,所以如果有ans+1天的骑行超过ans+1,就统计计数
return 0;
}
Comments | NOTHING