PAT乙级的代码,加上注释之后直接汇总在一篇博客中,以供参考。
目录
PAT乙级
1
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,cnt=0;
cin>>n;
while(n!=1){
if(n%2==0) n/=2;
else n=(3*n+1)/2;
cnt++;
}
cout<<cnt;
return 0;
}
2
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
string num[]={"ling","yi","er","san","si",
"wu","liu","qi","ba","jiu"};
string str;
int ans=0;
cin>>str;
for(int i=0;i<str.size();i++)
ans+=str[i]-'0';
if(ans>=100)
cout<<num[ans/100]<<' '<<num[ans%100/10]<<' '<<num[ans%10];
else if(ans>=10)
cout<<num[ans/10]<<' '<<num[ans%10];
else
cout<<num[ans];
return 0;
}
3
#include<bits/stdc++.h>
using namespace std;
bool Check(string &str){ //判断函数
bool ret=true; //统一返回
int af,am,ab,Pindex,Tindex;
af=am=ab=0; //af、am、ab分别表示P之前 PT之间 T之后的a的个数
Pindex=Tindex=-1; //P和T的下标,初始化为-1,用于判定只出现一次
for(int i=0;i<str.length();i++){
switch(str[i]){
case 'P': if(Pindex==-1) Pindex=i; //如果是P判定是不是第一次出现,如果是保留下标
else ret=false; break;
case 'A': if(Pindex==-1&&Tindex==-1) af++;//如果PT都未出现,这个a出现再P之前
else if(Pindex!=-1&&Tindex==-1) am++;//如果P出现T未出现,这个a出现在P之后
else if(Pindex!=-1&&Tindex!=-1) ab++; break;//如果PT都已出现,这个a出现在T之后
case 'T': if(Tindex==-1) Tindex=i; //判断T是不是第一次出现,如果是保留下标
else ret=false; break;
default: ret=false; break; //如果有其他字符
}
}
if((af*am!=ab)||am==0) ret=false; //必须满足数量关系,由题目第三个条件可知,当中间增加一个A时,T后边线性增加一个P之前的字符串
if(Pindex>Tindex) ret=false; //保证PT出现的先后顺序
return ret;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
cin>>n; getchar();
for(int i=0;i<n;i++){
string str;
getline(cin,str);
if(Check(str)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
4
#include<bits/stdc++.h>
using namespace std;
typedef struct Student{
string name,id;
int scores;
}STU;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
STU stu,max,min; //stu用于临时读取一个数据,max和min分别存放需要输出的内容
max.scores=-1;min.scores=105;
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>stu.name>>stu.id>>stu.scores;
if(stu.scores>max.scores) max=stu;
if(stu.scores<min.scores) min=stu;
}
cout<<max.name<<' '<<max.id<<endl;
cout<<min.name<<' '<<min.id<<endl;
return 0;
}
5
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int num[101]={0}; //用数组对100以内的每一个数字进行标记,初始化为0,其中0号位置用于存放数据个数
scanf("%d",&num[0]); //入读数据个数
for(int i=0;i<num[0];i++){ //循环读入
int temp;
scanf("%d",&temp);
if(num[temp]==0) num[temp]=1; //如果是第一次出现这个数,并且未被覆盖,赋值为1,如果被覆盖过即为2
while(temp!=1){ //3n+1猜想验证
if(temp%2==0) temp/=2;
else temp=(3*temp+1)/2;
if(temp<100) num[temp]=2; //验证过程中,如果这个数字在100以内,则修改标记为2表示被其他数覆盖
}
}
for(int flag=0,i=100;i>0;i--){ //flag用于控制格式,第一个不输出空格,后边的先输出空格再输出数字
if(num[i]==1) { //如果这个数的标记为1,表示出现在数组中,并且不被其他覆盖,从大到小输出
if(flag++) putchar(' ');
cout<<i;
}
}
return 0;
}
6
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,bcnt,scnt;
bcnt=scnt=0;
cin>>n;
bcnt=n/100; scnt=n%100/10; n=n%10; //分解百位 十位和个位的数字 并按照要求输出
for(int i=0;i<bcnt;i++) putchar('B');
for(int i=0;i<scnt;i++) putchar('S');
for(int i=1;i<=n;i++) putchar('0'+i);
return 0;
}
7
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
bool P[MAXN]; //建立素数表
void getPrime(){
fill(P,P+MAXN,true);
P[0]=P[1]=false;
for(int i=2;i<MAXN;i++){
if(P[i])
for(int j=i+i;j<MAXN;j+=i)
P[j]=false;
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
getPrime();
int cnt=0,n;
cin>>n;
for(int i=0;i+2<=n;i++){ //遍历并计数
if(P[i]==true&&P[i+2]==true) //如果当前的数字和向后相隔两个间距的数字都是素数,进行计数
cnt++;
}
cout<<cnt;
return 0;
}
8
#include<bits/stdc++.h>
using namespace std;
//创建函数对数组某个区间内的元素进行逆置
void Reverse(int a[],int low,int high){
while(low<high){
int temp=a[low];
a[low]=a[high];
a[high]=temp;
low++;high--;
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,m;
cin>>n>>m; //n为数组大小,m为向右循环移动的元素个数
m%=n; //把m对n取余数,因为对数组整个长度进行循环移位,等同于不移动
int *a=(int *)malloc(sizeof(int)*n);
for(int i=0;i<n;i++)
cin>>a[i];
Reverse(a,0,n-1); //先整体逆置
Reverse(a,0,m-1); //对左边的m个进行逆置
Reverse(a,m,n-1); //对右边的剩余部分进行逆置
for(int i=0;i<n;i++){ //输出移位后的结果
if(i) putchar(' ');
cout<<a[i];
}
return 0;
}
9
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
vector<string> v;
string str;
while(cin>>str){ //读入每一个单词
v.push_back(str);
}
for(int i=v.size()-1;i>=0;i--){ //倒序输出
if(i!=v.size()-1) putchar(' ');
cout<<v[i];
}
return 0;
}
10
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int a, b, flag = 0; //a和b分别记录多项式的系数和指数,可能出现负指数
while (scanf("%d %d",&a,&b)!=EOF) { //读取测试文件直到末尾
if (b != 0) { //指数为0的即为常数项,常数项求导后为0
if (flag == 1) putchar(' '); //第一个对儿输出不需要多余的空格
printf("%d %d",a*b,b-1); //输出求导后的系数和指数
flag = 1; //修改标记,已经读入第一对儿数据
}
}
if (flag == 0) printf("0 0"); //如果没有读入过任何一个非常数项,则求导后的为0,按照格式输出
return 0;
}
11
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
long long a,b,c;
cin>>n;
for(int i=1;i<=n;i++){
cout<<"Case #"<<i<<": "; //输出头部字符
cin>>a>>b>>c;
if(a+b>c) printf("true\n"); //判断并输出
else printf("false\n");
}
return 0;
}
12
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int tag[6]={0}, answer[6]={0}; //tag用于记录每一种的个数,answer用于存放最终结果
cin>>answer[0];
for(int i=0;i<answer[0];i++){
int temp;
cin>>temp;
switch(temp%5){
case 0: if(temp%2==0){ //被5整除的情况
tag[1]++; answer[1]+=temp;
} break;
case 1: tag[2]++; //余数为1
if(tag[2]%2) answer[2]+=temp; //根据出现的次数确定系数正负
else answer[2]-=temp; break;
case 2: tag[3]++; answer[3]++; break; //余数为2
case 3: tag[4]++; answer[4]+=temp; break; //余数为3
case 4: if(temp>answer[5]){ //余数为4
tag[5]++; answer[5]=temp;
} break;
default: break;
}
}
for(int i=1;i<=5;i++){
if(i!=1) putchar(' '); //格式控制
if(tag[i]==0){ //如果不存在
putchar('N'); continue;
}
if(i==4) printf("%.1f",1.0*answer[i]/tag[4]); //第四个特殊处理
else printf("%d",answer[i]); //输出结果
}
return 0;
}
13
#include<bits/stdc++.h>
using namespace std;
#define MAXN 500000 //10000个素数,所以素数表要更大一些
bool Prime[MAXN];
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
fill(Prime,Prime+MAXN,true); //构建素数表
for(int i=2;i<MAXN;i++){
if(Prime[i])
for(int j=2*i;j<MAXN;j+=i)
Prime[j]=false;
}
int m,n,cnt=0,flag=0; //cnt用于统计第几个素数,flag用于控制格式
cin>>m>>n;
for(int i=2;cnt<n;i++){ //按照要求输出结果
if(Prime[i]){
cnt++;
if(cnt>m){
flag++;putchar(flag%10?' ':'\n');
}
if(cnt>=m) cout<<i;
}
}
return 0;
}
14
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
string str1,str2,str3,str4;
string WEEK[]={"","MON","TUE","WED","THU","FRI","SAT","SUN"};
cin>>str1>>str2>>str3>>str4;
int DAY=-1,H=-1,M=-1,i;
int len1=min(str1.size(),str2.size());
int len2=min(str3.size(),str3.size());
for(i=0;i<len1;i++){ //找到第一个代表日子的字符
if(str1[i]==str2[i]&&str1[i]>='A'&&str1[i]<='G'){ //第一个相同的代表A~G(一周七天)的字母
DAY=str1[i]-'A'+1; break;
}
}
for(i++;i<len1;i++){ //继而往后找到第二个表示小时的字符
if(str1[i]==str2[i]){ //0~9和A~N
if(str1[i]>='0'&&str1[i]<='9') {H=str1[i]-'0';break;}
if(str1[i]>='A'&&str1[i]<='N') {H=str1[i]-'A'+10;break;}
}
}
for(i=0;i<len2;i++){ //找到代表分钟数的字符
if(str3[i]==str4[i]&&isalpha(str3[i])) {M=i; break;}
}
cout<<WEEK[DAY]; //输出结果
printf(" %02d:%02d",H,M);
return 0;
}
15
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int id,D,C,sum,rank;
}STU;
bool cmp(const STU&a,const STU&b){
if(a.rank!=b.rank) return a.rank<b.rank; //先按照分类顺序排
else if(a.sum!=b.sum) return a.sum>b.sum; //同类型人 总分从高到低排
else if(a.D!=b.D) return a.D>b.D; //如果总分相同,按照德分从高到低排
else return a.id<b.id;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,L,H;
STU temp;
vector<STU> v;
cin>>n>>L>>H;
for(int i=0;i<n;i++){ //读入数据
cin>>temp.id>>temp.D>>temp.C;
if(temp.D<L||temp.C<L) continue; //如果有任何一个分数低于最低要求,视为废弃数据
if(temp.D>=H&&temp.C>=H) temp.rank=1; //如果德才都超过最高线,划定为第一类人
else if(temp.D>=H) temp.rank=2; //如果只有德过最高线,划定为第二类人
else if(temp.D>=temp.C) temp.rank=3; //如果都不过最高线,但是德分高于才分,划定为第三类人
else temp.rank=4; //剩余的为第四类人
temp.sum=temp.D+temp.C;
v.push_back(temp); //计算总分并加入排序
}
sort(v.begin(),v.end(),cmp); //排序后并按照要求输出
cout<<v.size()<<endl;
for(int i=0;i<v.size();i++)
printf("%08d %d %d\n",v[i].id,v[i].D,v[i].C);
return 0;
}
16
#include<bits/stdc++.h>
using namespace std;
int getnum(char *str,char ch){
char num[15];
int i=0;
while(*str!='\0'){ //将原有字符串中和给出字符相同的读取到num数组中
if(*str==ch)
num[i++]=ch;
str++;
}
num[i]='\0';
sscanf(num,"%d",&i); //将字符数组转化成数字并返回
return i;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
char s1[15],s2[15],ch1,ch2;
scanf("%s %c %s %c",s1,&ch1,s2,&ch2); //读取数据
printf("%d",getnum(s1,ch1)+getnum(s2,ch2)); //计算并打印结果
return 0;
}
17
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
char num[1005],*p=num; //num存放读入的第一个长数字,p工作指针,覆盖存放商
int b,temp=0; //b为除数,temp用于存放部分和
scanf("%s %d",num,&b);
for(int i=0;num[i];i++){//循环知道字符数组的结尾
temp=temp*10+num[i]-'0'; //计算部分和
num[i]='0'+temp/b; //覆盖保存商
temp%=b; //计算余数保留到下一次计算
} //余数的位数(包含第一位商0的情况)和被除数一定相同,故不用处理尾部
if(num[0]=='0'&&num[1]!='\0') p++; //如果第一位商是0并且整个结果商不是0( 1 2的情况),从下一位非零数字开始输出
printf("%s %d",p,temp);
return 0;
}
//1号数据点 商为0
// 1 2
18
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int ans[2][4]={0},n; //记录比赛结果,0表示平,1表示锤子赢,2表示剪刀赢,3表示布赢
char jia,yi; //0号数组表示甲1号表示乙
scanf("%d\n",&n);
for(int i=0;i<n;i++){
scanf("%c %c\n",&jia,&yi);
switch(jia-yi){
case 'C'-'J':ans[0][1]++;break; //记录甲赢得情况
case 'J'-'B':ans[0][2]++;break;
case 'B'-'C':ans[0][3]++;break;
case 0: ans[0][0]++;break;//平局置用记录一次共用即可
case 'C'-'B':ans[1][3]++;break;//记录乙赢得情况
case 'J'-'C':ans[1][1]++;break;
case 'B'-'J':ans[1][2]++;break;
}
}
int temp=ans[0][1]+ans[0][2]+ans[0][3];//统计甲总次数并输出
printf("%d %d %d\n",temp,ans[0][0],n-temp-ans[0][0]);
temp=ans[1][1]+ans[1][2]+ans[1][3]; //统计乙总次数并输出
printf("%d %d %d\n",temp,ans[0][0],n-temp-ans[0][0]);
if(ans[0][3]>=ans[0][2]&&ans[0][3]>=ans[0][1]) jia='B';//如果B赢得最多
else if(ans[0][1]>=ans[0][2]) jia='C'; //如果J赢得最多
else jia='J';
if(ans[1][3]>=ans[1][2]&&ans[1][3]>=ans[1][1]) yi='B';
else if(ans[1][1]>=ans[1][2]) yi='C';
else yi='J';
printf("%c %c",jia,yi); //输出赢得最多得情况
return 0;
}
19
#include<bits/stdc++.h>
using namespace std;
bool cmp(char a,char b){ //把字符从大到小排序
return a>b;
}
void reverse(char *str){ //将数组逆置
swap(str[0],str[3]);
swap(str[1],str[2]);
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,tmp;
scanf("%d",&n);
char str[5];
while(1){
sprintf(str,"%04d",n); //将读入得数字格式化为4位字符串
sort(str,str+4,cmp); //从大到小排序
sscanf(str,"%d",&n); //获取第一个数
reverse(str); //逆置
sscanf(str,"%d",&tmp); //获取第二个数
printf("%04d - %04d = %04d\n",n,tmp,n-tmp);//输出一组结果
if(n-tmp==6174||n==tmp) break; //判断边界
n-=tmp; //处理n,准备进行下一轮
}
return 0;
}
20
#include<bits/stdc++.h>
using namespace std;
typedef struct moon{ //定义月饼结构体,数量可能为浮点类型
double num,total,price;
}MOON;
bool cmp(MOON &a,MOON &b){ //月饼按照单价从高到低排序
return a.price>b.price;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int N,D,cnt=0,i=0; //N为月饼种类,D为需求量,题目给出都为正整数
double sum=0.0; //总销售额,为浮点类型
scanf("%d %d",&N,&D);
MOON *p=(MOON*)malloc(sizeof(MOON)*N);
for(i=0;i<N;i++) //读取数据并计算单价
scanf("%lf",&p[i].num);
for(i=0;i<N;i++){
scanf("%lf",&p[i].total);
p[i].price=p[i].total/p[i].num;
}
sort(p,p+N,cmp); //排序
i=0;
while(i<N){ //按照单价从高到低遍历
if(cnt+p[i].num>=D){ //如果算上当前类型可以满足需求量,则统计并结束循环
sum+=p[i].price*(D-cnt);
break;
}
sum+=p[i].total; //如果算上当前类型仍然不足以满足市场需求,则全部计算在内
cnt+=p[i].num;
i++;
}
printf("%.2f",sum); //输出结果
return 0;
}
21
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int num[10]={0};
char ch;
while((ch=getchar())!='\n') //读取并统计
num[ch-'0']++;
for(int i=0;i<10;i++)
if(num[i])
printf("%d:%d\n",i,num[i]); //出现过得字符输出个数
return 0;
}
22
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int a,b,d; //根据题目,可知int不越界
vector<int> v;
scanf("%d %d %d",&a,&b,&d);
a+=b;
do{ //除留余数法进行进制转换
b=a%d;
v.push_back(b);
a/=d;
}while(a!=0);
for(int i=v.size()-1;i>=0;i--) //倒叙输出转换结果
printf("%d",v[i]);
return 0;
}
23
#include<bits/stdc++.h>
using namespace std;
void printchar(char ch,int n){
for(int i=0;i<n;i++)
putchar(ch);
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int num[10]={0},i;
for(i=0;i<10;i++)
scanf("%d",&num[i]);
i=1;
while(i<10){
if(num[i]!=0){ //把第一个不为0得数字作为第一个输出的字符
putchar('0'+i);
num[i]--;
break;
}
i++;
}
if(i==10) putchar('0'); //如果i在while中走到了10,说明全0(因为至少有一个个数非0),输出0
else
for(i=0;i<10;i++) //剩下的从小到达输出结果
printchar('0'+i,num[i]);
return 0;
}
24
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int tag=0,i=0,E; //tag表示正负,i用于读取字符,E表示指数
char str[10005]={0},ch; //数组要初始化,需要用'\0'作为边界,测试编译器有可能不会自动初始化
ch=getchar();
if(ch=='-') tag=1; //判断正负号
while(1){ //小数点和E不接收,E作为边界,用于后序接受指数
ch=getchar();
if(ch=='E') break;
if(ch!='.')
str[i++]=ch;
}
scanf("%d",&E);
if(tag==1) putchar('-'); //输出负号
if(E<0){
E=-E;
for(int i=0;i<E;i++){ //如果指数小于0,则需要提前输出E个0
if(i==0) printf("0."); //其中第一个要带小数点
else putchar('0');
}
printf("%s",str); //输出字符串中有效位
}
else{ //如果指数是正数
for(int i=0;str[i]!='\0'||i<E+1;i++){
if(i==E+1) putchar('.'); //由于指数为正,小数点后移,如果小数点出现在有效位的范围内(不在末位),则补充小数点
putchar(str[i]=='\0'?'0':str[i]); //有效位范围内输出小数点,否则补充0
}
}
return 0;
}
25
解法一
//使用数组处理的做法
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int id,data,next;
}NODE;
NODE LIST[100005];
vector<NODE> v;
void Reverse(vector<NODE> &v,int low,int high){ //对容器中low到high部分进行逆置
while(low<high){
swap(v[low],v[high]);
low++,high--;
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int Head,N,K;
scanf("%d %d %d",&Head,&N,&K); //读取数据
for(int i=0;i<N;i++){
int id;
scanf("%d",&id);
LIST[id].id=id;
scanf("%d %d",&LIST[id].data,&LIST[id].next);
}
while(Head!=-1){ //过滤数据,获取整个链表
v.push_back(LIST[Head]);
Head=LIST[Head].next;
}
N=v.size(); //统计链表长度
for(int i=0;i<N/K;i++)
Reverse(v,i*K,(i+1)*K-1); //每K个逆置,共逆置N/K次
for(int i=0;i<N-1;i++) //按照格式输出,最后一个特殊处理
printf("%05d %d %05d\n",v[i].id,v[i].data,v[i+1].id);
printf("%05d %d -1",v[N-1].id,v[N-1].data);
return 0;
}
解法二
//使用链表处理的做法
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int data,next;
}NODE;
NODE LIST[100005];
int KReverse(int Head,int N,int K){ //将链表每K个逆置的算法
int cnt=0,dealnum=N-N%K; //计数器和总共要处理的元素个数,dealnum
int NEWHEAD=100000; //利用一个空的头结点,方便操作
LIST[NEWHEAD].next=-1; //空的头结点初始化指针域
int p,tmphead,tmprear; //p为工作指针,tmphead为每k个的头结点指针,tmprear为每k个的尾结点指针
p=tmprear=Head,tmphead=NEWHEAD; //p初始化为第一个结点,tmprear初始化为第一个结点(逆置后的每k个的尾结点就是顺序的第一个),tmphead初始化为头结点
while(cnt<dealnum){ //处理节点
int temp=LIST[p].next; //防断链
LIST[p].next=LIST[tmphead].next; //头插代码
LIST[tmphead].next=p;
p=temp; cnt++; //勾链并计数
if(cnt%K==0){ //每k个更新一次
tmphead=tmprear; //tmphead更新为上一组的尾结点
tmprear=temp; //tmprea更新为下一组的第一个结点
}
}
if(cnt!=N) LIST[tmphead].next=tmprear; //如果还有剩余则勾链
return LIST[NEWHEAD].next; //返回新链表的头指针
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int Head,N,K,p;
scanf("%d %d %d",&Head,&N,&K); //读取数据
for(int i=0;i<N;i++){
int id;
scanf("%d",&id);
scanf("%d %d",&LIST[id].data,&LIST[id].next);
}
N=0; p=Head;
while(p!=-1){ //过滤数据,统计整个链表的元素个数
p=LIST[p].next;
N++;
}
if(N>=K) Head=KReverse(Head,N,K); //如果N>=k则需要逆置
while(LIST[Head].next!=-1){ //输出链表
printf("%05d %d %05d\n",Head,LIST[Head].data,LIST[Head].next);
Head=LIST[Head].next;
}
printf("%05d %d -1\n",Head,LIST[Head].data); //最后一个结点单独处理
return 0;
}
26
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int c1,c2;
scanf("%d%d",&c1,&c2);
c1=(int)(1.0*(c2-c1)/100+0.5); //计算秒数,+0.5再取整可以得到四舍五入的效果
printf("%02d:%02d:%02d",c1/3600,c1%3600/60,c1%60); //按照格式进行输出
return 0;
}
27
#include<bits/stdc++.h>
using namespace std;
void printchar(char ch,int n){ //打印n个ch字符的函数
for(int i=0;i<n;i++)
putchar(ch);
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
char ch;
scanf("%d %c",&n,&ch);
int cnt=(int)sqrt(1.0*(n+1)/2); //计算层数
for(int i=0;i<cnt;i++){ //先从多到少打印
printchar(' ',i);
printchar(ch,2*(cnt-i)-1);
putchar('\n');
}
for(int i=1;i<cnt;i++){ //再从少到多打印
printchar(' ',cnt-1-i);
printchar(ch,2*i+1);
putchar('\n');
}
printf("%d",n-2*cnt*cnt+1); //输出剩余个数
return 0;
}
28
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,cnt=0; //有效个数计数器
string maxname,minname; //存放要输出的名字
string maxdate="2014/09/06",mindate="1814/09/06"; //存放最大和最小生日,用于更新迭代
string lowdate="1814/09/06",highdate="2014/09/06"; //有效时间的上下限
cin>>n;
for(int i=0;i<n;i++){
string name,date;
cin>>name>>date;
if(date<lowdate||date>highdate) continue; //不合理日期跳过
if(date<maxdate){ //处理有效日期
maxdate=date;maxname=name;
}
if(date>mindate){
mindate=date;minname=name;
}
cnt++; //计数统计
}
if(cnt) //特判并输出
cout<<cnt<<' '<<maxname<<' '<<minname;
else cout<<cnt;
return 0;
}
//测试点3为有效日期为0的特判
29
#include<bits/stdc++.h>
using namespace std;
bool findch(char *str,char ch){ //再一串字符数组中寻找是否出现过ch字符(ch如果为字母,提前转为大写)
bool ret=false;
for(int i=0;str[i]!='\0'&&ret==false;i++){
if(str[i]>='a'&&str[i]<='z'){ //如果检查的字符串是字母,转化成大写进行匹配
if(str[i]==(ch+'a'-'A')) //只要匹配到相同的,返回True
ret=true;
}
else if(str[i]==ch) ret=true;
}
return ret; //如果出现过,返回真,否则返回假
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
char in[85],out[85];
map<char,bool> mp;
scanf("%s\n%s",in,out);
for(int i=0;in[i]!='\0';i++){
if(in[i]>='a'&&in[i]<='z') in[i]=in[i]-'a'+'A'; //转化为大写,进行查找
if(findch(out,in[i])==false&&mp[in[i]]==false){ //如果出现过且未输出过
putchar(in[i]); //打印并标记
mp[in[i]]=true;
}
}
return 0;
}
30
#include<bits/stdc++.h>
using namespace std;
bool cmp(int &a,int &b){
return a<b;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,p,i,j,*pt;
int result=0,temp=0; //result用于存放最终结果,temp存放临时结果,最后取最长
scanf("%d %d",&n,&p);
pt=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&pt[i]);
sort(pt,pt+n,cmp); //从小到大排序
for(i=0;i<n;i++){ //从第一个开始测试
for(j=i+result;j<n;j++){ //直接判断从已得到的长度开始,是否存在更长的完美数组
if(pt[j]<=(long long)pt[i]*p)
temp=j+1-i;
if(temp>result) result=temp;//如果存在最长的完美数组,继续往后测试是否存在更长,并更新result
else break; //如果不存在,此轮循环结束,i增加到下一个位置
}
}
printf("%d",result);
return 0;
}
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
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;
}
61
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int N,M;
scanf("%d %d",&N,&M);
int score[M],ans[M];
for(int i=0;i<M;i++) //读入分值
scanf("%d",&score[i]);
for(int i=0;i<M;i++) //读入正确答案
scanf("%d",&ans[i]);
for(int i=0;i<N;i++){
int sum=0;
for(int j=0;j<M;j++){ //比对每个学生答案
int temp;
scanf("%d",&temp);
if(temp==ans[j]) sum+=score[j]; //如果争取则累加得分
}
printf("%d\n",sum); //输出结果
}
return 0;
}
62
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int a,b,c,d,e,cnt=0;
scanf("%d/%d %d/%d %d",&a,&b,&c,&d,&e);
if(a*d>b*c){ //这里保证第一个分数数值小,第二个分数数值大
swap(a,c),swap(b,d);
}
for(int i=a*e/b+1;i*d<c*e;i++){ //i从最低的数开始,到最高的数结束
if(gcd(i,e)==1){ //满足最简分数的进行输出
if(cnt++) putchar(' '); //通过计数的方式处理格式
printf("%d/%d",i,e);
}
}
return 0;
}
63
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
#define more(a,b) ((a)-(b)>eps) //浮点数的比较,大于需要超过某个精度范围
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int a,b,N;
double temp,max=0.0;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d %d",&a,&b);
temp=hypot(a,b); //返回值为double,返回两个参数平方和的开方
if(more(temp,max)) max=temp; //获取最大模
}
printf("%.2f",max);
return 0;
}
64
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int Table[37]={0}; //朋友证号最多为36,即数字为9999,所以打表开37个空间即可
char ch;
while((ch=getchar())!='\n') continue; //字符处理,所以不需要知道有多少个数字,直接过滤掉这些字符
int friendnum=0,cnt=0; //friendnum用于存放临时计算出的一个朋友证号,cnt用于计数不同的朋友证号个数
while((ch=getchar())!='\n'){ //到换行结束
if(ch==' '){ //如果遇到空格,说明已经处理过一个数字了
if(Table[friendnum]==0){ //如果第一次遇到这个朋友证号,计数并将标记置为一
cnt++;Table[friendnum]=1;
}
friendnum=0;continue; //凡是处理过一个数字,friendnum清0,用于下一个数字的计算
}
friendnum+=ch-'0'; //累加计算每一位的和
}
if(Table[friendnum]==0){ //处理最后一个数字
cnt++;Table[friendnum]=1;
}
printf("%d\n",cnt); //输出个数
for(int i=1,flag=0;flag<cnt;i++){ //遍历并输出符合的朋友证号
if(Table[i]==1){
if(flag++) putchar(' ');
printf("%d",i);
}
}
return 0;
}
65
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
map<string,string> mp; //记录夫妻关系
map<string,int> at; //记录是否在场
int n,m;
cin>>n;
for(int i=0;i<n;i++){ //读取夫妻关系
string a,b;
cin>>a>>b;
mp[a]=b;
mp[b]=a;
}
vector<string> v1; //记录到场人员
vector<string> v; //记录输出人员
cin>>m;
for(int i=0;i<m;i++){ //出场人员进行标记
string temp;
cin>>temp;
at[temp]=1;
v1.push_back(temp);
}
for(int i=0;i<m;i++){
string temp=v1[i];
if(mp[temp]=="") //如果没有夫妻关系,属于需要输出的人员
v.push_back(temp);
else if(at[mp[temp]]==0){//如果配偶没有到场,也属于需要输出的人员
v.push_back(temp);
}
}
if(v.size()==0){ //如果人数是0直接输出结果
putchar('0');return 0;
}
sort(v.begin(),v.end()); //如果有单身人士,按照id从小到大排序输出
cout<<v.size()<<'\n';
for(int i=0;i<v.size();i++){
if(i) putchar(' ');
cout<<v[i];
}
return 0;
}
66
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int m,n,a,b,tag;
scanf("%d%d%d%d%d",&m,&n,&a,&b,&tag); //读入行数,列数,替换区间,替换值
for(int i=0;i<m;i++){ //双循环读入
for(int j=0;j<n;j++){
int temp;
scanf("%d",&temp);
if(temp>=a&&temp<=b) temp=tag; //如果符合替换区间,直接替换
if(j) putchar(' ');
printf("%03d",temp); //按照格式进行输出
}
putchar('\n');
}
return 0;
}
67
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
string pasword,temp;
int n,cnt=0;
cin>>pasword>>n; //读入正确密码和允许的错误次数
char ch;
while((ch=getchar())!='\n') continue; //过滤多余字符
while(1){
getline(cin,temp); //读入一个密码输入
if(temp=="#") break; //如果读取结束
else if(temp==pasword){ //如果密码正确,输出欢迎语句并结束循环
printf("Welcome in");break;
}
else{ //如果不正确,输出错误密码,然后统计错误次数
cout<<"Wrong password: "<<temp<<endl;
cnt++; //如果错误次数达到上限,输出账户锁定,并结束循环
if(cnt==n){ printf("Account locked");break;}
}
}
return 0;
}
68
#include<bits/stdc++.h>
using namespace std;
#define diff(a,b) ((a-b)>0?(a-b):(b-a))
int Point[1005][1005]={0};
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int M,N,TOL,x,y,cnt=0;
map<int,int> mp;
scanf("%d %d %d",&M,&N,&TOL); //读取数据
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
scanf("%d",&Point[i][j]);
mp[Point[i][j]]++;
}
}
for(int i=1;i<=N;i++){
int flag=0;
for(int j=1;j<=M;j++){ //边和角落的点也需要判定,类似于扫雷游戏的判定规则,所以数组开大一些,下标从1开始保存
if(diff(Point[i][j],Point[i][j+1])>TOL //判定是否比周围的颜色相差超过阈值
&&diff(Point[i][j],Point[i][j-1])>TOL
&&diff(Point[i][j],Point[i+1][j+1])>TOL
&&diff(Point[i][j],Point[i+1][j])>TOL
&&diff(Point[i][j],Point[i+1][j-1])>TOL
&&diff(Point[i][j],Point[i-1][j+1])>TOL
&&diff(Point[i][j],Point[i-1][j])>TOL
&&diff(Point[i][j],Point[i-1][j-1])>TOL){
if(mp[Point[i][j]]==1){ //如果这样的点存在,且出现次数只有一次,累计并保存
cnt++;x=i,y=j;
if(cnt>1){flag=1;break;} //如果符合条件的点不止一个,终止循环判定
}
}
}
if(flag) break;
}
if(cnt==0) puts("Not Exist"); //根据结果进行输出
else if(cnt==1) printf("(%d, %d): %d\n",y,x,Point[x][y]);
else puts("Not Unique");
return 0;
}
69
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int M,N,S;
map<string,int> mp; //用于标记是否出现过
string str;
scanf("%d %d %d\n",&M,&N,&S); //读入各个参数
bool flag=false; //用于标记是否有中奖输出
for(int i=1;i<=M;i++){ //依次读入M个数据
cin>>str; //读入一个ID
if(mp[str]==1) {S=S+1;continue;} //用S记录需要输出的下一个中奖者的序号,如果已经领奖顺延到下一位
if(i==S){ //如果当前序号是中奖着则进行处理
mp[str]=1; //领奖标记
cout<<str<<endl; //输出名字
flag=true; //修改标记
S+=N; //再隔N个为下一个中奖者,更新S
}
}
if(flag==false) printf("Keep going...");//如果没有人中奖
return 0;
}
70
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
double sum;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++) //读取n个元素,然后从小到大排序,因为长绳子尽可能少折叠,所以放在最后加入绳结
scanf("%d",&a[i]);
sort(a,a+n);
sum=a[0]; //sum初始化为第一段绳子
for(int i=1;i<n;i++)
sum=(sum+a[i])/2; //和后边的每段绳子进行链接
printf("%d",int(sum)); //通过强制转换截断,向下取整
return 0;
}
71
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int T,K;
scanf("%d %d",&T,&K);
for(int i=0;i<K;i++){
int n1,b,t,n2;
scanf("%d %d %d %d",&n1,&b,&t,&n2);
if(t>T) printf("Not enough tokens. Total = %d.\n",T); //如果下注超过拥有的筹码
else if((b==1&&n2>n1)||(b==0&&n1>n2)) //如果赢了,则增加筹码
printf("Win %d! Total = %d.\n",t,T+=t);
else{
printf("Lose %d. Total = %d.\n",t,T-=t); //如果输了就减少筹码
if(T==0) {printf("Game Over.");break;} //如果输完了就结束游戏
}
}
return 0;
}
//注意:
//题目输出格式上Total之前只有一个空格,但是输出样例有两个空格,以输出样例为准
72
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int N,M,Pcnt=0,Tcnt=0; //Pcnt用于记录人数,Tcnt用于记录物品个数
map<int,bool> notallow; //记录违禁物品编号
scanf("%d%d",&N,&M);
for(int i=0;i<M;i++){ //读入并标记违禁物品
int temp;
scanf("%d",&temp);
notallow[temp]=true;
}
for(int i=0;i<N;i++){ //依次对N个学生进行检查
string name;
int k,temp,flag=0; //flag标记为是否有违禁物品
cin>>name>>k;
for(int j=0;j<k;j++){
scanf("%d",&temp);
if(notallow[temp]==true){ //如果是违禁物品,则进行处理
if(flag==0) cout<<name<<":";//如果是第一个违禁物品,先输出人名
printf(" %04d",temp); //输出违禁物品编号
flag=1; Tcnt++; //修改标记,并累加
}
}
if(flag==1){putchar('\n'); Pcnt++;}//如果该学生有违禁物品则统计人数,并换行
}
printf("%d %d",Pcnt,Tcnt); //输出最后的统计人数
return 0;
}
73
#include<bits/stdc++.h>
using namespace std;
typedef struct{ //题目结构体,score表示分数,ans表示答案用模拟的二进制形式表示,rn表示正确的选项个数
int score,ans,rn,xs[6]; //xs用于存放错误选项的信息,0号储存本题中错误数量最大的个数
}QU;
int getans(); //读取答案
int cmp(QU *p,int i); //比较函数,比较答案,返回错误类型,1代表全对,2代表对一半,3代表错误
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int N,M,max=0;
char ch;
QU *p;
cin>>N>>M;
p=(QU*)malloc((M+1)*sizeof(QU)); //构造题目结构体数组
for(int i=1;i<=M;i++){ //读入题目,初始化题目结构体的内容
scanf("%d %*d %d",&p[i].score,&p[i].rn);//读入分数和正确选项个数,跳过选项数量,统一按5个选项处理
p[i].ans=getans(); //读取答案
for(int j=0;j<=5;j++){ //将题目每个选项的错误数量初始化为0
p[i].xs[j]=0;
}
}
for(int i=0;i<N;i++){ //读入N个学生答案
double sum=0;
char ch;
for(int j=1;j<=M;j++){
while((ch=getchar())!='(') //过滤吸收多余字符,直到左括号
continue;
switch(cmp(p,j)){ //比对答案
case 1:sum+=p[j].score;break;//如果全对,加上该题分值
case 2:sum+=(1.0*p[j].score)/2;max=(p[j].xs[0]>max?p[j].xs[0]:max);break;//如果对了一般,加一半分值,更新最大错误max
case 3:max=(p[j].xs[0]>max?p[j].xs[0]:max);break;//如果错误,更新max
default:break;
}
}
printf("%.1f\n",sum); //打印成绩
}
if(max==0) //没有人错
puts("Too simple");
else{
for(int i=1;i<=M;i++) //按顺序读取每一个题目
if(p[i].xs[0]==max){ //如果最大错误数量与max相同,则考虑打印
for(int j=1;j<=5;j++){ //比较每个选项的错误数量,按顺序输出与max相等的选项
if(p[i].xs[j]==max)
printf("%d %d-%c\n",max,i,'a'-1+j);
}
}
}
free(p); //释放动态内存空间
return 0;
}
int getans() //读取答案,模拟二进制数的表示方法
{
int ans=0;
char ch;
while((ch=getchar())!=')'){
if(ch=='\n') break;
switch(ch){
case 'a':ans+=10000;break;
case 'b':ans+=1000;break;
case 'c':ans+=100;break;
case 'd':ans+=10;break;
case 'e':ans+=1;break;
default:break;
}
}
return ans;
}
int cmp(QU *p,int i)
{
int ret=3; //ret返回值表示题目错误类型,默认为错题
int ans=getans(); //读取答案
char a[6],pa[6]; //定义两个字符串,把答案读入字符串进行比对
sprintf(a,"%05d",ans); //把答案以5位字符串的格式读入,不够的补零
sprintf(pa,"%05d",p[i].ans); //pa表示答案字符串
int cnt=0; //只统计正确选项的数量
for(int j=0;j<5;j++){ //依此比对答案
if(pa[j]==a[j]){ //如果相同
if(pa[j]=='1') cnt++; //如果答案是1,表示选中,cnt计数;如果是0,则表示该选项不存在或者不需要选
}
else{ //如果不相同则表示漏选或者多选 ,都认为此选项出错 ,统计在错误数量内
p[i].xs[j+1]++;
if(pa[j]=='0') cnt=10; //如果答案是0,表示错选,将cnt置为一个很大的值,以表示此题错误,漏选则cnt不做处理
}
}
for(int j=0;j<=5;j++){ //遍历选项错误数量,将错的最多的赋值给0号位置;
p[i].xs[0]=(p[i].xs[j]>p[i].xs[0]?p[i].xs[j]:p[i].xs[0]);
}
if(cnt==p[i].rn) ret=1; //如果选对的数量和正确答案的数量相同,表示全对
else if(cnt<p[i].rn) ret=2; //如果选对的数量小于正确答案的数量,表示对了一半
//否则,cnt是一个很大的值,表示此题错误
return ret;
}
74
#include<bits/stdc++.h>
using namespace std;
int get_arry(int a[]){ //把数字的每一位读入int数组
char ch;
int cnt=0;
while((ch=getchar())!='\n')
a[cnt++]=ch-'0';
return cnt;
}
void Reverse(int a[],int len){ //逆置函数
int i=0,j=len-1;
while(i<j){
swap(a[i],a[j]);
i++,j--;
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int Table[21]={0},a[21]={0},b[21]={0}; //每一位的权值Table,第一个数a,第二个数b
int cnt,lena,lenb,flag=0; //长度计数器和标记
cnt=get_arry(Table),lena=get_arry(a);lenb=get_arry(b); //读入每一个数字的每一位
Reverse(Table,cnt);Reverse(a,lena);Reverse(b,lenb); //将每一个数组逆置
for(cnt=0;cnt<lena||cnt<lenb||flag;cnt++){ //遍历数组,以最长的为结尾,flag用于存放位的临时和以及进位,如果最后还有进位flag不为0,则多一步处理
int tag=Table[cnt]==0?10:Table[cnt]; //获取当前位的权值,0代表权值是10,需要特判
flag=a[cnt]+b[cnt]+flag; //计算当前两位的和需要累加上一位的进位
a[cnt]=flag%tag; //计算累加后的位存放再a中
flag/=tag; //更新获取进位
}
flag=0; //标记,第一个非零的位开始输出
for(cnt--;cnt>=0;cnt--){ //cnt记录了最终结果的长度,倒序输出
if(a[cnt]!=0) flag=1; //如果出现了第一位不为0的数字,修改标记
if(flag==1)
putchar('0'+a[cnt]); //第一位不为0的出现后开始输出
}
if(flag==0) putchar('0'); //如果全为0,则flag标记为初始化的0,特别输出加法结果0
return 0;
}
75
解法一
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int id,data,next;
}NODE;
NODE LinkList[100001]; //存放读入的数据结点
NODE out[100001]; //用辅助的数组空间存放最终的链表
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int head,n,k,cnt=0,i;
scanf("%d %d %d",&head,&n,&k); //读入参数
for(i=0;i<n;i++){
int temp;
scanf("%d",&temp);
LinkList[temp].id=temp;
scanf("%d %d",&LinkList[temp].data,&LinkList[temp].next);
}
for(i=head;i!=-1;i=LinkList[i].next){ //先存入小于0的结点
if(LinkList[i].data<0)
out[cnt++]=LinkList[i];
}
for(i=head;i!=-1;i=LinkList[i].next){ //再存放0~K的结点
if(LinkList[i].data>=0&&LinkList[i].data<=k)
out[cnt++]=LinkList[i];
}
for(i=head;i!=-1;i=LinkList[i].next){ //最后存放剩余结点
if(LinkList[i].data>k)
out[cnt++]=LinkList[i];
}
for(i=0;i<cnt-1;i++){ //格式化输出链表,next值便是数组中下一个元素的id,最后一个结点单独处理
printf("%05d %d %05d\n",out[i].id,out[i].data,out[i+1].id);
}
printf("%05d %d -1",out[i].id,out[i].data);
return 0;
}
解法二
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int id,data,next;
}NODE;
NODE LinkList[100001]; //存放读入的数据结点
NODE out[100001]; //用辅助的数组空间存放最终的链表
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int head,n,k,cnt=0,i; //cnt从0开始,是负值存放位置的开始
int negcnt=0,Kcnt=0; //negcnt为负值结点个数,Kcnt为0~K结点个数
int Kindex,OtherIndex; //Kindex是0~K值最终在数组存放的数组下标起始位置,OtherIndex是大于K的元素下标起始位置
scanf("%d %d %d",&head,&n,&k); //读入参数
for(i=0;i<n;i++){
int temp;
scanf("%d",&temp);
LinkList[temp].id=temp;
scanf("%d %d",&LinkList[temp].data,&LinkList[temp].next);
}
for(i=head;i!=-1;i=LinkList[i].next){ //第一遍遍历链表,记录每种类型的个数
if(LinkList[i].data<0) negcnt++;
else if(LinkList[i].data>=0&&LinkList[i].data<=k) Kcnt++;
}
Kindex=negcnt; OtherIndex=negcnt+Kcnt; //计算每类元素存放的起始坐标
for(i=head;i!=-1;i=LinkList[i].next){
if(LinkList[i].data<0) //如果是负值,从cnt开始存放
out[cnt++]=LinkList[i];
else if (LinkList[i].data>=0&&LinkList[i].data<=k) out[Kindex++]=LinkList[i]; //如果是0~K值从Kindex位置开始存放
else out[OtherIndex++]=LinkList[i]; //大于K的从OtherIndex位置开始存放
} //显然最后OtherIndex刚好是最后一个元素的下一个位置下标,也刚好是链表长度
for(i=0;i<OtherIndex-1;i++){ //格式化输出链表,next值便是数组中下一个元素的id,最后一个结点单独处理
printf("%05d %d %05d\n",out[i].id,out[i].data,out[i+1].id);
}
printf("%05d %d -1",out[i].id,out[i].data);
return 0;
}
76
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){ //读取N组数据
for(int j=0;j<4;j++){ //每组四个选项
string str;
cin>>str; //读入字符串
if(str[2]=='T') //如果该答案是正确的,输出对应的序号
printf("%d",str[0]+1-'A');
}
}
return 0;
}
77
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int N,M;
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++){
int G2,cnt=0,maxs=0,mins=M; //cnt用于记录有效分数的个数,maxs和mins用于记录最大和最小成绩
double G1=0;
scanf("%d",&G2);
for(int j=0;j<N-1;j++){
int score;
scanf("%d",&score);
if(score<0||score>M) continue; //不合法成绩直接跳过不处理
G1+=score; //累加合法成绩
maxs=max(maxs,score); mins=min(mins,score); //记录最大和最小成绩
cnt++; //计数器自增
}
G1-=maxs,G1-=mins;G1=G1/(cnt-2); //G1减去最大最小分数,然后求平均数
printf("%d\n",int((G1+G2)/2+0.5)); //四舍五入后取整并输出,这里使用+0.5并强制转换的方式实现
}
return 0;
}
78
#include<bits/stdc++.h>
using namespace std;
void Cstr(){ //压缩算法
int cnt=1; //统计字符个数
char ch=getchar(); //先读入第一个字符,因为后序字符需要有一个前置字符进行比对
while(ch!='\n'){ //在读到换行之前都要处理
char temp=getchar(); //读取当前位的字符
if(temp==ch) cnt++; //如果和前置字符相同则进行统计相同字符个数
else{ //如果不同则进行输出
if(cnt>1) printf("%d%c",cnt,ch); //如果超过1个,则输出个数和字符
else putchar(ch); //否则输出一个字符即可
cnt=1;ch=temp; //更新计数器重新计数,更新ch为当前字符,用于准备下一次比对
}
}
}
void Dstr(){
char ch,num[15]; //ch用于存储字符,num用于存储整数
while((ch=getchar())!='\n'){ //在未读到换行时进行判定
if(isdigit(ch)){ //如果是数字,则需要读取一个完整的数字
int index=0; //存放数字的数组下标
while(isdigit(ch)){ //如果是数字则进行存储,否则刚好获取到字符个数,和需要输出的字符ch
num[index++]=ch;
ch=getchar();
}
num[index]='\0'; //添加字符结尾标记
sscanf(num,"%d",&index); //将字符数组转化为整型数字
for(int i=0;i<index;i++) putchar(ch); //输出相对应个数的字符
}
else putchar(ch); //如果只有一个字符(没有数字修饰)直接输出
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
char ch=getchar(); //读取解压模式
getchar(); //吸收换行符
if(ch=='C') Cstr(); //根据模式选择相应的解压缩算法
else Dstr();
return 0;
}
79
#include<bits/stdc++.h>
using namespace std;
char num[1001],revnum[1001];
bool IsRight(char str[]){ //判断字符串是不是回文数
int low=0,high=strlen(str)-1; //双指针,一个从前往后,一个从后往前,如果对称位置有不相等的就不是回文数
while(low<high){
if(str[low]!=str[high]) return false;
low++,high--;
}
return true;
}
void AddNum(){ //对原始数字进行加法操作
int len=strlen(num); //计算字符数组长度
int i=0,flag=0;
for(i=0;i<len;i++) revnum[i]=num[len-1-i]; //获取逆序后的字符串
revnum[i]='\0'; //注意字符串的结尾符号
printf("%s + %s = ",num,revnum); //输出加法算式
for(i=0;i<len;i++){ //大数加法
flag=num[i]-'0'+revnum[i]-'0'+flag;
num[i]=flag%10+'0';
flag/=10;
}
if(flag) num[i++]=flag+'0'; //如果还有进位,需要多出一位
num[i]='\0'; //字符串末尾处理
int low=0,high=i-1; //由于得到的字符串实际上是逆位的,所以逆转一下
while(low<high){ swap(num[low],num[high]); low++,high--; }
printf("%s\n",num); //输出计算过后的结果
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
scanf("%s",num);
if(IsRight(num)){ //特判给的第一个数字就是回文数
printf("%s is a palindromic number.",num); return 0;
}
int i=10;
while(i--){ //循环10次,
AddNum(); //加法处理
if(IsRight(num)){ //如果得到一个回文数,输出并结束循环
printf("%s is a palindromic number.",num);
break;
}
} //如果刚好第10步得到回文数,则i为0,如果10步都没得到,i最后为-1
if(i==-1) printf("Not found in 10 iterations.");//如果10步以内没有找到
return 0;
}
//测试点2 3 4是给出的数字便是回文数,所以直接特判输出即可
80
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
string id;
int Gp=-1,Gmid=-1,Gfi=-1,G; //各项成绩初始化为-1
}STU;
bool cmp(STU &a,STU &b){
if(a.G!=b.G) return a.G>b.G;
else return a.id<b.id;
}
STU DATA[10005]; //编程成绩有效个数一定小于等于P,所以最多只有P个人
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int P,M,N,cnt=0,score;
string id;
map<string,int> mp;
scanf("%d %d %d",&P,&M,&N);
for(int i=0;i<P;i++){ //读取编程成绩
cin>>id>>score;
if(score<200) continue; //如果编程分数不及格,直接跳过
DATA[cnt].id=id; //记录学生成绩和学号
DATA[cnt].Gp=score;
mp[id]=cnt; cnt++; //cnt用于记录数组中下一个可存放位置的下标,mp用于存放学号对应的数组下标
}
for(int i=0;i<M;i++){ //读取期中成绩
cin>>id>>score;
if(mp.find(id)==mp.end()) continue; //如果没有编程成绩,直接跳过(这里用mp.find()进行判定)
DATA[mp[id]].Gmid=score; //记录期中成绩
}
for(int i=0;i<N;i++){ //读取期末成绩
cin>>id>>score;
if(mp.find(id)==mp.end()) continue; //如果没有编程成绩,则跳过
int index=mp[id]; //获取在数组中的下标
DATA[index].Gfi=score; //记录期末成绩
if(score<DATA[index].Gmid) DATA[index].G=int(0.4*DATA[index].Gmid+0.6*score+0.5);
else DATA[index].G=score; //按照规则计算最终成绩,这里使用+0.5后强制转换的方式实现四舍五入到整数
}
sort(DATA,DATA+cnt,cmp); //按照要求排序
for(int i=0;i<cnt;i++){ //输出符合要求的学生
if(DATA[i].G<60) break;
cout<<DATA[i].id<<' '<<DATA[i].Gp<<' '<<DATA[i].Gmid<<' '<<DATA[i].Gfi<<' '<<DATA[i].G<<endl;
}
return 0;
}
81
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
scanf("%d\n",&n); //读取输入个数,这里需要带上\n用于吸收末尾的换行符
for(int i=0;i<n;i++){
string str="";
getline(cin,str); //读取整行字符
int len=str.size();
if(len<6) puts("Your password is tai duan le."); //如果密码过短
else{
bool alphcnt=0,numcnt=0,other=0; //如果长度符合要求,验证字母,数字和其他字符
for(int j=0;j<len;j++){
if(isdigit(str[j])) numcnt=1; //如果存在数字
else if(isalpha(str[j])) alphcnt=1; //如果存在字母
else if(str[j]!='.'){ //如果不是字母,不是数字,也不是. 则为其他字符,更新标记并直接退出循环
other=1; break;
}
}
if(other) puts("Your password is tai luan le."); //输出有其他字符
else if(numcnt==0) puts("Your password needs shu zi."); //缺少数字
else if(alphcnt==0) puts("Your password needs zi mu."); //缺少字母
else puts("Your password is wan mei."); //如果都没有上述问题,则认为是完美密码
}
}
return 0;
}
82
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int id,N,maxid,minid,max_s=0,min_s=20000; //记录最大和最小的id和成绩
scanf("%d",&N);
for(int i=0;i<N;i++){
int x,y;
scanf("%d%d%d",&id,&x,&y);
x=x*x+y*y; //计算当前坐标的平方和
if(x>max_s){ max_s=x; maxid=id; } //分别更新最大和最小值
if(x<min_s){ min_s=x; minid=id; }
}
printf("%04d %04d",minid,maxid); //距离越近,成绩越高,所以先输出min再输出max
return 0;
}
83
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
scanf("%d",&n);
map<int,int> mp;
for(int i=1;i<=n;i++){ //用mp统计每一个数的出现次数,
int temp;
scanf("%d",&temp);
mp[abs(i-temp)]++;
}
for(auto it=mp.rbegin();it!=mp.rend();it++)//从大到小输出重复出现的数字,出现次数大于1认为是重复
if(it->second>1)
printf("%d %d\n",it->first,it->second);
return 0;
}
84
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
string str;
int n,i,j;
cin>>str>>n; //读入第一个字符
for(int cnt=1;cnt<n;cnt++){ //循环n-1次即可,因为第一行就是给出的字符
string temp=""; //根据前一个字符串,temp用于构建新字符
for(i=0;i<str.size();i=j){ //遍历字符串
for(j=i;j<str.size()&&str[j]==str[i];j++);//如果j位置的字符串和i位置的相同,一直往后统计,直到结束或者遇到不相同的字符
temp+=str[i]+to_string(j-i); //先加上当前的字符,然后加上个数,然后用新位置j在外层循环更新i的值
}
str=temp; //更新字符串
}
cout<<str;
return 0;
}
85
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
string id;
int AS=0,BS=0,TS=0,S=0,cnt=0;
}SCH;
bool cmp(SCH &a,SCH &b){ //排序规则
if(a.S!=b.S) return a.S>b.S; //加权分数按照从高到底排序
else if(a.cnt!=b.cnt) return a.cnt<b.cnt; //分数并列,按照人数从少到多排序
else return a.id<b.id; //人数依然并列按照学校名字字典序排列
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,cnt=0;
scanf("%d",&n);
SCH DATA[n];
unordered_map<string,int> mp; //记录学校在数组中的下标,使用无序map以节省时间
for(int i=0;i<n;i++){
string id,sch;
int score,index;
cin>>id>>score>>sch;
for(int k=0;k<sch.size();k++){ //把所有的学校名字都改为小写
if(sch[k]>='A'&&sch[k]<='Z') sch[k]=sch[k]-'A'+'a';
}
if(mp.find(sch)==mp.end()) {DATA[cnt].id=sch; mp[sch]=cnt++;} //如果出现一个心学校,则从数组中分配一个位置,并更新mp
index=mp[sch]; //获取学校存储下标
DATA[index].cnt++; //人数累加
switch(id[0]){ //根据考试难度累加分数
case 'A':DATA[index].AS+=score;break;
case 'B':DATA[index].BS+=score;break;
case 'T':DATA[index].TS+=score;break;
}
} //遍历以计算加权分数
for(int i=0;i<cnt;i++) DATA[i].S=int(1.0*DATA[i].BS/1.5+DATA[i].AS+1.5*DATA[i].TS);
sort(DATA,DATA+cnt,cmp); //按照规则排序
int rank=1;
cout<<cnt<<endl; //输出学校个数
for(int i=0;i<cnt;i++){
if(i==0) rank=1; //第一个人序号是1
else if(DATA[i].S!=DATA[i-1].S) rank=i+1;//如果和前一个人分数相同,序号相同,如果分数不同,排名为自己在数组中的序号(由于数组从0开始,排序从1开始,所以要+1)
cout<<rank<<' '<<DATA[i].id<<' '<<DATA[i].S<<' '<<DATA[i].cnt<<endl;
}
return 0;
}
86
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int a,b,temp,i,ans[7]={0};
scanf("%d %d",&a,&b);
temp=a*b;
for(i=0;temp;i++){ //把每一位存在数组中(逆序)
ans[i]=temp%10;
temp/=10;
}
for(temp=0;ans[temp]==0;temp++);//找到第一个非零数字开始输出
for(;temp<i;temp++)
printf("%d",ans[temp]);
return 0;
}
87
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n;
set<int> se;
scanf("%d",&n);
for(int i=1;i<=n;i++){ //根据要求计算数值,并用set存储去重
int temp=int(i/2)+int(i/3)+int(i/5);
se.insert(temp);
}
printf("%d",se.size());
return 0;
}
88
#include<bits/stdc++.h>
using namespace std;
void check(double x,double m){ //打印能力值关系
if(x>m) printf(" Cong");
else if(x==m) printf(" Ping");
else printf(" Gai");
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int M,x,y,flag=0;
int jia,yi;
double bing; //bing的能力值是除法计算出来的,所以,可能是浮点数
scanf("%d %d %d",&M,&x,&y); //读取数据
for(jia=99;jia>=10;jia--){ //甲能力值为两位数,而且解不唯一时以最大为准
yi=jia%10*10+jia/10;
int diff=abs(jia-yi);
if(diff*y==yi*x){ //计算满足条件的关系
bing=1.0*diff/x;
flag=1;break; //有解就把标记置为一
}
}
if(flag==0) printf("No Solution"); //无解的情况
else{
printf("%d",jia); //输出有解的情况
check(jia,M);check(yi,M);check(bing,M);
}
return 0;
}
89
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int N;
cin>>N;
vector<int> v(N+1);
for(int i=1;i<=N;i++) //用于存放每一个玩家说的数字
cin>>v[i];
for(int i=1;i<=N;i++){ //双重循环,这样可以得到题目所说的最小序列
for(int j=i+1;j<=N;j++){
vector<int> lie,a(N+1,1); //记录说谎者和假定的身份(1表示好人,-1表示狼人,初始化为1)
a[i]=a[j]=-1; //假定i和j都是狼人
for(int k=1;k<=N;k++){ //遍历每个人说的话
if(v[k]*a[abs(v[k])]<0) //v表示第k个玩家说的话,与相对应的描述的另一位玩家abs[v[k]]的身份进行比对,如果符号(身份)不同,乘积小于0,即说明此人说谎
lie.push_back(k); //保存说谎玩家的序号
}
if(lie.size()==2&&a[lie[0]]+a[lie[1]]==0){ //如果说谎玩家刚好有两个,而且一个狼人一个好人(题目要求只有两个狼人,有狼人说谎且不是所有狼人都说谎)
cout<<i<<' '<<j; //如果满足题目条件,说明当前的假设成立,也就是i和j都是狼人,输出即可
return 0;
}
}
}
cout<<"No Solution"; //如果没有满足条件的输出,则无解
return 0;
}
90
#include<bits/stdc++.h>
using namespace std;
unordered_map<string,string> mp; //记录反应物对应关系
bool check(){
int n;
cin>>n;
unordered_map<string,int> m; //记录某个物品是否出现过
vector<string> v(n);
for(int i=0;i<n;i++){ //读取每一种货物
cin>>v[i];
m[v[i]]=1;
}
for(int i=0;i<n;i++)
if(mp[v[i]]!=""){ //如果当前物品有反应物
for(int j=0;j<mp[v[i]].size();j+=5){
string temp=mp[v[i]].substr(j,5); //每次提取从j开始的五位进行核查
if(m[temp]==1) return false; //如果与之反应的物品也出现在清单里,则不能安全运输
}
}
return true;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,m;
string a,b;
cin>>n>>m;
for(int i=0;i<n;i++){ //采用衔接的方式构建一个类似于二维矩阵的map,
cin>>a>>b; //把每一个物品对应的反应物品string类变量直接加在value值的后边,构成一个长串
mp[a]+=b; //检查时每次取出5位进行对比核查
mp[b]+=a;
}
for(int i=0;i<m;i++) //判定m箱货物清单
puts(check()?"Yes":"No");
return 0;
}
91
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int m,n,k;
scanf("%d",&m);
for(int i=0;i<m;i++){ //读取数字
scanf("%d",&k);
int temp,check;
for(n=1;n<10;n++){
temp=check=n*k*k; //计算乘积
if(temp%10==k) break; //由于给出的数不超过1000,所有只有三位,直接判断取余判断即可
else if(temp%100==k) break;
else if(temp%1000==k) break;
}
if(n==10) printf("No\n"); //如果没有遇到对应的K则输出no
else printf("%d %d\n",n,temp);
}
return 0;
}
92
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int m,n,max=0;
scanf("%d %d",&n,&m); //读入参数
int cnt[n+1]={0}; //需要g++支持
for(int i=0;i<m;i++){
for(int j=1;j<=n;j++){
int num;
scanf("%d",&num);
cnt[j]+=num; //累加每种月饼的销量
max=cnt[j]>max?cnt[j]:max;
}
}
int flag=0; //用于格式控制
printf("%d\n",max);
for(int i=1;i<=n;i++){
if(cnt[i]==max){ //从小到大的序号遍历,输出销量等于最高销量的月饼序号
if(flag++) putchar(' ');
printf("%d",i);
}
}
return 0;
}
93
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int Table[127]={0}; //用于记录是否已经出现过当前字符
int cnt=0; //用于统计出现回车的次数,用于结束循环
while(cnt<2){
char ch=getchar(); //读取字符
if(ch=='\n') { cnt++;continue; } //回车字符直接跳过
if(Table[ch]==0){ //如果没出现过,记录该字符并输出
Table[ch]++;
putchar(ch);
}
}
return 0;
}
//题目样例可知大小写不同
94
#include<bits/stdc++.h>
using namespace std;
bool IsPrime(int x){
if(x==0||x==1) return false;
for(int i=2;i<sqrt(1.0*x);i++)
if(x%i==0) return false;
return true;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
string str;
int len,k;
scanf("%d %d\n",&len,&k);
cin>>str;
for(int i=0;i+k<=len;i++){ //注意循环边界
string num=str.substr(i,k); //去除当前位置开始向后的k个字符
if(IsPrime(stoi(num))){ //转化成数字并验证是不是素数,如果是则输出并返回
cout<<num; return 0;
}
}
cout<<"404"; //如果找不到符合条件的素数,则输出404
return 0;
}
95
#include<bits/stdc++.h>
using namespace std;
typedef struct{ //学生结构体
string id;
int score;
}ST;
bool cmp(ST a,ST b){ //排序规则
if(a.score!=b.score) return a.score>b.score;
else return a.id<b.id;
}
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,m,case_tp; //case_tp表示查验类型
string temp,day,room; //临时变量,时间,考场
cin>>n>>m;
vector<ST> v(n),ans; //v用于存储数据,ans用于存放答案
for(int i=0;i<n;i++)
cin>>v[i].id>>v[i].score; //读入原始数据
for(int i=1;i<=m;i++){ //进行查验
int cnt=0; //用于输出个数
cin>>case_tp>>temp; //读入查验类型和查验参数
cout<<"Case "<<i<<": "<<case_tp<<' '<<temp<<'\n';
ans.clear(); //初始化ans数组
if(case_tp==1){ //第一种类型
for(int j=0;j<n;j++) //找到同一个级别的考生放入输出的数组中
if(v[j].id[0]==temp[0]) ans.push_back(v[j]);
sort(ans.begin(),ans.end(),cmp); //按照要求排序并输出
for(int j=0;j<ans.size();j++){
cout<<ans[j].id<<' '<<ans[j].score<<'\n';
cnt++;
}
}
else if(case_tp==2){ //第二种类型
int sum=0,num=0; //用于统计总人数和总分分数
for(int j=0;j<n;j++){
room=v[j].id.substr(1,3); //遍历原始数据获取每个考生的考场号
if(room==temp){ //如果和查验的考场号相同,则累计人数和总分
num++;
sum+=v[j].score;
}
}
if(num) {printf("%d %d\n",num,sum);cnt++;} //当人数不为0时,输出并把标记cnt+1
}
else{
unordered_map<string,int> mp; //创建考场和人数的对应关系
for(int j=0;j<n;j++){ //遍历数据,获取考试日期和考场号
day=v[j].id.substr(4,6);
room=v[j].id.substr(1,3);
if(day==temp) //对应考场的人数统计+1
mp[room]++;
}
ST t; //这里发现如果把人数放在学生分数位置,考场号放在准考证号位置,两者排序规则相同,所以用于借用
for(auto it=mp.begin();it!=mp.end();it++){ //把考场号和人数组成结构体放入输出的数组中
t.id=it->first; t.score=it->second;
ans.push_back(t);
}
sort(ans.begin(),ans.end(),cmp); //按照要求排序后输出
for(int j=0;j<ans.size();j++){
cout<<ans[j].id<<' '<<ans[j].score<<'\n';
cnt++;
}
}
if(cnt==0) puts("NA"); //如果当前类型没有输出,则查询结果为空,输出NA
}
return 0;
}