'只要坚持就会成功--2022.2.18'
A. Plus One on the Subset (签到)
题意: 大概意思就是给你几个数, 给你一个操作: 将你想要的任意个数增加1, 问你多少个操作之后, 这些数变成相等的几个数.
思路: 大小也算个思维题吧, 找出最大值以及最小值相减即可, 得到的数即为答案.
题目链接:
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int t;
int main()
{
cin >> t;
while(t --)
{
int n;
cin >> n;
int minn = 1000000010, maxn = 0;
while(n --)
{
int x;
cin >> x;
minn = min(x, minn);
maxn = max(x, maxn);
}
cout << maxn - minn <<endl;
}
return 0;
}
B. Make AP(签到)
题意: 给你三个数, 顺序固定, 问你是否可以让其中一个数乘以一个正整数后, 构成等差数列.
思路: 分情况讨论, 等差数列性质: a + c = 2 * b, 所以可以分成a + c >= 2 * b, 以及a + c < 2 * b的情况, 详细见代码.
题目链接:
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int t;
int main()
{
cin >> t;
while(t --)
{
int a, b, c;
cin >> a >> b >> c;
if((a + c) >= b * 2)
{
if((a + c) % 2 == 1)//a + c >= 2 * b当a+c之和为奇数时, 一定找不到符合条件的b,
因为2 * b一定是个偶数;
{
cout << "NO" <<endl;
}
else if(((a + c) / 2) % b == 0)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
else
{
if((b * 2 - a) % c == 0 || (b * 2 - c) % a == 0)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
}
return 0;
}
C. Division by Two and Permutation(思维)
题意: 给你n个数, 将其中的每一个数数除以任意次2(可以不操作), 看是否可以将这些数最终变成1到n连续的整数.
思路: 从大到小(举个例子, 比如如果一个数除以2可以得到16那么一定可以得到2, 而反之则不可)得到n, n - 1, n - 2.....最终查看是否将这些数变成了0, 若有变成0的数, 则这个数没有对结果做出贡献, 从而不能得到从1到n连续的数, 详细见代码
题目链接:
C. Division by Two and Permutation
AC代码:
#include<bits/stdc++.h>
using namespace std;
int t, n, a[55], x;
int main()
{
cin >> t;
while(t --)
{
for(int i = 0; i <= 54; i ++)a[i] = 0;
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> x;
while(x > n)x /= 2;
while(a[x] && x > 0) x/= 2;
a[x] = 1;
}
if(a[0]) puts("NO");
else puts("YES");
}
return 0;
}
D. Palindromes Coloring
题意: 给你一个由小写字母组成的字符串, 用n个颜色给字母染色, 染同样颜色的字母可以互换, 一个颜色的字母拿出来构成一个回文字符串, 问最短字符串的最大长度时多少.
思路: 找出有多少对相同字母, 然后除以总颜色个数, 因为找的时最短字符串的最大长度, 所以要平均来算, 看是否可以平均到最短字符串上边, 然后再找出成对相同字母剩下的部分以及单个的字母, 看是否数量可以超过总颜色数, 从而看是否可以平均每个都添加, 从而最短回文字符串字母数也可以加1.
详细看代码
题目链接:
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t, k, o, e, n;
string s;
cin >>t;
while(t --)
{
cin >> n >> k;
int c[26] = {0};
cin >> s;
for(auto i : s) c[i - 'a'] ++;
e = 0, o = 0;
for(int i = 0; i < 26; i ++) e += c[i] / 2, o += c[i] % 2;
n = e / k * 2;
cout << (!n?1:(n + (e % k * 2 + o >= k))) << '\n';
}
return 0;
}