Codeforces Round #666 (Div. 2)
A.Juggling Letters
题意:给n个字符串,可以将任意字符串的一个字符插到其他字符串任意位置,问能否使n个字符串相等。
思路:统计n个字符串所有字符出现的个数,如果都为n的倍数则YES,反之为NO;
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
string str;
int a[40],flag;
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
flag=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>str;
for(int j=0;j<str.size();j++)
{
a[str[j]-'a'+1]++;
}
}
if(n==1)
{
cout<<"YES"<<endl;
continue;
}
for(int i=0;i<=39;i++)
{
if(a[i]%n!=0)
{
flag=1;
break;
}
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
}
B. Power Sequence
题意:给一个数组a,任意排序后,a[i]加一或减一都为一个步骤,问最少需要几步使a[i]成为c为底,从c^0开始的等比数列。
思路:枚举所有可能的c,找到最小值,开long long,注意溢出。
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
long long i,n,c,cnt,ans,q=1,a[100005];
int main()
{
scanf("%lld",&n);
ans=-n;
for (i=0;i<n;i++)
{
scanf("%lld",&a[i]);
ans+=a[i];
}
sort(a,a+n);
for (c=1; c<=1000000; c++)
{
cnt=0;q=1;
for (i=0;i<n;i++)
{
if (q>a[i])
cnt+=q-a[i];
else
cnt+=a[i]-q;
q=q*c;
if(cnt>=ans)
break;
}
if (cnt<ans)
ans=cnt;
}
printf("%lld
",ans);
}
C. Multiples of Length
题意:给一个数组a,可以进行一种操作,使[l,r]区间上的a[i]加上任意倍的区间长度的值,当且仅当进行三次操作,使数组a所有元素变为0.
思路:构造题,当n为一时,第一步减a[1],第二步+0,第三步+0;
当n不为一时,第一步,前n-1项加上((n-1)*a[i])。第二步,将第n项置为0。第三步,将前n项,减去(n*a[i])。
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll a[100005];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>a[i];
if(n==1)
{
printf("1 1
%lld
1 1
0
1 1
0
",-a[1]);
return 0;
}
printf("1 %d
",n-1);
for(int i=1;i<=n-1;i++)
printf("%lld ",a[i]*(n-1));
printf("
");
printf("%d %d
%lld
",n,n,-a[n]);
printf("1 %d
",n);
for(int i=1;i<=n-1;i++)
printf("%lld ",-a[i]*n);
printf("0
");
}
D. Stoned Game
题意:2个人玩游戏,有n堆石头,一人拿一个石头,下一个人不能从上一个人拿过的堆拿石头,不能拿则失败。
思路:博弈论。若最多的那堆石头,比其他所有石头加起来还多,先手胜。
否则,判断奇偶性,奇先手胜,偶后手胜。
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
int t,n,x,mmax,sum;
scanf("%d",&t);
while(t--)
{
mmax=-INF,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
mmax=max(mmax,x);
sum+=x;
}
if(mmax>sum-mmax||(sum&1))
cout<<"T"<<endl;
else
cout<<"HL"<<endl;
}
}