ATcoder(atcoder.jp)A~D
由于比赛试题全英文,非Markdown,博主由于没有时间,不方便把题架搬运过来,请谅解!只好将题目链接至于下方。
A - Count Down
题目描述
给定一个整数n,输出小于n的非零数
代码展示
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n>=0){
cout<<n<<endl;
n--;
}
return 0;
}
B - Sandwich Number
题目描述
给定一个长度为8的字符串s,符合以下条件:
- 第一个字母是大写字母
- 中途六个数字在 100000 100000 100000到 999999 999999 999999 之间
- 最后一个字母是大写字母
代码展示
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int n=0;
for(int i=1;i<=6;i++){
n*=10;
n+=s[i]-'0';
}
if(s[0]>='A'&&s[0]<='Z'&&s[7]>='A'&&s[7]<='Z')
if(n>=100000&&n<=999999)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
else
cout<<"No"<<endl;
return 0;
}
C - Circular Playlist
题目描述
第一行,输入一个n,t(t代表音乐播放时间)
第二行,输入n个整数(n代表每首歌的时长)
从第一首歌开始循环播放,输出第t秒时播放第几首歌以及已经播放的时间,没有样例是刚好播完的歌
代码展示(赛时超时代码一)
#include <bits/stdc++.h>
using namespace std;
int n,a[100100];
long long t;
int main(){
cin>>n>>t;
for(int i=1;i<=n;i++)
cin>>a[i];
while(true){
bool f=false;
int p;
for(int i=1;i<=n;i++){
t-=a[i];
if(t<=0){
p=i;
f=true;
break;
}
}
if(f){
cout<<p<<" "<<t+a[p]<<endl;
break;
}
}
return 0;
}
超时原因:算法复杂度O(n*不定)
代码展示(赛时超时代码二)
#include <bits/stdc++.h>
using namespace std;
int n,a[100100];
long long t;
int main(){
cin>>n>>t;
for(int i=1;i<=n;i++)
cin>>a[i];
long long cn=0;
for(int i=1;i<=n;i++)
cn+=a[i];
while(t>0){
t-=cn;
}
for(int i=n;i>=0;i--){
t+=a[i];
if(t>0){
cout<<i<<" "<<t<<endl;
break;
}
}
return 0;
}
超时原因:
while(t>0){
t-=cn;
}
当t很大,cn很小,就会超时
代码展示(赛时超时代码三)
优化思路:用t%cn,可是舍去循环
#include <bits/stdc++.h>
using namespace std;
int n,a[100100];
long long t;
int main(){
cin>>n>>t;
long long cn=0;
for(int i=1;i<=n;i++){
cin>>a[i];
cn+=a[i];
}
t%=cn;
for(int i=1;i<=n;i++){
if(t>a[i])
t-=a[i];
else{
cout<<i<<" "<<t<<endl;
break;
}
}
return 0;
}
算法复杂度:O(n)
D - Max Multiple
没有实践