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

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

时间:2024-10-27 17:20:13浏览次数:5  
标签:int 题解 980 lst stp Div void dp define

目录
Codeforces Round 980 (Div. 2)

A

思路

推方程式即可, 勉强算贪心吧.
需要使得 \({a - x}\) 最小, 那么 \(x\) 就需要最小, 而满足题目条件, 需要

  • \(a - x \ge b - 2x\)
    得出\(x \ge b - a\), 又因为需要\(a\)最大, 所以\(x = b - a\), $ans = b-x = 2a-b $.

但是要注意, 如果\(a\)已经大于\(b\), 或者\(a\)无法满足营利, 要输出对应结果.

## 代码
void func(void)
{
	int a,b;
	cin >> a >> b;
	if(a >= b)	cout << a << '\n';
	else
	{
		int ans = (2*a - b);
		cout << (ans >= 0 ? ans : 0) << '\n';
	}
}

B

思路

因为只知道每组数目, 但不知道对应关系. 所以每次对不确定为 \(0\) 的按钮点击一次, 直到一次不出货.
那么可以用二分查找分界点, 也可以用桶模拟.
每次处理当前不确定为\(0\)的, 都减去\(min(a_i)\), 同时获得\(cnt_{(不确定为0总数)} \times (min(a_i) - 上次确定为0)\)瓶水, 次数加上获得水数\(+\)此次变为\(0\)个数, 因为确定他们变成\(0\)需要多一次操作.

wa原因

有一个式子没有删掉导致wa三发

void func(void)
{
	int n,k;
	cin >> n >> k;
	map<int,int> cnt;
	for(int i=0;i<n;++i)
	{
		int stp;	cin >> stp;
		cnt[stp] ++;
	}
	int stp = 0,lst = 0,times = 0;
	for(auto &i : cnt)
	{
		if((n-stp)*(i.x - lst) >= k)
		{
			times += k+cnt[lst];
			break;
		}
		else
		{
			k -= (n-stp)*(i.x - lst);
			times += (n-stp)*(i.x - lst) + cnt[lst];
			stp += i.y;
			lst = i.x;
		}
	}
	cout << times << '\n';
}

C

思路

抽象题
根据两个数中较小的排序, 然后则不受影响了.
当时赌根据两个数和排序还对了.

wa原因

赌根据第一个数排序, 实际应该根据较小数排序.

代码

void func(void)
{
	int n;
	cin >> n;
	vector<PII> a(n);
	for(auto &i : a)	cin >> i.x >> i.y;
	sort(a.begin(),a.end(),cmp);
	for(auto &i : a)	cout << i.x << ' ' << i.y << ' ';
	cout << '\n';
}

D

思路

这题可以用最短路, 也可以线段树维护dp.
因为不记得最短路了, 所以用线段树维护dp.

这题纯粹模拟太难, 所以可以维护无法使用, 也就是skip的点, 使之最小. 然后用一段的前缀和减去被skip的点.

那么dp[i]就维护到dp[i]skip的点的总值最小的路径的值.

对于每个点:

  • 如果\(b_i > i\), 他可以向右移动. 获取更多的点.
  • 如果\(b_i < i\), 他可以向左移动, 可以确定, 向左移动不如从这个点开始解题得分, 因为解题后只能继续解左边的点.

所以每个点只会从右边的一个点, 或者\(b_i\)的点移动而来.
又因为由右边移动而来不是被skip, 所以只需继承到此点的dp.
那么每个点\(i\)查询能到达\(i\)的点(\(j\))到\(i\)的区间内dp的最小值,
\(dp_i = dp_k + a_j(j \le k \le i-1)\).

对于区间最小值, 可以用线段树维护(st表无法修改)
只需维护单点修改和区间查询

未ac原因

思路不对, 想用朴素的递推或者dfs解答.

代码

#include<bits/stdc++.h>
#define Start cin.tie(0), cout.tie(0), ios::sync_with_stdio(false)
#define PII pair<int,int> 
#define x first
#define y second
#define ull unsigned long long
#define int long long
using namespace std;

struct data
{
	int x,y,z;
	bool operator < (const data &i)	const
	{
		return(x == i.x ? (y == i.y ? z < i.z : y < i.z) : x < i.x);
	}
};

const int M = 1e18+7;
const int N = 4e5 + 10;

int n;
vector<int> t(N<<2);

void push_up(int p)
{
	t[p] = min(t[p<<1],t[p<<1|1]);
}

void modity(int k,int z,int be=1,int ed=n,int p=1)
{
	if(k == be && be == ed)
	{
		t[p] = z;
		return ;
	}
	int mid = (be+ed) >> 1;
	if(k <= mid)	modity(k,z,be,mid,p<<1);
	else			modity(k,z,mid+1,ed,p<<1|1);
	push_up(p);
}

int query(int l,int r,int be=1,int ed=n,int p=1)
{
	if(l <= be && ed <= r)	return t[p];
	int mid = (be+ed) >> 1,res = M;
	if(l <= mid)	res = min(res,query(l,r,be,mid,p<<1));
	if(mid+1 <= r)	res = min(res,query(l,r,mid+1,ed,p<<1|1));
	return res;
}

void func(void);

