Codeforces Round #666

A
https://codeforces.com/contest/1397/problem/A
直接判断各个字母的总个数能否被n整除就行了

#include <cstdio>
int t,n,f=1,a[30];
void rd(){
	char ch;
	for (scanf("%c",&ch); ch<'a' || ch>'z'; ) scanf("%c",&ch);
	for (; ch>='a' && ch<='z'; ) a[ch-'a']++,scanf("%c",&ch);
}
 
int main(){
	scanf("%d",&t);
	for (f=1; t; t--,f=1){
		for (int i=0; i<26; i++) a[i]=0;
		scanf("%d",&n);
		for (int i=1; i<=n; i++) rd();
		for (int i=0; i<=25; i++) if (a[i]%n!=0){
			printf("NO\n");
			f=0;
			break;
		}
		if (f) printf("YES\n");
	}
}

B
感受一下,c不会很大,直接枚举c,判断一下即可。

#include <cstdio>
#include <algorithm>
using namespace std;
long long i,n,c,cnt,ans,C,a[100005];

int main(){
	scanf("%lld",&n);
	ans=-n;
	for (i=1; i<=n; i++) scanf("%lld",&a[i]),ans+=a[i];
	sort(a+1,a+n+1);
	for (c=1; c<=1000000; c++){
		cnt=0;
		for (i=1,C=1; i<=n; i++,C*=c){
			if (C>a[i]) cnt+=C-a[i]; else cnt+=a[i]-C;
			if (cnt>=ans) break;
		}
		if (cnt<ans) ans=cnt;
	}
	printf("%lld",ans);
}

C
https://codeforces.com/contest/1397/problem/C
解法可能不唯一
1.我是先把第一个数(a[1])直接减掉,
2.然后再以[2,n]区间操作一次,
3.最后以[1,n]区间操作一次。
想想就会发现这样是可行的(只要数据有解,这样就一定是能满足的解)
可以这样解释:
后两步将[2,n]归零,相当于 a[i]=A*(n-1)+B*n,对任意i只需A,B为整数,这当然是都有解的,而且有很多解,随便推个满足的简单的式子就行了。

#include <cstdio>
long long A[100005],B[100005],a[100005],x,n;

int main(){
	scanf("%lld",&n);
	x=n-1;
	for (int i=1; i<=n; i++) scanf("%lld",&a[i]);
	for (int i=2; i<=n; i++){
		A[i]=-a[i]%n;
		B[i]=(a[i]+A[i])/n-A[i];
	}
	printf("1 1\n%lld\n",-a[1]);
	a[1]=0;
	if (n==1){
		printf("1 1\n0\n1 1\n0");
		return 0;
	}
	printf("2 %lld\n",n);
	for (int i=2; i<=n; i++) printf("%lld ",-A[i]*x),a[i]-=A[i]*x;
	printf("\n1 %lld\n",n);
	for (int i=1; i<=n; i++) printf("%lld ",-a[i]);
}

D
https://codeforces.com/contest/1397/problem/D
打表找规律……

#include <cstdio>
#include <algorithm>
using namespace std;
int t,n,a[200],S,T,HL;

int main(){
	scanf("%d",&t);
	while (t--){
		//T=HL=0;
		scanf("%d",&n);
		for (int i=1; i<=n; i++) scanf("%d",&a[i]);
		sort(a+1,a+n+1);
		S=0;
		for (int i=1; i<n; i++) S+=a[i];
		if (S<a[n]){
			printf("T\n");
			continue;
		}
		S+=a[n];
		if (S%2) printf("T\n");
		else printf("HL\n");
		/*
		for (int i=1; i<=n; i++){
			if (i%2) T+=a[n-i+1];
			else HL+=a[n-i+1];
		}
		//if (T>HL) printf("T\n");
		//else printf("HL\n");
		*/
	}
} 

E
emmmmm
没有做……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值