本文共 1691 字,大约阅读时间需要 5 分钟。
这是一道需要把数组开大点的题,比如我开的1e4+10,然后它一直WA,我到处找错误,实在找不出来了然后我把数组的maxn换成了1e5+10,它就过了,我表示emmmm
#include#include using namespace std;const int maxn=1e5+10;int t,n,tag;long long int k,a[maxn];void judge(){ for(int j=0;j >a[j]; sort(a,a+n,less ()); if(a[0]==a[n-1]){ cout<<"YES"< >t; for(int i=0;i >n; judge(); } return 0;}
分析,此题要求输出最小字典序的字母序列,开始我犯了
一个严重错误,以为必须满足顺序A~Z输出都是 A~Z,然后WA了半天。 然后这个题的做法和尺取相似,每次取26个字母,如果满足A~Z26个字母 各出现1次,那么就满足条件,更新答案,输出最小字典序的答案
Codes
#include#include #include using namespace std;const int maxn=1e6+10;int n,a[30];char str[maxn],s[30];void judge(){ int l=0,r=25; while(r =0 && str[i+l]-'A'<26) a[str[i+l]-'A']++; if(a[str[i+l]-'A'] > 1) flag=0; } if(flag==0){ l++;r++; continue; } int tag=0; for(int i=0;i<26;i++) if(a[i]==0) s[++tag]=(char)(i+'A'); tag=0; for(int i=l;i<=r;i++){ if(str[i]!='?') cout<
这道题所谓的序列,其实它长这样
1 1 2 1 2 3 1 2 3 4 ··· 必须注意的是到10的时候,就有2个数字,前面n*(n+1)/2,数字和n<10, 可以把它看成一个等差数列,等差d前期1,后面2,再后面就一直d++,因为位数增多,所以d会跟着增加
Codes
#include#include #include #define ll long longusing namespace std;ll q,k;ll gains(ll x,int flag){ ll cnt=1,sum=0,sum1=0,n=0,d=0; while(1){ cnt*=10;d++; if(x>cnt-1){ n=cnt-cnt/10; sum+=(sum1+d)*n+n*(n-1)/2*d; sum1+=n*d; } else{ n=x-cnt/10+1; sum+=(sum1+d)*n+n*(n-1)/2*d; sum1+=n*d; break; } } return flag ? sum:sum1;}void check(){ ll l,r,mid,ans; while(q--){ scanf("%lld",&k); l=0,r=1e9; while(l<=r){ mid=(l+r)/2; if(gains(mid,1)
转载地址:http://fdwzi.baihongyu.com/