Codeforces Round #666 (Div. 2)

待补:4/5
排名:5717/13870
A.Juggling Letters
题意:给你n个字符串,你可以将字符串任意拆分与拼接,问是否可以使着n个字符串全都相同。

分析:
统计26个小写英文字母的个数,之后判断每个字母的个数是否是n的倍数。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <string>
typedef long long ll;
const int N=1e5+10;
char f[1010];
int cnt[30];
int main(){
	
	
	int t;
	scanf("%d",&t);
	while(t--){
		int n,p=0;
		scanf("%d",&n);
		memset(cnt,0,sizeof cnt);
		for(int i=1;i<=n;i++){
			scanf("%s",f);
			int len=strlen(f);
			for(int i=0;i<len;i++){
				cnt[f[i]-'a']++;
			}
		}
		for(int i=0;i<30;i++){
			if(cnt[i]%n) {
				printf("NO\n");
				p=1;
				break;
			}
		}
		if(p==0)
		printf("YES\n");
	}
	
	
	
	
	return 0;
} 

B.Power Sequence
题意:给你一串全部由正整数组成的序列a,对于每个ai如果存在一个正整数c使得每个ai=c^i(0<=i<=n-1)则称该序列为Power Sequence,现在给你一个序列,你每次可以任意改变序列的次序并可以给ai-1或ai+1,操作后将花费1,你要求最少花费可以将序列变为Power Sequence。

分析:
这道题时发现可以直接暴力,因为ai=c^i(0<=i<=n-1,ai<=1e9)我们可以从c=1开始暴力求解,根据题目分析可以得出一定存在极小值。分析下复杂度如果n(n>100)很大,那么c的范围不会超过2(因为2的100次方远远超过了ai的最大范围),如果n很小的话(3<=n<100)那么c的范围不会超过1000。因此复杂度大约就是O(n).

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <string>
using namespace std;
typedef  long long ll;
const int N=1e5+10;
ll a[N],Min=1e17,sum=0;
ll qpow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=res*a;
		a=a*a;
		b=b>>1;
	}
	return res;
} 
int main(){
	
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%lld",&a[i]);
		sum+=a[i];
	}
	sort(a+1,a+1+n);
	sum-=n;
    ll t=2; //这里t就是题目中的c
    while(1){
    	ll temp=0;
    	int p=0;
    	for(int i=1;i<=n;i++){  
    		temp=temp+(ll)abs(qpow(t,i-1)-a[i]); //一开始写的是(ll)pow(t,i-1)精度不行,下次再也不用pow函数了。
    		if(temp>=sum) {
    			p=1;
				break;
			}
		}
		if(p) break;
		sum=temp;
		t++;
	}
	printf("%lld\n",sum);
	
	
	
	return 0;
} 

C.Multiples of Length
题意:给你一段由n个正整数组成得序列a,你可以选择序列的一段[l,r] (l<=r),选择完后你可以对所选序列的每个ai(l<=i<=r),加上k*(l-r+1),其中可以是任意整数(可以为负数)。现在你必须选择三段序列完成以上操作,使得该序列元素全为0.

分析:
1. 当n=1时:第一次选择[1,1],再让取加上-1。第二,三次选择[1,1],再让取加上0。
2. 当n>=2时:第一次选择[1,1],对a[1]加上-a[1];第二次选择[2,n],对每个元素加上(n-1)a[i];第三次选择[1,n],对每个元素加上-na[i]。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <string>
using namespace std;
typedef  long long ll;
const int N=1e5+10;
ll a[N];
int main(){
	
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	printf("1 1\n%lld\n",-a[1]);
	a[1]=0;
    if(n==1){
    	
	    printf("1 1\n0\n"); 
		printf("1 1\n0\n");   
	}
	else{
		printf("%d %d\n",2,n);
		for(int i=2;i<=n;i++){
			printf("%lld%c",(n-1)*a[i],i!=n?' ':'\n');
		}
		printf("%d %d\n",1,n);
		for(int i=1;i<=n;i++){
			printf("%lld%c",-n*a[i],i!=n?' ':'\n');
		}
		
		
	}
	
	
	
	return 0;
}

D.Stoned Game
题意:给你n堆石子,第i堆石子有ai个石子,现在有两人分别从这n堆中选择一个,当这堆石子的个数不为0且上一个人没有选择这堆石子则这堆石子可以选(先首开始时可以选择任意一堆),现在你要判断谁将获胜。
分析:
1.如果这n堆石子中最大的那堆石子个数比其余(n-1)堆石子的总和还大,那么先手一开始就选择这堆石子个数最大的,并在接下来的回合一直选择这堆,这就将导致后手只能在其余(n-1)堆石子中选,当其余(n-1)堆石子个数全部为0时,先手却还有的选。
2.如果没有满足第一个条件,那么就是总和为奇数时先手胜,为偶数时后手胜。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <string>
using namespace std;
typedef  long long ll;
const int N=1e5+10;
int main(){
	
	int t;
	scanf("%d",&t);
	while(t--){
		int n,Max=0,sum=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			int x;
			scanf("%d",&x);
			if(Max<x) Max=x;
			sum+=x;
		}
		if(Max>sum-Max) printf("T\n");
		else{
			if(sum&1) printf("T\n");
			else printf("HL\n");
		}
		
	}
	
	
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值