《算法笔记》第三章3.2节、3.3节、3.4节学习笔记

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

编译环境:codeblocks20.03
备注:本文留作作者自用,如有错误敬请指出

3.2节
【PAT B1041】

#include<cstdio>//顺序查找
int main()
{
long long admiss[1010];
int attempt[1010],exam[1010];
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
    scanf("%lld%d%d",&admiss[i],&attempt[i],exam[i]);
}
int m,num;
scanf("%d",&m);
for(int i=0;i<m;++i){
    scanf("%d",&num);
    for(int j=0;j<1010;j++){
        if(attempt[j]==num)
            printf("%lld %d\n",admiss[j],exam[j]);
    }
}
 	return 0;
}

【PAT B1004】

#include<cstdio>//在格式上花了太多时间
#include<string>
#include<iostream>
using std::string;
using std::cin;
using std::cout;
struct student{
  string name;
  string id;
  int score;
}stu[1010];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
    cin>>stu[i].name>>stu[i].id>>stu[i].score;
}
int max=-1,min=101,smax,smin;
for(int i=0;i<n;++i){
    if(stu[i].score>max){
        max=stu[i].score;
        smax=i;
    }
    if(stu[i].score<min){
        min=stu[i].score;
        smin=i;
    }
}
cout<<stu[smax].name<<" "<<stu[smax].id<<"\n";
cout<<stu[smin].name<<" "<<stu[smin].id;
 	return 0;
}

【PAT B1028】

#include<cstdio>//在超时的边缘反复试探
#include<string>
#include<iostream>
using std::string;
using std::cin;
using std::cout;
struct people{
  string name;
  int year,month,day;
  long long old;//某人活的天数
}p[100010];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
    cin>>p[i].name;
    scanf("%d/%d/%d",&p[i].year,&p[i].month,&p[i].day);
    //假设一年是365天,一个月是30天
    p[i].old=(2014*365+9*30+6)-((p[i].year)*365+(p[i].month)*30+p[i].day);
}
int cnt=0;
int max=-1,min=73001,pmax,pmin;
for(int i=0;i<n;++i){
    if(p[i].old<=73000&&p[i].old>=0) {//这里边界比较麻烦,根据运行结果来看2014/09/06和1814/09/06当天出生的也算
            cnt++;
            if(p[i].old>max) {max=p[i].old;pmax=i;}
            if(p[i].old<min) {min=p[i].old;pmin=i;}
    }
}
if(cnt){printf("%d ",cnt);
cout<<p[pmax].name<<" "<<p[pmin].name;}
else printf("0");
 	return 0;
}

【PAT A1011】

#include<cstdio>//暴力枚举
struct count{
   char cwin='W',ctie='T',clost='L';
   char max;
   double win,tie,lost;
}cnt[4];
int main()
{
for(int i=1;i<4;++i){
    scanf("%lf %lf %lf",&cnt[i].win,&cnt[i].tie,&cnt[i].lost);
}
int k=1;
double result=1;
for(int i=1;i<4;++i){
    cnt[i].max=(cnt[i].win>cnt[i].tie?
                (cnt[i].win>cnt[i].lost?
                 cnt[i].cwin:cnt[i].clost):(cnt[i].tie>cnt[i].lost?
                                            cnt[i].ctie:cnt[i].clost));
    printf("%c ",cnt[i].max);
    result*=(cnt[i].win>cnt[i].tie?
                (cnt[i].win>cnt[i].lost?
                 cnt[i].win:cnt[i].lost):(cnt[i].tie>cnt[i].lost?
                                            cnt[i].tie:cnt[i].lost));
}
printf("%.2lf",(result*0.65-1)*2);
 	return 0;
}

【PAT A1006】

#include<cstdio>//用c风格字符串输入输出了
struct people{
   char id[16];
   int in,out;
}p[1000];
int main()
{
    int n;
    scanf("%d",&n);
    int inhour,inmin,insec,outhour,outmin,outsec;
    for(int i=0;i<n;++i){
        scanf("%s %d:%d:%d %d:%d:%d",
              &p[i].id,&inhour,&inmin,&insec,
              &outhour,&outmin,&outsec);
              p[i].in=inhour*3600+inmin*60+insec;
              p[i].out=outhour*3600+outmin*60+outsec;
    }
    int j=0,k=0;
    for(int i=0;i<n;++i){
        if(p[i].in<p[k].in) k=i;
        if(p[i].out>p[j].out) j=i;
    }
    printf("%s %s",p[k].id,p[j].id);
 	return 0;
}

【PAT A1036】

#include<cstdio>
struct student{
   char id[15],name[15];
   char gender;
   int grade;
}stu[1000];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%s %c %s %d",
              &stu[i].name,&stu[i].gender,
              &stu[i].id,&stu[i].grade);
    }
    int fmax=-1,mmin=101,ffmax,mmmin;
    int fflag=0,mflag=0;
    for(int i=0;i<n;++i){
        if(stu[i].gender=='F'){
                fflag=1;
                if(stu[i].grade>fmax){
                fmax=stu[i].grade;
                ffmax=i;}
        }else{
            mflag=1;
            if(stu[i].grade<mmin){
                mmin=stu[i].grade;
                mmmin=i;}
        }
    }
    if(fflag) printf("%s %s\n",stu[ffmax].name,stu[ffmax].id);
    else printf("Absent\n");
    if(mflag) printf("%s %s\n",stu[mmmin].name,stu[mmmin].id);
    else printf("Absent\n");
    if(fflag&&mflag) printf("%d",stu[ffmax].grade-stu[mmmin].grade);
    else printf("NA");
 	return 0;
}

