《算法笔记》 第四章4.1、4.2节学习笔记

《算法笔记》 第四章学习笔记

编译环境: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值