A .Juggling Letters
解题思路:
基本模拟题,只要字母%n == 0即可。
示例代码:
#include<bits/stdc++.h>
using namespace std;
char c[1005];
int main()
{
int t;
cin >> t;
int num[35];
while(t--)
{
memset(num,0,sizeof(num));
int n;
cin >> n;
for(int j = 1;j <= n;j++)
{
scanf("%s",c);
int len = strlen(ch);
for(int i = 0;i < len;i++)
{
int a = c[i] - 'a';
num[a]++;
}
}
int flag = 0;
for(int i = 0;i <= 26;i++)
{
if(num[i] == 0) continue;
if(num[i] % n != 0)
{
flag = 1;
break;
}
}
if(flag == 0) printf("YES\n");
else printf("NO\n");
}
return 0;
}
B.Power Sequence
解题思路:
这题好水,直接枚举c就完事了。
示例代码:
#include<bits/stdc++.h>
using namespace std;
int n;
long long a[100005];
long long quick_pow(int a,int b)
{
long long ans = 1;
while(b)
{
if(b % 2) ans = ans * a;
a = a * a;
b = b / 2;
}
return ans;
}
int main()
{
long long res = 0;
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
scanf("%lld",&a[i]);
res = res + a[i] - 1;
}
sort(a,a + n);
int flag = 0;
for(int i = 2;i < 1000000;i++)
{
long long k = 0;
for(int j = 0;j < n;j++)
{
long long cnt = quick_pow(i,j);
long long sum = max(cnt,a[j]),dy = min(cnt,a[j]);
if(sum - dy > res)
{
flag = 1;
break;
}
k = k + sum - dy;
}
if(flag == 1) break;
if(k < res) res = k;
}
printf("%lld\n",res);
return 0;
}
C.Multiples of Length
解题思路:
这道题很有意思,主要就是想出来方法了就很好做了。首先当n==1时,特判。当n>1时,先让前n-1个数变成数组的倍数。第n个数变为0。最后让整个区间变为0.
示例代码:
#include<bits/stdc++.h>
using namespace std;
long long a[100005],n;
int main()
{
scanf("%lld",&n);
for(int i = 1;i <= n;i++)
scanf("%lld",&a[i]);
if(n == 1)
{
printf("1 1\n");
printf("%d\n",-1 * a[1]);
printf("1 1\n");
printf("0\n");
printf("1 1\n");
printf("0\n");
}
else
{
printf("1 %lld\n",n-1);
for(int i = 1;i <= n - 1;i++)
printf("%lld ",a[i] * (n - 1));
printf("\n");
printf("%lld %lld\n",n,n);
printf("%lld\n",-1 * a[n]);
printf("1 %lld\n",n);
for(int i = 1;i <= n - 1;i++)
printf("%lld ",-1 * a[i] * n);
printf("0\n");
}
return 0;
}
D.Stoned Game
解题思路:
优先队列。对于每个玩家来说,每次取能取的石头堆中的石头最多的那一堆,一定是最优的。
示例代码:
#include<bits/stdc++.h>
using namespace std;
priority_queue<int>q;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
while(!q.empty()) q.pop();
int n;
scanf("%d",&n);
int x;
while(n--)
{
scanf("%d",&x);
q.push(x);
}
int flag = 0;
int ans = 0,t;
while(1)
{
if(q.top() == 0)
{
flag = 2;
break;
}
t = q.top();
q.pop();
t--;
q.push(ans);
if(q.top() == 0)
{
flag = 1;
break;
}
ans = q.top();
q.pop();
ans--;
q.push(t);
}
if(flag == 1) printf("T\n");
else printf("HL\n");
}
return 0;
}
E .Monster Invaders
解题思路:
这题我觉得有那么亿点点难。没做出来。