《算法笔记》 第四章学习笔记
编译环境:codeblocks20.03
备注:本文留作作者自用,如有错误敬请指出
4.1节
【PATA1025】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student{
int roomr;//考场内排名
char id[14];//准考证号
int grade;//分数
int r;//总排名
int roomid;//考场号
}stu[30000];
bool cmp(student a,student b){
if(a.grade!=b.grade) return a.grade>b.grade;
else return strcmp(a.id,b.id)<0;
}
int main()
{
int n;
scanf("%d",&n);
int m=0;
int cnt=0;
int x;
for(int j=0;j<n;j++){
int k;
scanf("%d",&k);
cnt++;
x=m;
for(int w=0;w<k;w++){
scanf("%s %d",stu[m].id,&stu[m].grade);
stu[m].roomid=cnt;
m++;
}
sort(stu+x,stu+m,cmp);
stu[x].roomr=1;
for(int i=x+1;i<m;++i){//考场内排序
if(stu[i].grade==stu[i-1].grade)
stu[i].roomr=stu[i-1].roomr;
else stu[i].roomr=i-x+1;
}
}
sort(stu,stu+m,cmp);
stu[0].r=1;
for(int i=1;i<m;++i){//总排序
if(stu[i].grade==stu[i-1].grade)
stu[i].r=stu[i-1].r;
else stu[i].r=i+1;
}
printf("%d\n",m);
for(int i=0;i<m;++i){
printf("%s %d %d %d\n",stu[i].id,stu[i].r,stu[i].roomid,stu[i].roomr);
}
return 0;
}
【PATB1015】
#include<cstdio>//重要的是分类
#include<cstring>
#include<algorithm>
using namespace std;
struct student{
char id[10];
int de,cai,sum;
int flag;
}stu[100010];
bool cmp(student a,student b){
if(a.flag!=b.flag) return a.flag<b.flag;
else if(a.sum!=b.sum) return a.sum>b.sum;
else if(a.de!=b.de) return a.de>b.de;
else return strcmp(a.id,b.id)<0;
}
int main()
{
int n,m=0,low,high;
scanf("%d %d %d",&n,&low,&high);
for(int i=0;i<n;++i){
scanf("%s %d %d",stu[i].id,&stu[i].de,&stu[i].cai);
if(stu[i].de>=low &&stu[i].cai>=low) m++;
stu[i].sum=stu[i].de+stu[i].cai;
if(stu[i].de>=high &&stu[i].cai>=high) stu[i].flag=1;
else if(stu[i].de>=high &&stu[i].cai<high) stu[i].flag=2;
else if(stu[i].de>=stu[i].cai) stu[i].flag=3;
else stu[i].flag=4;
}
sort(stu,stu+n,cmp);
printf("%d",m);
for(int i=0;i<n;++i){
if(stu[i].de<low ||stu[i].cai<low)
continue;
else{
printf("\n%s %d %d",stu[i].id,stu[i].de,stu[i].cai);
}
}
return 0;
}
【PATA1012】
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
char name[]={'A','C','M','E'};
struct student{
int id;
int grade[4];
}stu[2010];
int ran[10000000][4]={0};
int now;
bool cmp(student a,student b){
return a.grade[now]>b.grade[now];
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;++i){
scanf("%d %d %d %d",&stu[i].id,&stu[i].grade[1],&stu[i].grade[2],&stu[i].grade[3]);
stu[i].grade[0]=round((stu[i].grade[1]+stu[i].grade[2]+stu[i].grade[3])/3.0)+0.5;
}
for( now=0;now<4;++now){
sort(stu,stu+n,cmp);
ran[stu[0].id][now]=1;
int j;
for( j=1;j<n;++j){
if(stu[j].grade[now]==stu[j-1].grade[now])
ran[stu[j].id][now]= ran[stu[j-1].id][now];
else ran[stu[j].id][now]=j+1;
}
}
for(int i=0;i<m;++i){
int fin;
scanf("%d",&fin);
if(ran[fin][0]==0) printf("N/A\n");
else {
int k=0;
for(int p=0;p<4;++p){
if(ran[fin][p]<ran[fin][k])
k=p;
}
printf("%d %c\n",ran[fin][k],name[k]);
}
}
return 0;
}
【PATA1028】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student{
int id;
char name[10];
int grade;
}stu[100010];
bool cmp1(student a,student b){
return a.id<b.id;
}
bool cmp2(student a,student b){
if(strcmp(a.name,b.name)!=0)
return strcmp(a.name,b.name)<0;
else return a.id<b.id;
}
bool cmp3(student a,student b){
if(a.grade!=b.grade)
return a.grade<b.grade;
else return a.id<b.id;
}
int main()
{
int n,c;
scanf("%d %d",&n,&c);
for(int i=0;i<n;++i){
scanf("%d %s %d",&stu[i].id,stu[i].name,&stu[i].grade);
}
if(c==1) sort(stu,stu+n,cmp1);
else if(c==2) sort(stu,stu+n,cmp2);
else sort(stu,stu+n,cmp3);
for(int i=0;i<n;++i){//输出格式要注意一下
printf("%06d %s %d\n",stu[i].id,stu[i].name,stu[i].grade);
}
return 0;
}
【PATA1055】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct people{
int age;
char name[10];
int worth;
}rich[100010];
bool cmp(people a,people b){
if(a.worth!=b.worth)
return a.worth>b.worth;
else if(a.age!=b.age)
return a.age<b.age;
else
return strcmp(a.name,b.name)<0;
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;++i){
scanf("%s %d %d",rich[i].name,&rich[i].age,&rich[i].worth);
}
sort(rich,rich+n,cmp);
int m=k;
while(k--){
printf("Case #%d:\n",m-k);
int cnt,amin,amax;
scanf("%d %d %d",&cnt,&amin,&amax);
int flag=0;
for(int i=0;i<n&&flag<cnt;++i){
if(rich[i].age>=amin&&rich[i].age<=amax){
printf("%s %d %d\n",rich[i].name,rich[i].age,rich[i].worth);
flag++;
}
}
if(flag==0)
printf("None\n");
}
return 0;
}
【PATA1075】
#include<cstdio>//最后两个测试点死活通过不了,我大脑死机了谔谔
#include<cstring>
#include<algorithm>
using namespace std;
struct student{
int id;
int ques[10],isques[10];
int sum;
int per,flag,fflag;
int r;
int first[10];
}stu[10010];
bool cmp(student a,student b){
if(a.sum!=b.sum)
return a.sum>b.sum;
else if(a.per!=b.per)
return a.per>b.per;
else return a.id<b.id;
}
int main()
{
int n,k,m;
scanf("%d %d %d",&n,&k,&m);
n+=1;
for(int i=0;i<n;++i){
stu[i].sum=0;stu[i].per=0;
stu[i].flag=0;stu[i].fflag=0;
for(int j=0;j<10;++j){
stu[i].ques[j]=0;
stu[i].isques[j]=0;
stu[i].first[j]=0;
}
}
int score[10];
for(int i=0;i<k;++i){
scanf("%d",&score[i]);
}
int id,num,mark;
for(int i=0;i<m;++i){
scanf("%d %d %d",&id,&num,&mark);
stu[id].isques[num]=1;
if(mark==score[num-1]&&stu[id].first[num]!=1)
{stu[id].per++;
stu[id].fflag++;
stu[id].first[num]=1;}
else if(mark<0&&stu[id].first[num]!=-1)
{mark=0;stu[id].first[num]=0;}
else { stu[id].flag++;
stu[id].fflag++;}
if(stu[id].ques[num]==0)
{stu[id].ques[num]=mark;
stu[id].sum+=mark;}
else if(stu[id].ques[num]<mark){
stu[id].sum=stu[id].sum-stu[id].ques[num]+mark;
stu[id].ques[num]=mark;
}
stu[id].id=id;
}
sort(stu,stu+n,cmp);
stu[0].r=1;
for(int i=1;i<n;++i){
if(stu[i].sum==stu[i-1].sum)
stu[i].r=stu[i-1].r;
else stu[i].r=i+1;
}
for(int i=0;i<n;++i){
if(stu[i].flag==0||stu[i].fflag==0) continue;
else{
printf("%d %05d %d",stu[i].r,stu[i].id,stu[i].sum);
for(int j=1;j<k+1;++j){
if(stu[i].isques[j])
printf(" %d",stu[i].ques[j]);
else printf(" -");
}
printf("\n");
}
}
return 0;
}
【PATA1083】
#include<cstdio>
#include<algorithm>
using namespace std;
struct student{
char name[11],id[11];
int grade;
}stu[10010];
bool cmp(student a,student b){
return a.grade>b.grade;
}
int main()
{
int n,grade1,grade2;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%s %s %d",stu[i].name,stu[i].id,&stu[i].grade);
}
scanf("%d %d",&grade1,&grade2);
sort(stu,stu+n,cmp);
int flag=0;
for(int i=0;i<n;++i){
if(stu[i].grade>=grade1&&stu[i].grade<=grade2){
printf("%s %s\n",stu[i].name,stu[i].id);
flag=1;
}
}
if(!flag) printf("NONE");
return 0;
}
跳过了好多谔谔
4.2节
【PATB1029】
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
int main()
{
char str1[81],str2[81];
bool HashTable[128]={false};
cin.getline(str1,81);//gets函数不能用了
cin.getline(str2,81);
for(int i=0;i<strlen(str1);++i){
int j;
char c1,c2;
for(j=0;j<strlen(str2);++j){
c1=str1[i];
c2=str2[j];
if(c1>='a'&&c1<='z') c1-=32;
if(c2>='a'&&c2<='z') c2-=32;
if(c1==c2)
break;
}
if(j==strlen(str2)&&HashTable[c1]==false)
{ printf("%c",c1);
HashTable[c1]++;
}
}
return 0;
}
【PATB1033】
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
int main()
{
char str1[256],str2[100010];
bool HashTable[128]={false};
int fail=0,cnt=0;
cin.getline(str1,256);
cin.getline(str2,100010);
int l1,l2;
l1=strlen(str1);//这一点我一直没有注意到,原来这样做可以避免每次判断时都要重新计算导致运行超时
l2=strlen(str2);
for(int i=0;i<l1;++i){
HashTable[str1[i]]=true;
if(str1[i]>='a'&&str1[i]<='z') HashTable[str1[i]-32]=true;
if(str1[i]>='A'&&str1[i]<='Z') HashTable[str1[i]+32]=true;
if(str1[i]=='+')
fail=1;
}
char c1,c2;
for(int i=0;i<l2;++i){
c2=str2[i];
if(fail==1&&c2>='A'&&c2<='Z') continue;
else{
if(HashTable[c2]==true) continue;
else {printf("%c",c2);
cnt++;}
}
}
if(cnt==0) printf("\n");
return 0;
}
【PATB1038】
#include<cstdio>
int grade[110];
int main()
{
int n,score,k;
scanf("%d",&n);
while(n--){
scanf("%d",&score);
grade[score]++;
}
scanf("%d",&k);
while(k--){
scanf("%d",&score);
printf("%d",grade[score]);
if(k) printf(" ");
}
return 0;
}
【PATB1039】
#include<cstdio>
#include<cstring>
int color[128];
int main()
{
char have[1010],want[1010];
scanf("%s",have);
scanf("%s",want);
int cnt1=strlen(have);
for(int i=0;i<cnt1;++i){
color[have[i]]++;
}
int cnt2=strlen(want);
int les=0;
for(int i=0;i<cnt2;++i){
if(color[want[i]]<=0)
les++;
color[want[i]]--;
}
if(les>0) printf("No %d",les);
else printf("Yes %d",cnt1-cnt2);
return 0;
}
【PATB1042】
#include<cstdio>
#include<cstring>
#include<cctype>
int cnt[128];
int main()
{
char s[1010]={};
char ch;
scanf("%c",&ch);
int len=0;
while(ch!='\n'){
if(isalpha(ch)){//统计时不区分大小写
if(ch>='A'&&ch<='Z')
ch=tolower(ch);
cnt[ch]++;}
scanf("%c",&ch);
len++;
}
int max=-1;
for(int i=0;i<128;++i){
if(max<cnt[i]){
max=cnt[i];
ch=(char)i;
}
else if(max==cnt[i]&&ch>(char)i){
max=cnt[i];
ch=(char)i;
}
}
ch=tolower(ch);//输出小写字母
printf("%c %d",ch,max);
return 0;
}
【PATB1043】
#include<cstdio>//暴力枚举
#include<cstring>
int cnt[128];
int main()
{
char s[10010]={};
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;++i){
cnt[s[i]]++;
}
for(int i=0;i<10001;++i){
if(cnt['P']>0){printf("P");cnt['P']--;}
if(cnt['A']>0){printf("A");cnt['A']--;}
if(cnt['T']>0){printf("T");cnt['T']--;}
if(cnt['e']>0){printf("e");cnt['e']--;}
if(cnt['s']>0){printf("s");cnt['s']--;}
if(cnt['t']>0){printf("t");cnt['t']--;}
}
return 0;
}
【PATB1047】
#include<cstdio>//没看出来队员编号有啥用啊
int team[1001];
int main()
{
int n;
scanf("%d",&n);
int t,m,g;
while(n--){
scanf("%d-%d %d",&t,&m,&g);
team[t]+=g;
}
int max=-1,mmax;
for(int i=0;i<1001;++i){
if(max<team[i]){
max=team[i];
mmax=i;
}
}
printf("%d %d",mmax,max);
return 0;
}
【PATA1041】
#include<cstdio>
int num[10001];//用于计数各个数据的个数
int rin[100010];//按照读入的顺序存储数据
int uni;
int main()
{
int n,m,uniq;
scanf("%d",&n);
int i=0,k;
while(n--){
scanf("%d",&m);
num[m]++;
rin[i++]=m;
}
for( k=0;k<100010;++k){
if(num[rin[k]]==1){
uni=rin[k];
break;}
}
if(k==100010)
printf("None");
else printf("%d",uni);
return 0;
}
【PATA1050】
#include<cstdio>
#include<cstring>
int cnt[128];
int main()
{
char s1[10010],s2[10010];
char c;
scanf("%c",&c);
for(int i=0;c!='\n';++i){
s1[i]=c;
cnt[c]++;
scanf("%c",&c);
}
scanf("%c",&c);
for(int i=0;c!='\n';++i){
s2[i]=c;
cnt[c]=0;
scanf("%c",&c);
}
int len=strlen(s1);
for(int i=0;i<len;++i){
if(cnt[s1[i]]!=0)
printf("%c",s1[i]);
}
return 0;
}
【PATA1005】
#include<cstdio>
#include<algorithm>
using namespace std;
int num[10010];//显然覆盖到的数远不止100,所以数组要设置得大一点
bool cmp(int a,int b){
return a>b;
}
void guess(int n){//把验证3n+1猜想的过程直接写成函数调用了
while(n!=1){
if(n%2==0)
n=n/2;
else n=(3*n+1)/2;
num[n]=0;
}
}
int main()
{
int n,m;
int i=0,cnt=0;
int store[110];
scanf("%d",&n);
while(n--){
scanf("%d",&m);
num[m]=1;
store[i++]=m;
}
sort(store,store+i,cmp);
for(int j=0;j<i;++j){
guess(store[j]);
}
for(int j=0;j<i;++j){
if(num[store[j]])
cnt++;
}
for(int j=0;j<i;++j){
if(num[store[j]]){
printf("%d",store[j]);
cnt--;
if(cnt) printf(" ");
}
}
return 0;
}
【PATA1048】
#include<cstdio>
#include<algorithm>
using namespace std;
int num[1010];
bool cmp(int a,int b){
return a<b;
}
int main()
{
int have,need,coin;
int hav[100010];
scanf("%d %d",&have,&need);
int i=0;
while(have--){
scanf("%d",&coin);
num[coin]++;
hav[i++]=coin;
}
sort(hav,hav+i,cmp);//先给已有硬币排好序,方便找最小a
int j;
for( j=0;j<i;++j){
if(num[need-hav[j]]){
if(need==2*hav[j]&&num[hav[j]]<2) continue;//当找到的a,b相等时要确保口袋里有两个以上a
printf("%d %d",hav[j],need-hav[j]);
break;
}
}
if(j==i) printf("No Solution");
return 0;
}