题解 | #砝码Odw#

砝码Odw

https://ac.nowcoder.com/acm/problem/212442

思路

二分大法好!! 非正解,T了很多发,终于把他卡过去了。 看题解才知道可以将所有容器进制拆分直接塞,太妙了。 但所有人都在贪心的时候,就让我来一提供一份二分代码吧。

代码

#pragma GCC optimize("Ofast", "inline", "-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1e5+7;
const int mod=1e9+7;

inline int read(){	int x=0;char ch=getchar();while(ch<'0'||ch>'9'){ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x;}
void write(int x){if(x>9) write(x/10);putchar(x%10+'0');}

int n,m,i,w[N],a[N];

inline bool check(int x){
	int res=0,fro;
	priority_queue<int>p,q;
	for(i=0;i<x;i++) q.push(a[i]);
	for(i=0;i<n;i++) p.push(w[i]);
	while(p.size()&&q.size()){
		fro=p.top();
		p.pop();
		if(fro>=q.top()){
			p.push(fro-q.top());
			++res;
			if(res>=x) return true;
		}
		q.pop();
	}
	return false;
}

void Solve(){
	n=read();m=read(); 
	for(i=0;i<n;i++) w[i]=read();
	for(i=0;i<m;i++) a[i]=read();
	stable_sort(a,a+m);
	int L=0,R=m+1,mid;
	while(R-L>1){
		mid=((L+R)>>1);
		if(check(mid)) L=mid;
		else R=mid;
	}
	write(L);
}

signed main(){
	int T=1;
	while(T--){
		Solve();
	}
	return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 13:05
点赞 评论 收藏
分享
点赞 评论 收藏
分享
找到实习了&nbsp;给了150一天&nbsp;但是说是低代码&nbsp;值得去吗
码农索隆:是在没实习,可去,待个一两周,不行就润呗
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务