【题目记录】——Codeforces Round #764 (Div. 3)

文章目录


题目集地址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 使其变为 x2\lfloor \frac{x}{2}\rfloor⌊2x​⌋。问能否使序列变为一个 1∼n 的排列。
思路:每个数字都必须为 [1,n] 的数字,所以第一步要把所有大于 n 的数字变为 [1,n] 之间的数字。
从后往前遍历,由于每个数字都需要恰好 1 个。那么如果当前数字没有,一定不能成功,如果有多个,留下一个并且把剩下的转化为x2\lfloor \frac{x}{2}\rfloor⌊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;
}
上一篇:AcWing859 kruskal算法求最短路


下一篇:LeetCode第 70 场双周赛