思路讲解

这是判断字符串可爱度的代码(也就是这场的D题),可以发现我们发现要尽量让一个字母倒数第二次出现位置尽可能小,第二次出现位置尽可能大,才有可能使字符串“可爱度”尽可能小(当然,如果该字符没有出现或只出现一次,那自然不会对可爱度有贡献)
我们先来证明一下这个无解条件
1
| if(N-26>M) {cout<<"NO\n";return;}
|
所以说字符串长度>26,可爱度必然不可能=0
参考题解
https://blog.nowcoder.net/n/906fd00ff386438b9d63013a3760e73a

通过取模让各个字符之间的距离保持在N-M+1(a……a的长度为N-M+1)
1 2 3 4 5 6 7 8 9 10 11
| void solve(){ cin>>N>>M; if(N<=M) {cout<<"NO\n";return;} if(N-26>M) {cout<<"NO\n";return;} cout<<"YES\n"; for(int i=0;i<N;++i) { cout<<char('a'+i%(N-M)); } cout<<'\n'; }
|
AC代码
AC
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75110195
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef pair<int,int> pii; typedef array<ll,3> arr; const ll MAXN=static_cast<ll>(2e5)+10; ll N,T,M;
void solve(){ cin>>N>>M; if(N<=M) {cout<<"NO\n";return;} if(N-26>M) {cout<<"NO\n";return;} cout<<"YES\n"; for(int i=0;i<N;++i) { cout<<char('a'+i%(N-M)); } cout<<'\n'; } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>T; while (T--) { solve(); } return 0; }
|
心路历程(WA,TLE,MLE……)