首页 > 其他分享 >Codeforces Round 982 (Div. 2) 题解(A-D)

Codeforces Round 982 (Div. 2) 题解(A-D)

时间:2024-10-28 12:42:30浏览次数:4  
标签:code 982 题解 void cin int vector Div dp

目录
Codeforces Round 982 (Div. 2)

A

思路

因为图形可以重叠, 所以答案就是最长的长和最长的宽组成的矩形周长.

code

void func(void)
{
	int n;
	cin >> n;
	int l = 0,r = 0;
	while(n--)
	{
		int x,y;
		cin >> x >> y;
		l = max(l,x), r = max(r,y);
	}
	cout << 2*l+2*r << '\n';
}

B

思路

因为 $n \le 2000 $, 所以可以用 \(O(n^2)\), 那么暴力求每个点后续有几个数大于自己, 然后求删去前面所有数和后续大于自己数的代价, 最后遍历最小值即可.

code

void func(void)
{
	int n,mx = 0;
	cin >> n;
	vector<int> a(n),cnt(n);
	for(auto &i : a)	cin >> i;
	for(int i=0;i<n;++i)
	{
		for(int j=i+1;j<n;++j)
		{
			if(a[j] > a[i])	cnt[i] ++;
		}
	}
	int ans = M;
	for(int i=0;i<n;++i)
	{
		ans = min(ans,i+cnt[i]);
	}
	cout << ans << '\n';
}

C

思路

设数组实际长度为 \(len\), 对于每个数字, 在 \(len+1-i\) 时可以被使用, 而\(1-i\) 固定
, 那么就可以处理出每个数字在什么长度时可以被使用, 且同效果(长度)数只能被使用一次

那么每个数只会从能变为此效果的数转移而来,
\(dp[b[i]+i-1] = dp[b[i]]+i-1\), \(b[i]+i-1\) 代表新的可获得长度, \(b[i]\)为转移前长度.

卡题原因

dp不熟练

code

void func(void)
{
	int n,ans = 0;
	cin >> n;
	int len = n;
	vector<int> a(n+1),b(n+1),c;
	map<int,bool> cvis;
	map<int,int> dp;
	map<int,vector<int>> mp;
	for(int i=1;i<=n;++i)	cin >> a[i];
	for(int i=1;i<=n;++i)
	{
		b[i] = a[i] - (len-i+1);
		if(b[i] == 0)
		{
			c.push_back(i);
		}
		if(b[i] >= 0)	mp[b[i]].push_back(i);
	}
	dp[0] = n;
	cvis[0] = true;
	for(auto &temp : mp)
	{
		if(cvis.count(temp.x) == 0)	continue;
		for(auto &i : temp.y)
		{
			cvis[b[i]+i-1] = true;
			dp[b[i]+i-1] = max(dp[b[i]+i-1],dp[temp.x]+i-1);
		}
	}
	for(auto &i : dp)	ans = max(ans,i.y);
	cout << ans << '\n';
}

D

思路

完全背包.

未ac原因

先是没看到 \(1 \le n \cdot m \le 3 \cdot 10^5\),
后是把 \(b\) 单调减遗忘了.

补题还二分总写不出来, 实际甚至可以不二分.

code

void func(void)
{
	int n,m,ans = 0,mx = 0;
	cin >> n >> m;
	vector<int> a(n+1),s(n+1),b(m+1);
	vector<vector<int>> dp(m+1,vector<int>(n+1,M));
	for(int i=1;i<=n;++i)
	{
		cin >> a[i];
		mx = max(a[i],mx);
		s[i] = s[i-1] + a[i];
	}
	for(int i=1;i<=m;++i)
	{
		cin >> b[i];
	}
	if(mx > b[1])
	{
		cout << -1 << '\n';
		return ;
	}
	dp[0][0] = 0;
	for(int i=1;i<=m;++i)
	{
		for(int j=0;j<=n;++j)
		{
			dp[i][j] = dp[i-1][j];
			if(j == 0)	continue;
			int k=0;
			int be = 0,ed = j;
			while(be != ed-1)
			{
				int mid = (be+ed) >> 1;
				if(s[j]-b[i] <= s[mid])	ed = mid;
				else	be = mid;
			}
			dp[i][j] = min(dp[i][j],dp[i][(s[j]-b[i] <= s[be] ? be : ed)]+m-i);
		} 
	}
	cout << dp[m][n] << '\n';
}

