Codeforces 551C - GukiZ hates Boxes(二分加贪心)

题意:

就是n个学生帮助教授搬箱子, 箱子分成m 堆, 每个学生每秒可以选择的两个操作

操作1,为从i堆迈向第i+1堆,

操作2,从i-1堆箱子中帮忙抱走一个箱子

问抱走所有箱子的最少时间为多少, 每个学生每秒可以同时行动

题解:

二分时间   然后再当前时间下,一个一个派出所有的学生,使其走到他能走的最远距离

代码:

#include<stdio.h>

int flag, value[100005], value2[100005], n, m;

void find(long long int mid)

{

long long int temp = mid, fla = 0;

temp --;

if(flag == n)  return;

if(temp == 0)   return;

while(1)

{

while(!value2[flag])

{

flag ++;

if(fla)temp --;

if(flag == n)   return;

if(temp == 0)   continue;

}

if(!fla)    temp -= flag;

fla = 1;

if(value2[flag] <= temp)

{

temp -= value2[flag];

value2[flag] = 0;

if(flag == n - 1)  flag ++;

if(flag == n)   return;

if(temp == 0)   continue;

flag ++, temp --;

if(flag == n)   return;

if(temp == 0)   continue;

}

else

{

value2[flag] -= temp;

return;

}

}

}

bool slove(long long int mid)

{

for(int i = 0; i < n; i++)

value2[i] = value[i];

flag = 0;

for(int i = 1; i <= m; i++)

{

find(mid);

if(flag == n)   break;

}

if(flag == n)   return 1;

return 0;

}

int main()

{

while(scanf("%d %d", &n, &m) != EOF)

{

long long int sum = 0;

for(int i = 0; i < n; i++)

scanf("%d", &value[i]), sum += value[i];

sum += n;

long long int l = 0, r = sum, mid, Ans = -1;

while(l <= r)

{

mid = (r+l)/2;

if(slove(mid))

{

r = mid - 1;

Ans = mid;

}

else l = mid + 1;

}

printf("%lld\n", Ans);

}

}

时间: 2024-10-10 17:40:12

Codeforces 551C - GukiZ hates Boxes(二分加贪心)的相关文章

Codeforces 551C GukiZ hates Boxes(二分)

Problem C. GukiZ hates Boxes Solution: 假设最后一个非零的位置为K,所有位置上的和为S 那么答案的范围在[K+1,K+S]. 二分这个答案ans,然后对每个人尽量在ans时间内搬最多的砖.可以得出至少需要多少个人才能搬完.这个可以在O(n)的时间内利用贪心得到 只要判断需要的人数是否小于等于实际的人数就好了 时间复杂度O(nlogS) #include <bits/stdc++.h> using namespace std; const int N = 1

Codeforces 551C GukiZ hates Boxes 二分答案

题目链接 题意: 一共有n个空地(是一个数轴,从x=1 到 x=n),每个空地上有a[i]块石头 有m个学生 目标是删除所有石头 一开始所有学生都站在 x=0的地方 每秒钟每个学生都可以在原地删除一块石头,或者向 → 移动一格距离 问:删除所有石头的最短时间 案例解析: 3 2 1 0 2 第一个学生第一秒向→走,第二秒删a[1]的一块石头 第二个学生一直走到头,删掉a[3] ,所以第二个学生花费是 1+1+1+2 = 5 两个学生可以同时运动. 思路: 二分答案,设答案为x,即需要x秒来搬完石

CodeForces 551C GukiZ hates Boxes

题目链接:CodeForces 551C GukiZ hates Boxes 解题思路: 题目要求最短时间,因此我们可以先考虑最长时间,最长时间一定是一个学生从开始走到结束,每走到一处就把该处箱子搬空,所以最长时间等于走到最后一个有箱子格子的步数ed加箱子总数sum. 接下来二分所需时间,直接搜索最短时间,每次都对假设时间进行判断.每次判断都从第一格开始,因为要搬空一个格子的箱子一定需要学生走到该处,同时所有学生可以同时移动,所以从头到尾判断要搬空该处需要多少学生,再与有的学生数量进行比较. 代

Codeforces551C:GukiZ hates Boxes(二分+贪心)

Professor GukiZ is concerned about making his way to school, because massive piles of boxes are blocking his way. In total there are n piles of boxes, arranged in a line, from left to right, i-th pile (1?≤?i?≤?n) containing ai boxes. Luckily, m stude

hdu 4004 (二分加贪心) 青蛙过河

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4004 题目意思是青蛙要过河,现在给你河的宽度,河中石头的个数(青蛙要从石头上跳过河,这些石头都是在垂直于河岸的一条直线上) 还有青蛙能够跳跃的 最多 的次数,还有每个石头离河岸的距离,问的是青蛙一步最少要跳多少米可以过河> 这是一道二分加贪心的题,从0到的河宽度开始二分,二分出一个数然后判断在这样的最小步数(一步跳多少距离)下能否过河 判断的时候要贪心 主要难在思维上,关键是要想到二分上去,能想到

Codeforces --- 982C Cut &#39;em all! DFS加贪心

题目链接: https://cn.vjudge.net/problem/1576783/origin 输入输出: ExamplesinputCopy42 44 13 1outputCopy1inputCopy31 21 3outputCopy-1inputCopy107 18 48 104 76 59 33 52 102 5outputCopy4inputCopy21 2outputCopy0NoteIn the first example you can remove the edge bet

codeforces 551 C GukiZ hates Boxes

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

二分加贪心

版权声明:Vici__ https://blog.csdn.net/Vici__/article/details/82951744题意:给出n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,要求相邻的两个球:下面的球的质量大于等于其上面的那个球质量的两倍. 给出n个数(n个冰淇淋球的质量),求最多能做几个冰淇淋. 题解:n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,则最多可做n/k个,二分可做数,然后检验(贪心). 二分答案:left = 0,right = n / k:贪心检验:假设能做x个,这x个冰

Codeforces 374D Inna and Sequence 二分+树状数组

题目链接:点击打开链接 给定n个操作,m长的序列a 下面n个数 if(co>=0)则向字符串添加一个co (开始是空字符串) else 删除字符串中有a的下标的字符 直接在序列上搞,简单模拟 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h&