2021.08.19(AcWing每日一题
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int maxx=2e5+10; char s[maxx]; char c; int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); scanf("%s",&s); if(n==1){ printf("%c",s[0]); printf("\n"); continue; } int flag=0; for(int i=1;i<n;i++){ if(s[i]<s[i-1]&&flag==0){ c=s[i-1]; flag++; } } if(flag==0){ c=s[n-1]; } flag=0; for(int i=0;i<n;i++){ if(flag==0&&s[i]==c){ flag++; continue; } printf("%c",s[i]); } printf("\n"); } }
注:把贪心问题想成了dp,其实并不是dp,因为是字典序最小,所以只需要考虑最前面那个的s[i]>s[i+1]的位置就可,如果没有的话,就去掉最后面的那个字符,相同字母时,去掉一个字母字典序更小
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int maxx=2e5+10; int main(){ int t; scanf("%d",&t); while(t--){ int n,k; scanf("%d %d",&n,&k); for(int i=0;i<n/k;i++){ for(int j=0;j<k;j++){ char s='a'+j; printf("%c",s); } } for(int i=0;i<n-n/k*k;i++){ char s='a'+i; printf("%c",s); } printf("\n"); } }
注:只是注意这是前k个字母就好,然后水题