《算法笔记》 第三章学习笔记
编译环境: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;
}