【题目记录】——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 使其变为 ⌊ x 2 ⌋ \lfloor \frac{x}{2}\rfloor 2x。问能否使序列变为一个 1∼n 的排列。
思路:每个数字都必须为 [1,n] 的数字,所以第一步要把所有大于 n 的数字变为 [1,n] 之间的数字。
从后往前遍历,由于每个数字都需要恰好 1 个。那么如果当前数字没有,一定不能成功,如果有多个,留下一个并且把剩下的转化为 ⌊ x 2 ⌋ \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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值