PTA刷题记录2

文章目录

一、L1-033 出生年

二、L1-039 古风排版

三、L1-043 阅览室

四、L1-046 整除光棍

五、L1-049 天梯赛座位分配
 


一、L1-033 出生年

由于要找最小满足条件,可以直接枚举。

那么问题转换为判断四个数中有几个数不同

1.由于每个数是0-9 所以可以用桶判断

2.逐个跑循环(由于只有四个数,所以可直接判断)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int y,n;
    cin>>y>>n;
    int i;
    for( i=y;;i++){
    	int cnt=1;
    	int a=i%10;
    	int b=i/10%10;
    	int c=i/100%10;
    	int d=i/1000;
    	if(a!=b&&a!=c&&a!=d)cnt++;//如果a是独特的,至少有两种数
    	if(b!=c&&b!=d)cnt++;
    	if(c!=d)cnt++;
    	if(cnt==n)break;
	}
	printf("%d %04d",i-y,i);
	return 0;
}

二、L1-039 古风排版

PTA | 程序设计类实验辅助教学平台

pta中数组不输出初始值,所以要将字符串补齐到n的倍数

#include<bits/stdc++.h>
using namespace std;
string a;
int cnt,n;
int main(){
	cin>>n;
	getchar();
	getline(cin,a);
    cnt=a.length();
    if(cnt%n!=0){
        for(int i=cnt%n;i<=n;i++)a+=" ";//要把字符串补齐
    }
    cnt=a.length();
	int k=cnt/n;
	for(int i=(k-1)*n;i<k*n;i++){//指针不能越过数组的有效数据
		for(int j=i;j>=0;j-=n){
			cout<<a[j];
		}
		if(i!=k*n-1)cout<<'\n';
	}
	return 0;
}

三、L1-043 阅览室

PTA | 程序设计类实验辅助教学平台

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

所以问题在于清空结构体数组,使得数据有效

#include<bits/stdc++.h>
using namespace std;
struct read{
	char jianzhi;
	int s,e;
}book[100005];
int main(){
	int n;
	cin>>n;
	int cnt=0,t=0,sum=0;
	while(cnt<n){
		int shuhao;
		char j,k;
		int st,en;
		cin>>shuhao;
		cin>>j;
		cin>>st;
		cin>>k;
		cin>>en;
		if(shuhao==0){
			cnt++;
		    if(t==0)cout<<0<<" "<<0<<'\n';
		    else {
		    	double m=sum*1.0/t;
		    	printf("%d %.0lf\n",t,m);
			}
			t=0;
			sum=0;
           memset(book,0,sizeof book);//第二天之前要清空结构体
		}
		else{
			if(j=='S'){
				book[shuhao].jianzhi=j;
				book[shuhao].s=st;
				book[shuhao].e=en;
			}
			else if(j=='E'&&book[shuhao].jianzhi=='S'){
				sum+=st*60+en-book[shuhao].s*60-book[shuhao].e;
				t++;
                book[shuhao].jianzhi=0;//可能只有‘E’的情况,所以需要避免
			}
		}
	}
	return 0;
}

四、L1-046 整除光棍

PTA | 程序设计类实验辅助教学平台

模拟除法的过程,注意到111....特殊的结构 只需模拟“光棍数”即可

#include<bits/stdc++.h>
using namespace std;
int main(){
    //freopen("text.txt","r",stdin);
    int x;
    cin>>x;
    int b=1,cnt=1;
    while(b<x){
    	b=b*10+1;
    	cnt++;	
	}
	while(b%x!=0){
		cout<<b/x;
		b=(b-b/x*x)*10+1;
		cnt++;
	}
	cout<<b/x<<" "<<cnt;
	return 0;
}

五、L1-049 天梯赛座位分配

PTA | 程序设计类实验辅助教学平台

题解:开三维数组 一重循环 总队数 ;二重循环 每个队员;三重循环 每个学校

举个栗子

感觉一开始的话挺难想的  

#include<bits/stdc++.h>
using namespace std;
int num[105]; 
int a[105][105][105];
int main(){
//freopen("text.txt","r",stdin);
  int n;
  cin>>n;
  int ma=0;
  for(int i=1;i<=n;i++){
  	cin>>num[i];
  	ma=max(ma,num[i]);//得到最多的队数
  }
  int pre=0;//为了比较前一个座位是不是本校同学
  int id=0;//遍历每一个座位
 
  for(int i=1;i<=ma;i++){//对队循环
  	for(int j=1;j<=10;j++){//对每个队员循环
  		for(int k=1;k<=n;k++){//对每个学校循环
  			if(i<=num[k]){
  				if(pre==k){
  					id+=2;
  					a[k][i][j]=id;
				  }
				else {
					id++;
					a[k][i][j]=id;
					pre=k;
				}
			  }
		  }
	  }
  }
  for(int i=1;i<=n;i++){
  	cout<<"#"<<i<<'\n';
  	for(int j=1;j<=num[i];j++){
  		for(int k=1;k<=10;k++){
  			if(k!=10)cout<<a[i][j][k]<<" ";
  			else cout<<a[i][j][k]<<'\n';
		  }
		
	  }
  }
  return 0;
}

总结:

最近感觉做题遇到瓶颈了,其实每一题都要具体分析,找到恰当的方法,刷题是为了保持思路的敏感度 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值