首页 > 其他分享 >Educational Codeforces Round 147 (Rated for Div. 2) (贪心)

Educational Codeforces Round 147 (Rated for Div. 2) (贪心)

时间:2023-05-05 13:22:07浏览次数:43  
标签:147 Educational Rated 前缀 int 个数 区间

原题链接:https://codeforces.com/contest/1821/problem/D

* 题意:从1开始走,走的给定区间的值要k次。且shift按了要松开,代表走了一个区间除了往右的次数,还要多两次按shift的次数, 求最小次数。

* 思路:

1. 先把不可能的情况列出来,就是给出的区间大小小于k时直接输出-1

2. 我的思路是暴力把每个区间大小用 数组c 列出来,再前缀和一下。只要我当前的前缀和大小大于k, 代表这里一定有解,再求在这个前缀和下的最优解,可以知道 ans = 区间个数 * 2 + 走到的最末点, 所以在最末点的情况下,要区间个数将尽可能得小。我用的是优先队列存区间值,多了我就把最小的区间值删掉,这样能保证所用区间的个数最小。

* AC代码:

void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 2, 0), b(n + 2, 0), s(n + 2, 0);
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= n; i ++) cin >> b[i];
    int sum = 0;
    vector<int> c;
    c.push_back(0);
    for (int i = 1; i <= n; i ++)
    {
    	c.push_back(b[i] - a[i] + 1);
    	sum += (b[i] - a[i] + 1);
    }
    for (int i = 1; i <= n; i ++)
    {
    	s[i] = c[i] + s[i - 1];
    }
    if (sum < k) {cout << -1 << '\n';return;}
    
    priority_queue<int, vector<int>, greater<int>> q;
    for (int i = 1; i <= n; i ++)
    {
		s[i] = c[i] + s[i - 1];    
    }
    int ans = 1e18, res = 0, cnt = 0, r = 1;
    q.push(c[1]);
	while (r <= n)
	{
		if (s[r] - res >= k && q.size())
		{
			int cot = s[r] - res - k;
			// cout << cot << '\n';
			cot = b[r] - cot + (r - cnt) * 2;

			ans = min(ans, cot);
			cnt ++;
			res += q.top();
			q.pop();
		}
		else 
		{
			r ++;
			if (r > n) break;
			q.push(c[r]);
		}
	}
	cout << ans << '\n';
}

标签:147,Educational,Rated,前缀,int,个数,区间
From: https://www.cnblogs.com/NNNZZZ/p/17373832.html

相关文章

  • GYM 101147K Touristic Trip
    首先可以看出这是一个条件概率\(P(A/B)=\frac{P(AB)}{P(B)}\),其中\(A\)事件为“满足在\(Z\)城市时寄出第\(Q\)张明信片”,\(B\)事件为“满足得到的明信片序列与给出的明信片序列相同”那只需要求出\(P(AB)\)和\(P(B)\)就能得到最终答案了首先考虑\(B\)事件发现......
  • Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2)
    好久没发博客了,发一篇。A求出每个\(0\)与往前/往后最近的\(1\)的距离即可。时间复杂度\(\mathcal{O}(n)\)。B\((x,y)\to(x+y,y)\to(x+y,-x)\to(y,-x)\to(y-x,-x)\to(y-x,-y)\to(-x,-y)\)。时间复杂度\(\mathcal{O}(n)\)。C开个栈模拟......
  • Educational Codeforces Round 147 (Rated for Div. 2) 题解
    ALink。模拟,代码。BLink。模拟,代码。CLink。我们设\(c\)为最后相同的字符。性质:我们一定不会删除字符\(c\)。因此以\(c\)为最后字符的操作次数就是不包含字符\(c\)的极大段的最小操作次数的最大值。对于一个长度为\(l(l\ge1)\)的段,它的最小操作次数为\(\l......
  • CF1477F Nezzar and Chocolate Bars 题解
    题意:有一根长为\(1\)的巧克力,已经被切了\(m-1\)刀被分成\(m\)分,接下来每次在整根长度为\(1\)的巧克力上均匀随机一个点切一刀,求每一小段巧克力长度均小于一个给定值\(K\)需要的期望次数。引理:Irwin-Hall分布:对于\(n\)个在\([0,1]\)内均匀分布的实数随机变量,它们......
  • FAST-LIO:A Fast,Roust LiDAR-inertial Odometry Package by Tightly-Coupled Iterate
    摘要——本文提出一种计算高效、鲁棒的激光雷达惯性里程计框架。我们使用紧耦合的迭代扩展卡尔曼滤波器将激光雷达特征点与IMU数据融合,以允许在发生退化的快速运动、噪声或者杂乱环境中进行稳健导航。为了在出现大量观测情况下降低计算负载,我们提出了一个计算卡尔曼增益的新公式。......
  • Educational DP Contest
    EducationalDPContestATcoder_link夯实基础的好东西I记录一下此时第i个有多少概率小于等于j的就可以了。#include<bits/stdc++.h>usingnamespacestd;constintN=3005;#definedbdoubledbdp[N][N];intn;dbp[N];intmain(){ios::sync_with_stdio(fal......
  • Educational Codeforces Round 1
    A.TrickySum公式求出1到n的和,然后枚举二等整次幂。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn;cin>>n;intsum=(1+n)*n/2;for(inti=1;i<=n;i<<=1)sum-=i......
  • Educational Codeforces Round 145 (Rated for Div. 2)
    Preface补题A~D都能秒出,E没看出性质被薄纱了,F感觉是个丁真题随便讨论下就过了后面看了下F的标算是个倍增,感觉Tutorial对性质挖掘的还不够的说A.GarlandSB题,设出现次数最多的颜色个数为\(cm\),若\(cm\le2\)则答案为\(4\);若\(cm=3\)则答案为\(6\),若\(cm=4\)则无解importjav......
  • Educational Codeforces Round 147 (Rated for Div. 2)
    Preface补题这周比赛挺少,不过后面可能就很少有时间补以前的比赛了的说现在除了要做学校的集训专题外,还要刷一下蓝桥杯国赛的题,可以说是很忙碌了而且由于JAVA的期末考试要来了,为了熟悉下语法以后补题的时候前面的题目可能会用JAVA来写(其实我写的JAVA看起来和C++真没啥区别)A.......
  • tomcat报错 removeGeneratedClassFiles failed
    1,tomcat切换用户重启后报错如下:Aug29,20142:14:47PMorg.apache.jasper.compiler.CompilerremoveGeneratedClassFilesWARNING:Failedtodeletegeneratedclassfile[/home/joeyon/test/work/Catalina/localhost/_/org/apache/jsp/WEB_INFO/c/common/errorIos_jsp.class]......