一、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中数组不输出初始值,所以要将字符串补齐到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 阅览室
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有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 整除光棍
模拟除法的过程,注意到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 天梯赛座位分配
题解:开三维数组 一重循环 总队数 ;二重循环 每个队员;三重循环 每个学校
举个栗子
感觉一开始的话挺难想的
#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;
}
总结:
最近感觉做题遇到瓶颈了,其实每一题都要具体分析,找到恰当的方法,刷题是为了保持思路的敏感度