contest1397
A.Juggling Letters
对每个字母进行计数,看是否能整除n
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 1e4;
int cnt[26] = {};
int main(){
ll n;
cin >> n;
while (n--)
{
int b,d;
cin >> b;
d = b;
string k;
memset(cnt, 0, sizeof(cnt));
while (b--)
{
cin >> k;
for (int i = 0; i < k.length(); i++) {
cnt[k[i]-'a']++;
}
}
int flag = 0;
for (int i = 0; i < 26; i++) {
if (cnt[i] % d)flag = 1;
}
if (flag)cout << "NO
";
else cout << "YES
";
}
}
B.Power Sequence
cost是从大到小再到大的,从1开始依次枚举c,只要cost大于前一个值就break。(打的时候脑子抽了,以为这样复杂度会爆炸,就一直一直再乱写。。。)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 1e5 + 5;
ll INF = 1e18;
int dataa[mod] = {};
int min(int b, int a) { if (a > b)return b; return a; }
int main(){
ll n;
cin >> n;
for (int i = 0; i < n; ++i) {
scanf("%d", &dataa[i]);
}
sort(dataa, dataa + n);
ll ans =0;
for (int i = 0; i < n; ++i) {
ans += llabs(dataa[i] - 1);
}
ll c = 2;
while (1)
{
ll temp = 0;
ll b = 1;
for (int i = 0; i < n; i++) {
temp += llabs(dataa[i] - b);
if (temp > ans)break;//如果temp已经超过ans了就直接break,防止爆long long
b *= c;
}
if (temp > ans)break;
ans = min(ans, temp);
c++;
}
cout << ans;
}
C. Multiples of Length
首先给1到n-1的数每个加上他们自身的n-1倍
再给1到n的数减去他们自身的n倍(第n个数减去0)
最后给第n个数减去1乘以他自身
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 1e5 + 5;
ll INF = 1e18;
int dataa[mod] = {};
int min(int b, int a) { if (a > b)return b; return a; }
int main()
{
ll n;
cin >> n;
for (int i = 0; i < n; ++i) {
scanf("%d", &dataa[i]);
}
if (n != 1) {
cout << 1 << ' ' << n - 1 << '
';
for (int i = 0; i < n - 1; i++) {
cout << dataa[i] * (n - 1);
cout << ' ';
}
cout << '
';
cout << 1 << ' ' << n << '
';
for (int i = 0; i < n - 1; i++) {
cout << dataa[i] * n * -1;
cout << ' ';
}
cout << 0;
cout << '
';
cout << n << ' ' << n << '
';
cout << -1 * dataa[n-1];
}
else
cout << "1 1
0
1 1
0
1 1
" << -1 * dataa[0];
}
D.Stoned Game
每个人不能选前一次对手选的石堆,那最优情况就是先手选当前局面中最大的石堆。如果有一个石堆比其他所有石堆之和都大,那先手一直选那个石堆即可。如果没有,因为我们每次选的都是当前最大的石堆,每个石堆均匀消耗,判断总石子的奇偶性即可。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#define lc(i) (2*i+1)
using namespace std;
typedef long long ll;
const ll mod = 1e6 + 1e6+5;
ll INF = 1e18;
ll ans = 0;
int dataa[mod] = {};
int tmpa[mod] = {};
int min(int b, int a) { if (a > b)return b; return a; }
int max(int a, int b) { if (a > b)return a; return b;}
int main(){
ll n;
cin >> n;
while (n--)
{
ll m;
cin >> m;
for (int i = 0; i < m; i++)scanf("%d", &dataa[i]);
ll sum = 0;
ll mx = 0;
for (int i = 0; i < m; i++) {
sum += dataa[i];
mx = max(dataa[i], mx);
}
if (sum - mx < mx)cout << "T
";
else {
if (sum % 2==0)cout << "HL
";
else cout << "T
";
}
}
}