标签:code,982,题解,void,cin,int,vector,Div,dp
From: https://www.cnblogs.com/zerocloud01/p/18510235

相关文章

  • 题解:CF1666J Job Lookup
    被迫来写篇题解。首先,第一个要求我们只需要在递归构造的时候保证子树对应区间连续即可,现在考虑第二个要求。就题目中的二叉树而言,想要确定其结构,我们只需要关注这段区间,即这棵子树根节点的编号,又因为子树区间连续,所以我们不难想到区间动态规划。设\(dp_{l,r}\)表示\(l\simr......
  • 【最新华为OD机试E卷-支持在线评测】机器人活动区域(200分)多语言题解-(Python/C/Java
    ......
  • Codeforces Round 982 (Div. 2)
    A.RectangleArrangement题目给定\(n\)个矩形,\(n\)个矩形可以组成的图形(可以重叠)中,最小的周长的多少,矩形不能旋转,分析乍一看并没有什么思路,但是写出这个题并不能,案例很好的提示了我们要将所有矩形一角放一起,那么最后就会组成一个阶梯形状的图案,感觉割补法,这个图形周长等......
  • CF1738F 题解
    blog。duel的时候对上了脑电波很快过了,记一下这种我本来完全不会的题。肯定是搞掉平方。把\(n_c\)移到左边:\(\dfrac{\sum\limits_{u\inS}deg_u}{|S|}=\text{平均数}\le|S|\)。然后直接放缩左边,于是一个充分条件是:\[\max\limits_{u\inS}deg_u\le|S|\]考虑构造合法解。......
  • CSP-S 2024 游记/题解
    CSP-S2024去年S打成屎了,我要蓝√!!!!!!!!CSP怎么能不CS?CS了一个上午,顺便背了下快读。进厂!看见了退役的同学在做志愿者,祝他未来可期吧。也希望自己能够超常发挥。垃圾鼠标真难用。很好,全是传统题。只有T2开了两秒。T1,这不排个序然后优先队列乱搞就好了。5min过了,NOIP我来......
  • Removing People 题解
    前言题目链接:Atcoder;洛谷。题意简述\(n\)人站成一个圆圈,按顺时针方向依次为\(1,2,\cdots,n\)。每个人面对的方向由长度为\(n\)的字符串\(S\)给出。对于第\(i\)个人,如果\(S_i=\texttt{L}\),则\(i\)面向逆时针方向。如果\(S_i=\texttt{R}\),则面向顺时针方向。......
  • 字节跳动青训营 X 豆包MarsCode入营考核部分题解
    中等:观光景点组合得分问题小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j-i 表示。一对景点 (i<j) 的观光组合得分为 values[i]+values[j]+i-j,也就......
  • ZZJC新生训练赛第十场题解
    先给出比赛链接:https://vjudge.net/contest/667035下面说一下难度分层:(同一难度下按字典序排序,数字为cf难度分)800:ABEG1100:D1200:C1400:H1500:F原题链接A:https://codeforces.com/contest/1850/problem/AB:https://codeforces.com/contest/1991/problem/......
  • 关于前端div里面内嵌滚动条的使用
    怀旧网个人博客网站:怀旧网,博客详情:关于前端div里面内嵌滚动条的使用使用方法需要完成这个效果,只需要在div里面加上一个属性就可以。设置css属性:overflow:auto;就可以实现-代码如下:<divid="shouDiv"style=“overflow:auto;”>//加上之后就可以实现内置滚动条了<>......
  • Codeforces Round 981 (Div. 3) 题解(A-E)
    目录分析A思路代码B思路卡题原因代码C思路卡题原因codeD思路卡题原因代码E思路wa原因codeCodeforcesRound981(Div.3)分析这场整体发挥都不好,虽然题也抽象,但是对于这些题完全没必要卡这么久.正常至少能看到\(\mathbf{F}\)A思路因为边界\(n\)管辖\(\pm\),而Sak......