文章目录
题目集地址Codeforces Round #764 (Div. 3)
A Plus One on the Subset 简单思维
题目地址A Plus One on the Subset
题目大意:给定一个长度为 n 的序列,每次选择若干个数字加 1 ,问最少操作几次可以使所有数字相同。
思路:极差
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
void solve()
{
int n; cin >> n;
int maxv = -1, minv = 1e9;
for (int i = 1, x; i <= n && cin >> x; i ++ )
{
maxv = max(maxv, x);
minv = min(minv, x);
}
cout << maxv - minv << endl;
}
int main()
{
// freopen("in.txt","r",stdin);
// int t = 1;
int t;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}
B Make AP
题目地址:B Make AP
题目大意:给出三个数字,可以选择其中一个数字(也可以不选),使其乘上任意一个正数。
问能否让这三个数字成为等差数列(顺序不能换)。
思路:由于只有三个数字,枚举哪个数字用来乘即可。
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
void solve()
{
ll a, b, c;
cin >> a >> b >> c;
bool ok = 0;
ll na = 2 * b - c;
ok |= (na % a == 0 && (c - b) == (b - na) && (na * a) > 0);
ll nb = (a + c) / 2;
ok |= (nb % b == 0 && (c - nb) == (nb - a) && (nb * b) > 0);
ll nc = (2 * b - a);
ok |= (nc % c == 0 && (nc - b) == (b - a) && (nc * c) > 0);
cout << (ok ? "YES" : "NO") << endl;
}
int main()
{
// freopen("in.txt","r",stdin);
// ll t = 1;
ll t;
scanf("%lld",&t);
while(t--)
{
solve();
}
return 0;
}
C Division by Two and Permutation
题目地址:C Division by Two and Permutation
题目大意:给定长度为 n 的序列,每次可以选择一个数字 x 使其变为 ⌊2x⌋。问能否使序列变为一个 1∼n 的排列。
思路:每个数字都必须为 [1,n] 的数字,所以第一步要把所有大于 n 的数字变为 [1,n] 之间的数字。
从后往前遍历,由于每个数字都需要恰好 1 个。那么如果当前数字没有,一定不能成功,如果有多个,留下一个并且把剩下的转化为⌊2x⌋即可。
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 55;
int cnt[N];
void solve()
{
memset(cnt, 0, sizeof cnt);
int n; cin >> n;
for (int i = 1, x; i <= n && cin >> x; i ++ )
{
while (x > n) x /= 2;
cnt[x] ++ ;
}
for (int i = n; i >= 1; i -- )
{
if (!cnt[i]) return cout << "NO\n", void();
while(cnt[i] > 1) cnt[i / 2] ++, cnt[i] -- ;
}
cout << "YES\n";
}
int main()
{
// freopen("in.txt","r",stdin);
// int t = 1;
int t;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}