Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) E

原创 2017年01月03日 10:43:48

题意:

圣诞老人要给k个小学生分发一些橘子,现在圣诞老人有n个橘子,第i个橘子有ai片。圣诞老人讨厌偏心,所以他想要在场的k个小学生都能拿到一定数量的橘子,不过他的橘子现在没有k个这么多。但是圣诞老人可以将橘子掰开,具体做法是,可以将一个有ai片的橘子掰成尽可能片数相等的两块,如果ai是偶数,那么掰成ai / 2的两块,否则最有一块比另一块多一片。被掰开后的橘子还可以继续这个操作,只要剩余片数大于1,就可以掰开

现在,圣诞老人想要在满足所有小学生都能拿到一定数量橘子的情况下拿到橘子片数最少的小学生拿到的橘子片数最多,输出这个值。 n <= 1E6,k <= 2E9,ai <= 1E7


solution:

考场想了一个O(nlog^2)的做法,,二分答案,每个橘子尽可能地拆开。然而这样好像复杂度很极限啊。。

正解是是线性的。。首先,如果所有橘子的片数加起来不足k,肯定是找不到一个合法方案的。然后,答案显然不超过1E7,从这个值开始往下枚举答案

对于一块有x片的橘子,如果存在含有y片的橘子,y > x,那么在掰开含y片的那个橘子前,显然是可以先不考虑这个橘子的。

假设当前枚举到的答案为Ans,如果一个橘子,掰开后有任意一块的片数小于Ans,那么这个橘子还不如不掰开,反正对答案没有影响。

基于以上两点,可以先将所有橘子按照片数扔进一个桶里面,维护两个指针,一个从大到小枚举Ans,另一个从大到小枚举掰开有贡献的橘子,什么时候能满足所有小学生的需求,什么时候就可以输出了O(max{ai})

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;

const int maxn = 1E7 + 7;
typedef long long LL;

LL k,sum,c[maxn];
int n,A,B;

int main()
{
	#ifdef DMC
		freopen("DMC.txt","r",stdin);
	#endif
	
	cin >> n >> k;
	while (n--)
	{
		int x; scanf("%d",&x);
		++c[x]; sum += 1LL*x;
	}
	if (sum < k) {cout << -1; return 0;}
	
	int Ans,cur; Ans = cur = 10000000; sum = 0;
	for (; ; --Ans)
	{
		sum += c[Ans];
		for (;;)
		{
			A = cur / 2; B = cur - A;
			if (A < Ans || B < Ans) break;
			sum += 1LL*c[cur];
			c[A] += c[cur]; c[B] += c[cur];
			c[cur] = 0; --cur;
		}
		if (sum >= k) {cout << Ans; return 0;}
	}
	return 0;
}

版权声明:这个人很懒什么都没有留下

相关文章推荐

Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) 总结

这场真是GG,比赛的时候就写出了三道题,还都比较水(可怜的standing才2000 QωQ)。A. Santa Claus and a Place in a Class 题意:有一个n*m的区域,...

Codeforces Round #380 (Div. 1, Rated, Based on Technocup 2017 - Elimination Round 2)

比赛的时候过了3题的pretest,结果systest怒跪2题。。rank几乎垫底。但是这场题目确实比较简单。A. Road to Cinema  cf特别爱出的二分题。。二分汽油容量,得到一个最小的...

Codeforces Round #380 (Div. 2,Based on Technocup 2017 - Elimination Round 2)C - Road to Cine//

C. Road to Cinema time limit per test 1 second memory limit per test 256 megabytes ...

Technocup 2017 - Elimination Round 1 (Unofficially Open for Everyone, Rated for Div. 2) 解题报告

A. Transformation: from A to B题意:一个数a,两种操作,一是把a*2,二是把a*10+1,问把a变到b是否有解和最小次数。思路:两种操作都是指数级别的,爆搜即可。// /...

Technocup 2017 - Elimination Round 1 (Rated for Div. 2) D. T-shirts Distribution 贪心、flows

题意:给出 S,M, L, XL, XXL, XXXL 每种衣服的个数,然后给出每个人的选择,可能只有一种,可能2种中的任一种即可(且只能是大小相邻的两种,且这2种输入的时候是升序排列),求给出的那些...

Technocup 2017 - Elimination Round 1 (Rated for Div. 2) C. Guess the Array 交互题+解n元方程组

题意:交互题+解n元方程组 交互题+解n元方程组 首先询问 ? 1 2 ? 2 3 ? 1 3 然后 x1 + x2 == x12 1) x2 + x3 == x23 ...

Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)【A,B,C】

翻车!翻车! codeforces782A A题: 水。 代码: #include using namespace std; typedef long long LL; int num...

Technocup 2017 - Elimination Round 1 (Rated for Div. 2) B. Bill Total Value 表达式处理、sstream

题意:每一个物品有自己的价格,求价格总数,并按照要求的格式输出,小数只有2为,且整数部分每3位用一个小数点来分隔。 表达式处理、sstream 全部转化为乘100以后转化为整数加法,(这个过程可能有精...

Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)A,B,C

A. Andryusha and Socks time limit per test2 seconds memory limit per test256 megabytes inputstand...

Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) B. The Meeting Place Cannot Be Change

B. The Meeting Place Cannot Be Changed time limit per test 5 seconds memory limit per test 2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)