HRZ的序列
这是一道需要把数组开大点的题,比如我开的1e4+10,然后它一直WA,我到处找错误,实在找不出来了
然后我把数组的maxn换成了1e5+10,它就过了,我表示emmmm
#include<iostream>
#include<algorithm>
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<n;j++)
cin>>a[j];
sort(a,a+n,less<long long int>());
if(a[0]==a[n-1]){
cout<<"YES"<<endl;
return;
}
for(int j=1;j<n;j++){
if(a[0]==a[j]) continue;
else{
k=a[j]-a[0];
tag=j;
break;
}
}
if(a[tag]==a[n-1]){
cout<<"YES"<<endl;
return;
}
for(int j=tag+1;j<n;j++){
if(a[j]-a[tag]!=k && a[j]-a[tag]!=0){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin>>t;
for(int i=0;i<t;i++){
cin>>n;
judge();
}
return 0;
}
HRZ学英语
分析,此题要求输出最小字典序的字母序列,开始我犯了
一个严重错误,以为必须满足顺序A~Z输出都是
A~Z,然后WA了半天。
然后这个题的做法和尺取相似,每次取26个字母,如果满足A~Z26个字母
各出现1次,那么就满足条件,更新答案,输出最小字典序的答案
Codes
#include<iostream>
#include<cstring>
#include<cstdio>
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<n){
int flag=1;
memset(a,0,sizeof(a));
for(int i=0;i<26;i++){
if(str[i+l]-'A'>=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<<str[i];
else cout<<s[++tag];
}
return;
}
cout<<"-1"<<endl;
}
int main(){
scanf("%s",&str);getchar();
n=strlen(str);
judge();
return 0;
}
咕咕东的奇妙序列
这道题所谓的序列,其实它长这样
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<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using 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)<k) ans=mid,l=mid+1 ;
else r=mid-1;
}
k-=gains(ans,1);
l=0,r=ans+1;
while(l<=r){
mid=(l+r)/2;
if(gains(mid,0)<k) ans=mid,l=mid+1;
else r=mid-1;
}
k-=gains(ans,0);
ans++;
string str=to_string(ans);
printf("%d\n",str[k-1]-'0');
}
}
int main(){
scanf("%lld",&q);
check();
return 0;
}