还是A-D的题解,因为我不会EFG。不会还这么理直气壮???
老规矩,比赛链接:ABC336
签到题耶。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
cout<<'L';
for(int i=0;i<n;i++)
cout<<'o';
cout<<'ng'<<endl;
return 0;
}
就是问n的二进制末尾有几个0。根据短除法倒取余数,直接一直除2,直到有余数就停。最后数一下一共除了几次就OK了。
#include <bits/stdc++.h>
using namespace std;
int ctz(int n){
while(n%2==0){
res++;
n/=2;
}
return res;
}
int main(){
int n;
cin>>n;
cout<<ctz(n)<<endl;
return 0;
}
然而赛时我这个蒟蒻就止步于此了......
赛时我由于一个一个模拟而成功的TLE了,赛后看了别人的代码才恍然大悟。为什么我写的代码这么低劣,别人的那么精妙?
思路大概是这样滴:由于答案很大,肯定用string存,首先n要减1因为不存在00的情况。接下来n每次都除5,ans+='0'+n%5*2,最后一步——要reverse一下,因为短除法倒取余数。(这场比赛怎么这么多短除法) 还有,别忘了特判ans为空的情况。
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin>>n;
string ans;
while(n){
ans+='0'+n%5*2;
n/=5;
}
reverse(ans.begin(),ans.end());
if(ans.empty())
ans="0";
cout<<ans<<endl;
return 0;
}
怎么说,这题不是很难(那你还做不对),但是细节很多。要注意。
这题赛时都没看,我太菜了。
说一下官方题解的思路。就是用表示以结尾的最长金字塔数列;表示以开头的最长的金字塔数列。然后,我们有和(是从后往前推)。最后,答案就是。
#include <bits/stdc++.h>
using namespace std;
int a[200005],l[200005],r[200005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
l[i]=min(a[i],l[i-1]+1);
for(int i=1;i<=n;i++)
r[i]=min(a[i],r[i+1]+1);
int ans=-1;
for(int i=1;i<=n;i++)
ans=max(ans,min(l[i],r[i]));
cout<<ans<<endl;
return 0;
}
OK,以上就是Atcoder ABC336 A-D的题解了。我们下期再见。ヾ( ̄▽ ̄)Bye~Bye~
友情提醒:本期的所有代码都有问题,请不要直接Ctrl C+Ctrl V。