CodeForces - 1250J The Parade 二分
题意:
一共n种身高,每一个士兵有一个身高。你需要把他们安排成k行(士兵不需要全部安排),每一行士兵身高差距小于等于1.你要找出来最多能安排多少士兵
题解:
这道题很容易就能看出来就是一道二分,二分一行有多少士兵(假设二分出来的值为x)
因为题目上说明每一行士兵的身高差距不能大于1,所以只有输入这n个身高中相邻的才可以安排在一行
TLE代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 using namespace std;
7 const int maxn=30005;
8 const int INF=0x3f3f3f3f;
9 typedef long long ll;
10 ll v[maxn],n,k,w[maxn];
11 bool panduan(ll x)
12 {
13 for(ll i=1;i<=n;++i)
14 w[i]=v[i];
15 ll start=1,ci=k;
16 while(ci)
17 {
18 if(w[start]>=x)
19 {
20 w[start]-=x; //因为我这里是一次一次减x,所以会超时
21 ci--;
22 }
23 else
24 {
25 if(w[start]+w[start+1]>=x && start+1<=n)
26 {
27 w[start+1]=(w[start]+w[start+1])-x;
28 start++;
29 ci--;
30 }
31 else
32 {
33 start++;
34 }
35 }
36 if(start>n) break;
37 }
38 if(ci) return 0;
39 else return 1;
40 }
41 int main()
42 {
43 ll t;
44 scanf("%lld",&t);
45 while(t--)
46 {
47 ll sum=0;
48 scanf("%lld%lld",&n,&k);
49 for(ll i=1;i<=n;++i)
50 {
51 scanf("%lld",&v[i]);
52 sum+=v[i];
53 }
54 ll mid,ans=0,l=1,r=sum/k; //这里一定要给ans初始化为0
55 while(l<=r)
56 {
57 mid=(l+r)>>1;
58 if(panduan(mid))
59 {
60 ans=mid;
61 l=mid+1;
62 }
63 else r=mid-1;
64 }
65 printf("%lld\n",ans*k);
66 }
67 return 0;
68 }
正确代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 using namespace std;
7 const int maxn=30005;
8 const int INF=0x3f3f3f3f;
9 typedef long long ll;
10 ll v[maxn],n,k,w[maxn];
11 bool panduan(ll x)
12 {
13 for(ll i=1; i<=n; ++i)
14 w[i]=v[i];
15 ll start=1,ci=k;
16 while(ci>0)
17 {
18 if(w[start]>=x)
19 {
20 ci=ci-w[start]/x;
21 w[start]%=x;
22 }
23 else
24 {
25 if(start+1<=n && w[start]+w[start+1]>=x)
26 {
27 ci=ci-(w[start]+w[start+1])/x;
28 w[start+1]=(w[start]+w[start+1])%x;
29 start++;
30 }
31 else
32 {
33 start++;
34 }
35 }
36 if(start>n) break;
37 }
38 if(ci<=0) return 1;
39 else return 0;
40 }
41 int main()
42 {
43 ll t;
44 scanf("%lld",&t);
45 while(t--)
46 {
47 ll sum=0;
48 scanf("%lld%lld",&n,&k);
49 for(ll i=1;i<=n;++i)
50 {
51 scanf("%lld",&v[i]);
52 sum+=v[i];
53 }
54 ll mid,ans=0,l=1,r=sum/k; //一定要给ans初始化为0,我错了好几次。。
55 while(l<=r)
56 {
57
58 mid=(l+r)/2;
59 if(panduan(mid))
60 {
61 ans=mid;
62 l=mid+1;
63 }
64 else r=mid-1;
65 }
66 printf("%lld\n",ans*k);
67 }
68 return 0;
69 }
CodeForces - 1250J The Parade 二分的更多相关文章
- [Codeforces 1199C]MP3(离散化+二分答案)
[Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...
- CodeForces 670D1 暴力或二分
今天,开博客,,,激动,第一次啊 嗯,,先来发水题纪念一下 D1. Magic Powder - 1 This problem is given in two versions that diff ...
- codeforces 895B XK Segments 二分 思维
codeforces 895B XK Segments 题目大意: 寻找符合要求的\((i,j)\)对,有:\[a_i \le a_j \] 同时存在\(k\),且\(k\)能够被\(x\)整除,\( ...
- Codeforces 626C Block Towers(二分)
C. Block Towers time limit per test:2 seconds memory limit per test:256 megabytes input:standard inp ...
- codeforces 803D Magazine Ad(二分+贪心)
Magazine Ad 题目链接:http://codeforces.com/contest/803/problem/D ——每天在线,欢迎留言谈论. 题目大意: 给你一个数字k,和一行字符 例: g ...
- Success Rate CodeForces - 807C (数学+二分)
You are an experienced Codeforces user. Today you found out that during your activity on Codeforces ...
- Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]
题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有 $n$ 个学生,他们的电脑有初始电量 $a[1 \sim n]$,他们的电脑每分钟会耗 ...
- Codeforces 1114E - Arithmetic Progression - [二分+随机数]
题目链接:http://codeforces.com/problemset/problem/1114/E 题意: 交互题,有一个 $n$ 个整数的打乱顺序后的等差数列 $a[1 \sim n]$,保证 ...
- Codeforces 660C - Hard Process - [二分+DP]
题目链接:http://codeforces.com/problemset/problem/660/C 题意: 给你一个长度为 $n$ 的 $01$ 串 $a$,记 $f(a)$ 表示其中最长的一段连 ...
随机推荐
- 解决Cannot find module '@angular/compiler-cli'
前言: 今天clone之前做的一个angular项目,使用ng serve一直提示An unhandled exception occurred: Cannot find module '@angul ...
- .NET 5网络操作的改进
随着.net 5在11月的发布,现在是谈论网络栈中许多改进的好时机.这包括对HTTP.套接字.与网络相关的安全性和其他网络通信的改进.在这篇文章中,我将重点介绍一些版本中更有影响力和更有趣的变化. H ...
- 虚拟机Linux安装Oracle容器并实现局域网其他主机访问查询
该文涉及Docker下Oracle容器的安装,主机端口的设置实现局域网内终端均能连接上Oracle数据库,图解如下: 一.关于Docker安装oracle容器可以参考下面博文: https://blo ...
- 【LeetCode】数组排序题 Array_Sorts
数组排序 Array_Sorts LeetCode 数组排序题 88. 合并两个有序数组 合并两个有序数组 难度简单 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nu ...
- leetcode 864. 获取所有钥匙的最短路径(BFS,状态压缩)
题目链接 864. 获取所有钥匙的最短路径 题意 给定起点,要求在最短步骤内收集完所有钥匙,遇到每把锁之前只有 有对应的钥匙才能够打开 思路 BFS+状态压缩典型题目 先确定起点和总的钥匙数目,其次难 ...
- ctfhub技能树—彩蛋
彩蛋题建议大家首先自己动手去找一找 做 好 准 备 后 再 看 下 文 ! 1.首页 使用域名查询工具查询子域名 2.公众号 此题关注ctfhub公众号即可拿到,不过多赘述. 3. ...
- 获取网页url中的参数
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ElasticSearch7.2简单命令实操(postman版)
使用postman访问操作ElasticSearch数据库,数据格式均为json 目录 使用postman访问操作ElasticSearch数据库,数据格式均为json 一.集群设置 1.查看集群设置 ...
- 提供个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录 文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删 除该目录
import java.io.IOException; import java.util.Scanner; import org.apache.hadoop.fs.*; public class G_ ...
- jvm 三种编译
https://blog.csdn.net/fuxiaoxiaoyue/article/details/93497558 https://blog.csdn.net/tjiyu/article/det ...