fzu月赛 2203 单纵大法好 二分

Accept: 8    Submit: 18
Time Limit: 5000 mSec    Memory Limit : 65536 KB

 Problem Description

人在做,天在看,单纵不怂保平安

众娘皆为轮回来,敢教POI进夜战。

勿怪战列低智商,航母不是一个样?

假摔不虚有损管,大破进击是真相!

老S最近喜欢上某个搜集战舰的游戏,这个游戏中很重要的一个内容是能编排自己的战舰,通过出击完成任务来获取资源或新的战舰。大家都说老S是一个“直男”,所以他喜欢把战舰排成一条直线。目前老S正准备完成某个新的任务--“困难级丹麦海峡”,可以将地图视为1*N的一列方格(下标为1,2,...,N),老S有K列战舰,每列战舰长度为A。老S可以将自己的战舰布局在地图中的任意位置,但是两列战舰之间至少要有一个空格子,并且显然战舰是不能重叠放置的。老S通过内部人员率先知道了敌军的炮弹将会打向那些位置,老S希望使自己的舰队尽量晚的被第一次击中。请输出老S的舰队最晚将被敌方炮弹第一次击中?如果老S的舰队可以不被敌方炮弹击中则输出-1。

 Input

包含多组数据

每组数据第一行有3个整数分别为N,K,A 分别表示地图长度,老S拥有的战舰数,每艘战舰的长度。(1<=N,K,A<=200000)

第二行有1个整数M,表示敌方炮弹数。 (1<=M<=N)

第三行有M个整数,Xi表示第i个敌方炮弹将击中位置Xi (1<=Xi<=N)击中位置Xi (1<=Xi<=N)

 Output

仅有一个整数ANS,表示老S最晚将被哪个炮弹第一次击中

 Sample Input

5 1 3

2

1 5

5 1 3

1

3

 Sample Output

-1

1

 Source

FOJ有奖月赛-2015年10月

思路:二分第m个炮弹,检验:这m个炮弹把n个空格分成了t段连续的空位,对于每一段长度为g的空位,设能放x艘船, 应满足:A*x + (x-1) <= g, 得: x = (g+1) / (A+1)

,其中每两艘船之间要一个空格,放x艘船至少(x-1)

 #include <cstdio>
 #include <algorithm>
 #include <cmath>
 using namespace std;

 const int N = 2e5 + 10;
 int n, k, m, A;
 int pos[N], r[N];

 int calc(int v) {
    return (v + 1) / (A + 1);
 }
 bool check(int p) {
    int cnt = 0;
    for(int i = 1; i <= p; ++i) r[i] = pos[i];
    sort(r + 1, r + p + 1);
    for(int i = 2; i <= p; ++i)
    {
        int len = r[i] - r[i - 1] - 1;
        cnt += calc(len);
    }
    cnt += calc(r[1] - 1);
    cnt += calc(n - r[p]);
    if(cnt >= k) return true;
    else return false;
 }
 int main()
 {
     while(~scanf("%d%d%d", &n, &k, &A))
     {
         scanf("%d", &m);
         for(int i = 1; i <= m; ++i) scanf("%d", &pos[i]);

         int low = 1, high = m;

         while(low < high)
         {
             int mid = (low + high) >> 1;
             if(!check(mid)) high = mid;
             else low = mid + 1;
         }
         if(check(m))
            puts("-1");
         else
            printf("%d\n", low);
     }
     return 0;
 }

  

时间: 2024-10-23 06:15:17

fzu月赛 2203 单纵大法好 二分的相关文章

FZU 2203 单纵大法好 (二分 &amp;&amp; 贪心)

题意 : 老S最近喜欢上某个搜集战舰的游戏,这个游戏中很重要的一个内容是能编排自己的战舰,通过出击完成任务来获取资源或新的战舰.大家都说老S是一个"直男",所以他喜欢把战舰排成一条直线.目前老S正准备完成某个新的任务--"困难级丹麦海峡",可以将地图视为1*N的一列方格(下标为1,2,...,N),老S有K列战舰,每列战舰长度为A.老S可以将自己的战舰布局在地图中的任意位置,但是两列战舰之间至少要有一个空格子,并且显然战舰是不能重叠放置的.老S通过内部人员率先知道了

FOJ 2203 单纵大法好

二分答案+验证 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int N,M,K,A; int p[200000+10],a[200000+10]; int Num(int B,int A) { return (B+1)/(A+1); } int main() { while(~scanf("%d%d%d&quo

[FZU2203] 单纵大法好(二分)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2203 二分答案,即二分m表示第m个不会被击中,那么被击中的炮弹为第m+1个.每次check就行了. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 13 ┓┏┓┏┓┃ 14 ┃┃┃┃┃┃

「CodePlus 2017 11 月赛」汀博尔 (二分答案)

题目链接:https://loj.ac/problem/6249 题意:有 n 棵树,初始时每棵树的高度为 H?i?,第 i 棵树每月都会长高 A?i??.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不能为树的一部分). 现在问你最少需要等多少个月才能满足订单.(数据范围:1<=n<=200000,1<=S,L<=1e18,1<=Hi,Ai<=1e9) 题解:很显然二分答案.上界不能直接选择1e18,会爆long lo

FZU 1575 小学生的游戏【模拟二分】

某天,无聊的小斌叫上几个同学玩游戏,其中有比较笨的小兴,比较傻的小雪,可爱的小霞和自以为是的小楠.他们去找聪明的小明去给他们当裁判.判定谁取得游戏胜利. 而这个游戏是由小斌想个1到10000000的数字让大家猜,看谁先猜中.为了防止小斌作弊,小明记录下了游戏的整个过程.你的任务是判断小斌是否有作弊. Input 输入数据包括多盘游戏.一次猜数包含两行,第一行是一个数字n(1<=n<=10000000),表示所猜数字.第二行是小斌的回答为"too high","to

Fzu月赛11 老S的旅行计划

Description 老S在某城市生活的非常不自在,想趁着ICPC举办期间在省内转转.已知老S所在的省有N个城市,M条无向边(对于某一对结点可能出现重边).由于省内的交通相当糟糕,通过某条边所需要花费的时间受到一天中不同时刻的影响.此外对于某一时刻(一天24小时的任意一个整点算一个时刻),从任何方向通过无向边所需要的时间相同.现在老S想请你帮他规划一下旅行路线. Input 第一行输入为一个整数T表示测试个数T 对于每一个测试的第一行为3个整数N,M,K,其中K表示老S的询问数 之后有2M行,

python自动开发之(算法)第二十七天

1.什么是算法? 算法(Algorithm):一个计算过程,解决问题的方法 2.复习:递归 递归的两个特点:(1) 调用自身 (2)结束条件 def func1(x): print(x) func1(x-1) def func2(x): if x>0: print(x) func2(x+1) def func3(x): if x>0: print(x) func3(x-1) def func4(x): if x>0: func4(x-1) print(x) func1和func2不是递归

Lost Cows

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9669   Accepted: 6228 Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood 'watering hole' an

【HNOI2004】【BZOJ1213】高精度开根

Description 晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法.乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开m次根.因为一个有理数开根之后可能得到一个无理数,所以这项工作是有较大难度的.现在要做的只是这项工作的第一步:只对自然数进行开整数次根,求出它的一个非负根,并且不考虑结果的小数部分,只要求把结果截断取整即可.程序需要根据给定的输入,包括需要开根的次数,以及被开根的整数:计算出它的非负根取整后的结果. Input 共有两行,每行都有一个