资深守护
1781 检票进站
经验值:1600
时间限制:1000毫秒
内存限制:128MB
题目描述 De**ion
m 位同学一起约着去海南旅行,现在他们正在赶往火车站。
火车站共有 n 个检票口。由于检票员的操作速度不同,每个检票口的通行速度也就不同,平均测量,第 k 个检票口的速度为 tk 秒。
在候车时,精于计算的同学们就开始思考,假设一开始所有检票口都处于准备状态,每个检票口一次只能通过一人。那么他们一共 m 个人至少需要多少时间全部通过检票口。
输入描述 Input De**ion
第一行:两个整数 n ( 1 <= N <= 100000 ) 和 m ( 1 <= M <= 10^9 ),分别表示检票口数量以及同学们的人数。
接下来 n 行:每行一个整数 ti,表示每个检票口的检票时间。范围在 [ 1 , 10^9 ] 。
输出描述 Output De**ion
仅一行,输出全部通过的最少时间。
样例输入 Sample Input
7 10 3 8 3 6 9 2 4
样例输出 Sample Output
8
数据范围及提示 Data Size & Hint
对于40%的数据,m <= 20.
对于70%的数据,m <= 1000.
对于100%的数据,m <= 10^9.
我的0分代码 :
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100010],mx,sum;
bool check(int x){
int s=x+1,cnt=0;
for(int i=1;i<=n;i++){
if(s-a[i]>=0){
s+=a[i];
}
else{
cnt++;
s=a[i];
}
}
return cnt<=m;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
mx=max(mx,a[i]);
sum+=a[i];
}
int l=mx,r=sum;
while(l<r){
int mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}
/*
*/
程安琪在2023-12-17 13:05:41追加了内容
还有一道题:
2950 丢石头
经验值:1200
时间限制:3000毫秒
内存限制:128MB
题目描述 De**ion
不知道同学们有没有玩过丢石子的游戏,哈哈,也许没有,你们都是玩电脑,小明在玩丢石头的游戏的时候丢了A个石头,假设这A个石头丢在一条直线上,现在他想从这些石头里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入描述 Input De**ion
第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个石头坐标。
输出描述 Output De**ion
仅一个整数,为所求答案。
样例输入 Sample Input
5 3 1 2 3 4 5
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
限时3秒
怎么写啊!