【Codeforces Round #398 (Div. 2)】Codeforces 767D Cartons of milk

2023-11-07 20:09

本文主要是介绍【Codeforces Round #398 (Div. 2)】Codeforces 767D Cartons of milk,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Olya likes milk very much. She drinks k cartons of milk each day if
she has at least k and drinks all of them if she doesn’t. But there’s
an issue — expiration dates. Each carton has a date after which you
can’t drink it (you still can drink it exactly at the date written on
the carton). Due to this, if Olya’s fridge contains a carton past its
expiry date, she throws it away. Olya hates throwing out cartons, so
when she drinks a carton, she chooses the one which expires the
fastest. It’s easy to understand that this strategy minimizes the
amount of cartons thrown out and lets her avoid it if it’s even
possible. Milk. Best before: 20.02.2017. The main issue Olya has is
the one of buying new cartons. Currently, there are n cartons of milk
in Olya’s fridge, for each one an expiration date is known (how soon
does it expire, measured in days). In the shop that Olya visited there
are m cartons, and the expiration date is known for each of those
cartons as well. Find the maximum number of cartons Olya can buy so
that she wouldn’t have to throw away any cartons. Assume that Olya
drank no cartons today. Input In the first line there are three
integers n, m, k (1 ≤ n, m ≤ 106, 1 ≤ k ≤ n + m) — the amount of
cartons in Olya’s fridge, the amount of cartons in the shop and the
number of cartons Olya drinks each day. In the second line there are n
integers f1, f2, …, fn (0 ≤ fi ≤ 107) — expiration dates of the
cartons in Olya’s fridge. The expiration date is expressed by the
number of days the drinking of this carton can be delayed. For
example, a 0 expiration date means it must be drunk today, 1 — no
later than tomorrow, etc. In the third line there are m integers
s1, s2, …, sm (0 ≤ si ≤ 107) — expiration dates of the cartons in
the shop in a similar format. Output If there’s no way for Olya to
drink the cartons she already has in her fridge, print -1. Otherwise,
in the first line print the maximum number x of cartons which Olya can
buy so that she wouldn’t have to throw a carton away. The next line
should contain exactly x integers — the numbers of the cartons that
should be bought (cartons are numbered in an order in which they are
written in the input, starting with 1). Numbers should not repeat, but
can be in arbitrary order. If there are multiple correct answers,
print any of them.

把已有的和可选的分别排序,最后选择的一定是截止日期最晚的一段。
二分答案,判定的时候贪心地每天从两个数组的头开始取。
因为每次最多取 O(n) 次,复杂度 O(nlogn)
hack的时候还看到有很多人用并查集,不知道是怎么做的。

#include<cstdio>
#include<algorithm>
using namespace std;
int rd()
{int x=0;char c=getchar();while (c<'0'||c>'9'){x=x*10+c-'0';c=getchar();}return x;
}
struct milk
{int x,num;bool operator < (const milk &mm) const{return x<mm.x;}
}b[1000010];
int a[1000010],n,m,k;
bool ok(int p2)
{int p1=1,now=0;while (p1<=n||p2<=m){if ((p1<=n&&a[p1]<now)||(p2<=m&&b[p2].x<now)) return 0;for (int i=1;i<=k;i++)if (p1<=n&&(p2>m||a[p1]<b[p2].x)) p1++;else p2++;now++;}return 1;
}
int main()
{int l,r,mid;scanf("%d%d%d",&n,&m,&k);for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<=m;i++){scanf("%d",&b[i].x);b[i].num=i;}sort(a+1,a+n+1);sort(b+1,b+m+1);if (!ok(m+1)){printf("-1\n");return 0;}l=1;r=m+1;while (l<r){mid=(l+r)/2;if (ok(mid)) r=mid;else l=mid+1;}printf("%d\n",m-l+1);for (int i=l;i<=m;i++) printf("%d%c",b[i].num,i==m?'\n':' ');
}

这篇关于【Codeforces Round #398 (Div. 2)】Codeforces 767D Cartons of milk的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365993

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>

CF#271 (Div. 2) D.(dp)

D. Flowers time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/474/problem/D We s