首页 > 其他分享 >Codeforces Round 901 (Div. 2)

Codeforces Round 901 (Div. 2)

时间:2023-10-01 11:22:28浏览次数:41  
标签:cnt 901 int ll Codeforces long using Div define

Codeforces Round 901 (Div. 2)

A - Jellyfish and Undertale

解题思路:

卡在最后秒放。

若\(x_i > (a - 1)\):那么该\(x_i\)的贡献为\(a - 1\)。

否则,该\(x_i\)的贡献为\(x_i\)。

代码:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int,int> pii;
#define fi first
#define se second

void solve()
{
	int a,b,n;
	scanf("%d %d %d",&a,&b,&n);
	vector<int> x(n + 1);
	ll ans = b;
	for(int i = 1;i<=n;i++)
	{
		scanf("%d",&x[i]);
		if(x[i] < a - 1)
		{
			ans += (ll)x[i];
		}
		else
		{
			ans += (ll)a - 1;
		}
	}
	printf("%lld\n",ans);
}

int main()
{
	int t = 1;
	scanf("%d",&t);
	while(t--)
	{
		solve();
	}
}

B - Jellyfish and Game

解题思路:

如果\(k\)为奇数,那么\(Jellyfish\)具有绝对选择权。此时,选取最大正收益交换方案加上即可。若无正收益方案,不变即可。

如果\(k\)为偶数,那么\(Jellyfish\)没有主动权,但同样选取最大正收益交换方案加上,无正收益就不动。交换后,更新二者最大数和最小数,此时找到\(Gellyfish\)的最大正收益方案,这个也就是\(Jellyfish\)亏损最大的方案,答案减去亏损即可。

代码:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int,int> pii;
#define fi first
#define se second

void solve()
{
	int n,m,k;
	scanf("%d %d %d",&n,&m,&k);
	vector<int> a(n + 1),b(m + 1);
	int mina = 1e9 + 10;
	int maxa = 0;
	int minb = 1e9 + 19;
	int maxb = 0;
	ll sa = 0;
	ll sb = 0;
	for(int i = 1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		mina = min(mina,a[i]);
		maxa = max(maxa,a[i]);
		sa += (ll)a[i];
	}
	for(int i = 1;i<=m;i++)
	{
		scanf("%d",&b[i]);
		minb = min(minb,b[i]);
		maxb = max(maxb,b[i]);
		sb += (ll)b[i];
	}
	ll l = maxb - mina;
	ll r = maxa - minb;
	if(k & 1)
	{
		if(l >= 0)
		{
			sa += l;			
		}
	}
	else
	{
		if(r <= 0)
		{
			
		}
		else
		{
			if(l >= 0)
			{
				sa += l;
				sb -= l;
				int t = (max(maxb,maxa) - min(mina,minb));
				sa -= t;
			}
			else
			{
				sa -= r;
			}
		}
	}
	printf("%lld\n",sa);
}

int main()
{
	int t = 1;
	scanf("%d",&t);
	while(t--)
	{
		solve();
	}
}

C - Jellyfish and Green Apple

解题思路:

首先,如果\(n \% m==0\),那么苹果一定能直接均分,不需要切。

对半分,得到的苹果重量只有\(1,\frac {1}{2},\frac{1}{4},...,\frac{1}{2^{29}}\)这类\(2\)的负整数次幂。

也就是说,我们将\(n\)个苹果均分为\(m\)份,$ \frac{n}{m}\(,去除整数部分,\)res = \frac{n % m}{m}\(。只有当对\)res\(进行约分后,即\)d = gcd(n%m,m),a = \frac{(n% m)}{d},b = \frac{m}{d}$。

其中,\(b\)应当为\(2^x\),即\(2\)的整数次幂。

现在我们要将\(a\)个苹果均分给\(b\)个人。计算要切几刀。注意我们之前进行了约分,答案最后要乘回\(d\)。

得到两个\(0.5\)要一刀,得到四个\(0.25\)要三刀,得到八个\(0.125\)要七刀。。。以此类推。

然后对于\(\frac{a}{b}\)的组成,我们可以用乘基取整法来得出。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int, int> pii;
#define fi first
#define se second
vector<ll> cnt(100);
ll lowbit(ll x)
{
    return x & -x;
}

ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = (res * a);
        }
        a *= a;
        b >>= 1;
    }
    return res;
}
ll gcd(ll a, ll b)
{
    return b ? gcd(b, a % b) : a;
}

void solve()
{
    ll n, m;
    scanf("%lld %lld", &n, &m);
    ll d = gcd(n, m);
    n /= d;
    m /= d;
    if (n % m == 0)
    {
        puts("0");
        return;
    }
    if (lowbit(m) != m)
    {
        puts("-1");
        return;
    }
    ll u = n % m;
    ll ans = 0;
    for (int i = 1; i < 40; i++)
    {
        u *= 2;
        if (u >= m)
        {
            ans += cnt[i] * (m / (cnt[i] + 1));
            u -= m;
        }
    }
    printf("%lld\n", ans * d);
}
int main()
{
    int t = 1;
    scanf("%d", &t);
    for (int i = 1; i <= 40; i++)
    {
        cnt[i] = cnt[i - 1] + qmi(2, i - 1);
    }
    while (t--)
    {
        solve();
    }
    return 0;
}

D - Jellyfish and Mex

解题思路:

设开始\(MEX(a) = u\),那么我们只会从小于\(u\)的数开始删。

如果我们删除了\(a_i 此时 u > a_i\),那么接下来\(u = a_i\)。

所以,我们删除的顺序一定是一个非单调递增序列。

\(dp[i]:使得MES(a) = a[i]的最小花费\)。答案就是排完序后的\(dp[i]\)。

状态转移方程:

