HRZ~序列+学英语-咕咕东的奇妙序列

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;   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值