待补: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;
}