Codeforces 985 E - Pencils and Boxes

E - Pencils and Boxes

思路:

dp

先排个序,放进一个袋子里的显然是一段区间

定义状态:pos[i]表示小于等于i的可以作为(放进一个袋子里的)一段区间起点的离i最近的位置

显然,初始状态:pos[i] = 1,1 <= i <= k

状态转移:

pos[i+1] = i+1 ,如果 a[i] - a[pos[i-k+1]] <= d , 因为在这种情况下pos[i-k+1] 到 i 可以放进一个袋子里,那么i+1就可以作为新的起点了

pos[i+1] = pos[i], 其他情况

最后只要判断pos[n+1] 等不等于 n+1 就可以判断是不是都能放进袋子里

代码:

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pii pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head

const int N = 5e5 + 5;
int a[N], pos[N];
int main() {
    int n, k, d;
    scanf("%d%d%d", &n, &k, &d);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    sort(a+1, a+1+n);
    for (int i = 1; i <= k; i++) pos[i] = 1;
    for (int i = k; i <= n; i++) {
        int pre = pos[i-k+1];
        if(a[i] - a[pre] <= d) pos[i+1] = i+1;
        else pos[i+1] = pos[i];
        //cout << i+1 << " " << pos[i+1] << endl;
    }
    if(pos[n+1] == n+1) printf("YES\n");
    else printf("NO\n");
    return 0;
}

原文地址:https://www.cnblogs.com/widsom/p/9074831.html

时间: 2024-10-14 11:55:22

Codeforces 985 E - Pencils and Boxes的相关文章

Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://codeforces.com/contest/985/problem/E Description Mishka received a gift of multicolored pencils for his birthday! Unfortunately he lives in a monochrome w

Educational Codeforces Round 44 (Rated for Div. 2)+E. Pencils and Boxes+树状数组

题目链接:E. Pencils and Boxes 题意:N 个数,要求分成任意堆,要求每一堆只要有K个,同一堆中任意数之间差值不能超过d; 题解:用树状数组.排一下序然后从后面开始找,以当前数为最小值看能否成堆,要成堆的话要求i+k,到第一个大于a[i]+d的位置之间有能够成堆的位置.(这里判断的时候树状数组一减看是否大于0就可以了)注意初始化时在n+1的位置加1. 1 #include<bits/stdc++.h> 2 #include <iostream> 3 #includ

Educational Codeforces Round 44 - E. Pencils and Boxes

标签 : DP 题目链接 http://codeforces.com/contest/985/problem/E 题意 把\(n\)个数分成多组,使得每组包含至少\(k\)个元素,且每组中的任意两个元素之差不超过\(d\) 分析 很巧妙的DP 我们使用dp[i]来表示(如果不存在i+1~n个元素的时候)前i个能否满足题目条件放入boxes中. dp[i]为true当且仅当存在一个j满足 \[ \left\{ \begin{aligned} a[j+1] \geq a[i]-d \\ dp[j]=

codeforces 985E Pencils and Boxes

题意: 把一个数组分成若干组,保证每组的size >= k并且一组中任意两个数字的差的绝对值 <= d,问存不存在这样的分法. 思路: 线性dp. 用dp[i]表示前i个数是否有分法. 设j为满足a[i] - a[j] <= d的最小的a[j]的下标,那么dp[i]就可以从dp[j-1] ~ dp[i-k]转移,j可以二分得到. 首先一定得满足i - k,因为至少有k个数字: 假设前j-1个数字有分法,那么当j - 1 <= i - k的时候,说明第j到第i个数字至少有k个数字并且

codeforces 985 F. Isomorphic Strings

题目链接 https://codeforces.com/contest/985/problem/F 题意 首先定义两个长度相等字符串a,b同构,当且仅当a中的每个字母,b中只存在一个字母与之对应,并且两个字母出现位置要完全一致,a,b反过来也要满足. 给定一个长度为\(2 \times 10^5\)的字符串s,有很多次询问.每次询问s从x位置开始的长度为l的字串与从y开始的长度为l的字串是否同构. 分析 对每个字母出现位置的集合进行哈希. 比如对于字母\('k'\),我们把原串中出现\('k'\

codeforces 551 C GukiZ hates Boxes

--睡太晚了...脑子就傻了-- 这个题想的时候并没有想到该这样-- 题意大概是有n堆箱子从左往右依次排列,每堆ai个箱子,有m个人,最开始都站在第一个箱子的左边, 每一个人在每一秒钟都必须做出两种选择中的一种:1若他的位置有箱子则搬走一个箱子,2往右走一步. 问把所有箱子都搞掉的最少时间-- 很显然二分一下答案,若为x秒,则每个人都有x秒,一个一个排出去搬,看是否能够搬完-- 我竟然没想到-- #include<map> #include<string> #include<

【codeforces 768F】 Barrels and boxes

http://codeforces.com/problemset/problem/768/F (题目链接) 题意 A,B两种物品可以装到栈中,每个栈只能存放一种物品,容量没有限制.现在讲所有栈排成一列,AB相间,问存B的栈长大于H的概率. Solution 震惊!F竟是个大水题...枚举长度隔板法搞一搞就好了.. 细节 注意判0分成0组的情况?LL 代码 // codeforces768F #include<algorithm> #include<iostream> #includ

codeforces round 512 F. Putting Boxes Together 树状数组维护区间加权平均数

F. Putting Boxes Together time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output There is an infinite line consisting of cells. There are nn boxes in some cells of this line. The ii-th box stan

Codeforces 985 D - Sand Fortress

D - Sand Fortress 思路: 二分 有以下两种构造, 分别二分取个最小. 代码: #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pi acos(-1.0) #define LL long long //#define mp make_pair #define pb push_back #define ls rt<<1, l, m #defi