信友队第六届图灵杯(初级组)T3 上传数据

1) 题面:比赛传送门

题目传送门


2. 思路:

    1) 贪心
         我们先给每个 qi 初始分配一个 wi 的值,然后 qi 总和不超过 m 且并非所有人都满了时,取最小的一个 qi/p i,让qi变成qi+1
       注:直接暴力实现是 O(nm) 的,可以使用优先队列优化成 O(mlogn)
     2) 二分
        二分答案,直接构造对应的使得 q i总和最小的方案,并校验是否合法并将将最后一次合法的判定所构造的解作为答案
        -  复杂度:O(n log m)


3.代码:(贪心+优先队列)

	#include 
	#define ll long long
	using namespace std;
	const int N=1e3+10;
	int n,m;
	ll wj,jw;
	struct node {
	int x,y;
	double xy;
	}a[N];
	priority_queue,greater >q;
	int gcd(int a,int b){
	return b?gcd(b,a%b):a; 
	}
	int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d %d",&a[i].x,&a[i].y);
		wj+=a[i].y;
		a[i].xy=a[i].y*1.0/a[i].x;
		q.push(a[i].xy);
	}
	if(wj>m){
		printf("Zip file size too big after extraction.Poor M!");
		return 0; 
	}
	m-=wj;
	while(m!=0){
		double t=q.top();
		q.pop();
		for(int i=1;i<=n;i++){
			if(a[i].xy==t&&a[i].y

你可能感兴趣的:(信友队,算法,数据结构,贪心算法)