signed main(void)
{
	Start;
	int _ ; cin >> _;
	while(_--)	func();
	return 0;
}

void func(void)
{
	cin >> n;
	vector<int> a(n+1),s(n+1),b(n+1); 
	vector<vector<int>> vis(n+1);
	for(int i=1;i<=n;++i)
	{
		cin >> a[i];
		s[i] = s[i-1] + a[i];
	}
	for(int i=1;i<=n;++i)
	{
		cin >> b[i];
		if(b[i] > i)	vis[b[i]].push_back(i);
	}
	// for(int i=0;i<=n;++i)	dp[i] = M;
	for(int i=0;i<=(n<<2)+10;++i)	t[i] = M;
	modity(1,0);
	for(int i=2;i<=n;++i)
	{
		int dp = M;
		for(auto &j : vis[i])
		{
			dp = min(dp,query(j,i-1)+a[j]);
		}
		modity(i,dp);
	}
	int ans = -M;
	for(int i=1;i<=n;++i)
	{
		ans = max(ans,s[i] - query(i,i));
	}
	cout << ans << '\n';
}

标签:int,题解,980,lst,stp,Div,void,dp,define
From: https://www.cnblogs.com/zerocloud01/p/18508644

相关文章

  • 题解:P2013 无线电测向
    P2013无线电测向题目省流:求两条直线交点坐标使用样例数据作出下图:(图片来自@_MRCMRC_)图中红线和紫线为灯塔与船的连线,蓝线为船的航线。由输入可以知道灯塔A、B相对于\(x\)正半轴的角度\(\theta_A\)、\(\theta_B\)(逆时针方向)和它们分别的坐标\((x_A,y_A)\)、\((x_B,......
  • DYN / 消防局的设立 / Spread of Information / 将军令 题解
    前言四倍经验:[POI2011]DYN-Dynamite;[HNOI2003]消防局的设立;[ARC116E]SpreadofInformation;将军令。题意简述给你一棵\(n\)个结点的树和点集\(S\),你要选出\(k\)个关键点\(T\),求\(\min\max\limits_{u\inS}\min\limits_{v\inT}\operatorname{dis}(u,v)\)......
  • CSP-J 2024 复赛题解
    T1数据仅有52,极小的数据范围导致这题只有一个问题:如何简短方便的去重并统计。我选择了map做法:每个输入查找map中之前是否记录过此元素,如果记录过则证明已经拥有这张牌,反之则记录并将统计数增加。代码如下:#include<bits/stdc++.h>usingnamespacestd;intn;map<stri......
  • 10.26 吃 Div.2 水分
    10.26CodeforcesRound982(Div.2)Solve:A~D2(4/5)Rank:24Rating:\(2098+114=2212\)Pref:2554发挥评价:Good-果然还是Div.2善良啊!()随便做了前四道,没咋卡住,就这名次了,可惜C有一发罚时吃得不温不火,比较可惜。然后E1咋这么难。CF2027D1/D2长为\(n\)的序......
  • Stema练习题:十四届蓝桥杯STEMA考试Python真题试卷题解
    来源:十四届蓝桥杯STEMA考试Python真题试卷第一套编程第四题这个程序虽然代码量不大,但综合运用了多种基础算法和数据结构:贪心策略选择窗口、模拟现实过程、线性查找最小值、效率高(时间复杂度为O(N)O(N)O(N))。题目描述:编程实现:某服务大厅同时开放3个窗口为客户办理......
  • 在图像处理中,散度 div 具体的作用是什么
    在图像处理中,散度(divergence)通常用于量化一个向量场中的向量是如何相互远离或靠近的。图像可被视为矢量场,每一个像素点具有一定的矢量值,这些像素点的向量值可代表了不同的图像特性,如边缘、纹理等。在图像处理的环境下,散度在检测图像特征、边缘检测、图像分割以及光流估计等方面扮......
  • Codeforces Round 982 div2 个人题解(A~D2)
    CodeforcesRound982div2个人题解(A~D2)Dashboard-CodeforcesRound982(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cmath>#include<cstdio>#in......
  • CF102354B Yet Another Convolution 题解
    题目描述给定长为\(n\)的数列\(a,b\),求数列\(c\)满足:\[c_k=\max_{\gcd(i,j)=k}|a_i-b_j|\\\]数据范围\(1\len\le10^5,1\lea_i,b_i\le10^9\)。时间限制\(\texttt{6s}\),空间限制\(\texttt{256MB}\)。分析别被题目名字带偏了,这道题跟卷积没有一点关系。如果......
  • 洛谷 P5738 【深基7.例4】歌唱比赛 C语言 题解
    题目描述n(n≤100)n(n≤100) 名同学参加歌唱比赛,并接受 m(m≤20)m(m≤20) 名评委的评分,评分范围是 00 到 1010 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m−2m−2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 22 位小数......
  • CSP-J 2024第二轮试题解析
    2024年10月26日,CSP-J/S2024第二轮认证圆满结束;这次入门组的比赛重点考察了模拟和动态规划算法,还涉及到字符串、贪心、前缀和等内容的考察,相比去年来说,对思维能力的考察更多。前两题比去年好做,第三题的部分分也比较好拿,但是第四题的难度明显比去年高,预计分数线会出现小幅提升。......