\[dp[i] = min(u * (cnt[a[i]] - 1)+a[i],dp[j] + a[j] * (cnt[a[i]]- 1)+a[i]) \]

由于本题数据范围较小,对于\(j\)直接枚举转移即可。

其中\(u * (cnt[a[i]] - 1)+a[i]\)表示第一个删除的数就是\(a[i]\)的花费。

其中\(dp[j] + a[j] * (cnt[a[i]]- 1)+a[i]\)表示从\(MEX(a) = a[j]\)转移到\(MEX(a) = a[i]\)的花费。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int, int> pii;
#define fi first
#define se second

void solve()
{
    int n;
    scanf("%d", &n);
    vector<int> a(n + 1);
    map<int, int> cnt;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        cnt[a[i]]++;
    }
    sort(a.begin() + 1, a.end());
    a.erase(unique(a.begin() + 1, a.end()), a.end());
    n = a.size() - 1;
    ll u = 0;
    for (int i = 1; i <= n; i++, u++)
    {
        if (u != a[i])
        {
            break;
        }
    }
    // dp[i]:使得MEX(a) = a[i]的最小花费
    vector<ll> dp(n + 1, 0);
    for (int i = n; i; i--)
    {
        if (a[i] > u)
        {
            continue;
        }
        dp[i] = (cnt[a[i]] - 1) * u + a[i];
        for (int j = i + 1; j <= n && a[j] <= u; j++)
        {
            dp[i] = min(dp[i], dp[j] + a[j] * (cnt[a[i]] - 1) + a[i]);
        }
    }
    printf("%lld\n", dp[1]);
}
int main()
{
    int t = 1;
    scanf("%d", &t);
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:cnt,901,int,ll,Codeforces,long,using,Div,define
From: https://www.cnblogs.com/value0/p/17738669.html

相关文章

  • 901DIV2 (A~D)
    901DIV2A~DA:大于等于\(a-1\)的贡献都是a-1.voidsolve(){intans=0;inta,b,n;cin>>a>>b>>n;ans+=b;for(inti=1;i<=n;i++){intx;cin>>x;if(x>=a)x=a-1;ans+=x;}cout<<......
  • Educational Codeforces Round 155 (Rated for Div
    B.ChipsontheBoard题解:贪心显然我们可以把题意转化为:对于任意一个\((i,j)\),我们可以花费\(a_{i,j}\)的代价占据第\(i\)行和第\(j\)列,求占据所有格子的最小代价考虑两种情况:在每一行选一个格子在每一列选一个格子贪心选即可intn,a[N],b[N];voidsolve......
  • Codeforces Round 898 (Div. 4)
    由于题目补完才来写总结,导致前面的有的题目都需要重新再看一遍,只好当作复习了。但考虑到趁热打铁,先看H.H题:从小白视角来看乍一看是博弈论,仔细思考以后发现是图论。本题给的是基环树,意识到这一点很重要,这个条件是让本题不是很复杂的关键。n个点n条边且没有重边保证这个联通图中......
  • Codeforces Round 900 (Div. 3)
    目录写在前面ABCDEFG写在最后写在前面比赛地址:https://codeforces.com/contest/1878。前天晚上他妈睡不着觉又不想看漫画打游戏于是到阳台上开把div3放松心情。40min过了5题把剩下两题都口了感觉没意思了于是睡觉。太菜了还是,现在是div3随便AK但是div2过不了E的......
  • Educational Codeforces Round 122 (Rated for Div. 2)
    A.Div.7#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,a,b,c;cin>>n;c=n%10,n/=10;b=n%10,n/=10;a=n%10,n/=10;intres,val=100;for(inti=0;i<=9......
  • Go每日一库之138:dive(Docker 镜像分析)
    什么是dive?用于探索Docker镜像、每一层中的内容以及发现缩小Docker/OCI镜像大小的方法的工具。安装divego get github.com/wagoodman/divedive特性按层分解Docker镜像可视化展示每一层变化分析镜像空间使用百分比快速构建分析镜像支持多种镜像源和容器引擎......
  • Educational Codeforces Round 155 (Rated for Div. 2)
    Preface这天晚上这场因为不明原因(玩CCLCC中)就没有打,只能赛后补一下这场的EF都不算难初看都有做法,但好家伙E写挂两发,F写个根号做法直接T到天上去了A.Rigged!签到题,对于所有的\(e_i\gee_1\)的\(i\),求出\(S=\maxs_i\),根据\(S+1\)和\(s_1\)的大小关系判断即可#include<cstdio......
  • Codeforces Round 695 (Div. 2)
    练习笔记:A:https://codeforces.com/contest/1467/problem/A一开始以为是987654321.....交了两发WA。慢慢想想就是如果说我是第二个号码放8就是98901234....交了就是AC B:https://codeforces.com/contest/1467/problem/BB啊,暴力打出来对于每个i,他在可能是a[i-1]-1,a[i-1]......
  • 加训日记 Day5——codeforces round 899 再战div2
    Day5,9.25,codeforcesround899div2  ·事实证明自己的思维和手速都还不够快,晚上还晚来了一点  ·B题属实是,上来就想着并查集(菜鸡是这样的)然后发现不会写捏  ·思考了很久(看数据量)感觉是枚举暴力,但是又想不到怎么去枚举  ·一题遗憾离场  ·顺理成章的-26......
  • 加训日记 Day6——来场div3上上分(为什么连着三天比赛啊喂,人要熬死了)
    Day6,9.26cfround900div3  ·前三题手速题,尝试用模板和库函数结果出了点岔子,罚时略高  ·感觉还有很大提升空间,觉得这种题应该要求自己10分钟内全过掉(开翻译的情况下)  ·D过的人数没有E多就很难绷  ·写了发D结果TLEon10,心态爆炸直接下播  ·美美+46......