3.3节
【PAT B1036】

#include<cstdio>
int main()
{
    int n;
    char c;
    scanf("%d %c",&n,&c);
    for(int i=0;i<n;++i)//输出第一行
       printf("%c",c);
    printf("\n");
    for(int i=0;i<(n+1)/2-2;++i){//因为行数要四舍五入取整
        printf("%c",c);
        for(int j=0;j<n-2;++j)
                 printf(" ");
        printf("%c\n",c);
    }
    for(int i=0;i<n;++i)//输出最后一行
       printf("%c",c);
 	return 0;
}

【PAT B1027】

#include<cstdio>
#include<cmath>
int main()
{
    int n;
    char c;
    scanf("%d %c",&n,&c);
   int cnt=0;//用于计数打印的符号数
    int k=sqrt((double)(n+1)/2);//k是上面三角形的最大层数,调用sqrt函数时要用强制类型转换
    for(int i=0;i<k;++i){//先打印上半个沙漏,包括中点
        for(int j=0;j<i;j++)
           printf(" ");
        for(int j=0;j<2*k-1-2*i;j++)
        {printf("%c",c);
        cnt++;}
        printf("\n");
    }
    for(int i=0;i<k-1;++i){//再打印下半个无头沙漏
        for(int j=0;j<k-2-i;++j)
            printf(" ");
        for(int j=0;j<3+2*i;j++)
        { printf("%c",c);
         cnt++;}
        printf("\n");
    }
    printf("%d",n-cnt);
 	return 0;
}

【PAT A1031】

#include<cstdio>
#include<cstring>
int main()
{
    char s[100]={};
    scanf("%s",s);
    int n=strlen(s);
    int n1=(n+2)/3;//一列字符数
    int n2=n-2*n1+2;//最后一行字符数
    for(int i=0;i<n1-1;++i){
        printf("%c",s[i]);
        for(int j=0;j<n2-2;++j)
            printf(" ");
        printf("%c\n",s[n-1-i]);
    }
    for(int i=n1-1;i<n1+n2-1;++i){
        printf("%c",s[i]);
    }
 	return 0;
}

3.4节
【codeup 1928】

#include<cstdio>//这是我自己写的,结果没问题但就是通过不了,玉玉了
int main()
{
    long long year1,month1,day1,
        year2,month2,day2,n1,n2;
    scanf("%lld",&n1);
    scanf("%lld",&n2);
    if(n1>n2){
        int temp=n1;
        n1=n2;
        n2=temp;
    }
    year1=n1/10000;
    month1=(n1-10000*year1)/100;
    day1=n1-10000*year1-100*month1;
    year2=n2/10000;
    month2=(n2-10000*year2)/100;
    day2=n2-10000*year2-100*month2;
    n1=n2=0;
    int flag;
    for(int i=1;i<year1;++i){
            flag=0;
        if(!(i%400)||(!(i%4)&&(i%100)))
            flag=1;
        if(flag) n1+=366;
		else n1+=365;
    }
    if(!(year1%400)||(!(year1%4)&&(year1%100)))
            flag=1;
    for(int j=1;j<month1;++j){
            if(j==4||j==6||j==9||j==11)
                n1+=30;
            else if(j==2)
                n1+=(flag?29:28);
            else n1+=31;
        }
    for(int i=1;i<year2;++i){
         flag=0;
        if(!(i%400)||(!(i%4)&&(i%100)))
            flag=1;
        if(flag) n2+=366;
		else n2+=365;
    }
    if(!(year2%400)||(!(year2%4)&&(year2%100)))
            flag=1;
    for(int j=1;j<month2;++j){
            if(j==4||j==6||j==9||j==11)
                n2+=30;
            else if(j==2)
                n2+=(flag?29:28);
            else n2+=31;
        }
	if(n1!=n2)
      printf("%lld\n",n2+day2-n1-day1+1);
	else printf("2\n");
    getchar();
	getchar();
 	return 0;
}
#include<cstdio>//根据书上改正后
int isleap(int year){
if(((year%4==0)&&(year%100!=0))||(year%400==0))
     return 1;
else return 0;
}
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},
{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
int main()
{
    int year1,month1,day1,
        year2,month2,day2,n1,n2;
   while(scanf("%d%d",&n1,&n2)!=EOF){
    if(n1>n2){
        int temp=n1;
        n1=n2;
        n2=temp;
    }
    year1=n1/10000;
    month1=(n1-10000*year1)/100;
    day1=n1-10000*year1-100*month1;
    year2=n2/10000;
    month2=(n2-10000*year2)/100;
    day2=n2-10000*year2-100*month2;
	int cnt=1;
	while(year1<year2||month1<month2||day1<day2){
	   day1++;
	   if(day1==month[month1][isleap(year1)]+1){
	   month1++;
	   day1=1;
	   }
	   if(month1==13){
	       year1++;
	       month1=1;
	    }
	   cnt++;
	}
	printf("%d\n",cnt);
   }
 	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值