【C++题解】1561. 买木头

发布于:2024-07-06 ⋅ 阅读:(68) ⋅ 点赞:(0)

问题:1561. 买木头

类型:省赛、数组问题、二分答案、贪心、2015江苏省青少年信息学奥林匹克竞赛复赛


题目描述:

有 n 个木材供应商,每个供货商有长度相同一定数量的木头。长木头可以锯短,但短木头不能接长。有一个客人要求 m 根长度相同的木头。要求计算出,此时供货商提供的木头满足客人要求的最长的长度是多少。
例如 n=2,m=30,两个供货商的木头为
12,10 第 1 个供货商的木头长度为 12 ,共有 10 根;
5,10 第 2 个供货商的木头长度为 5 ,共有 10 根。
计算的结果为 5 ,即长度为 12 的木头一根可锯出两根长度为 5 的木头,多余的无用,长度为 5 的木头不动,此时可得到 30 根长度为 5 的木头。

输入:

整数 n,m,L1​,S1​ (1≤n≤10000,1≤m≤1000000,1≤L1​≤10000,1≤S1​≤100)
其中 L1​ 是第一个供货商木头的长,S1​ 是第一个供货商木头数量。其他供货商木头的长度和数量 Li​ 和 Si​(i≥2),由下面的公式给出:
Li​=((Li−1×37011+10193)mod10000)+1
Si​=((Si−1×73011+24793)mod100)+1

输出:

一个整数,即满足要求的 m 根长度相同的木头的最大长度。

样例:

输入:

10 10000 8 20

输出:

201

在这里插入图片描述


完整代码如下:

#include<bits/stdc++.h> 
using namespace std;

int m,cmax=0;
vector<int> v;

bool cmp(int a,int b){
	return a>b;
}

int findNum(int mid){
	int c=0,t;
	for(int i=0;i<v.size();i++){
		t=v[i];
		while(t>=mid){
			++c;
			t-=mid;
		}	
	}
	return c;
}

void myFind(int l,int r){
	
	if(l>r){
		return;
	}
	int mid;
	mid=l+r>>1;
	if(m>findNum(mid)){
		return myFind(l,mid-1);
	}else{
		cmax=mid;
		return myFind(mid+1,r);
	}
	
}
int main(){
	//一、分析问题
	//已知:有n个木材供应商。需要m 根长度相同的木头。L 是第一个供货商木头的长,S是第一个供货商木头数量。 
	//未知:供货商提供的木头满足客人要求的最长的长度是多少。
	//关系:长木头可以锯短,但短木头不能接长。其他供货商木头的长度和数量 Li 和 Si(i≥2),由下面的公式给出:
		//Li=((Li-1×37011+10193)mod10000)+1
		//Si=((Si-1×73011+24793)mod100)+1

	
	//二、数据定义 
	int n,li,si;

	//三、数据输入
	cin>>n>>m>>li>>si; 
	for(int i=0;i<n;i++){
		for(int j=0;j<si;j++){
			v.push_back(li);
		} 
		li=(li*37011+10193)%10000+1;
		si=(si*73011+24793)%100+1;
	}
	//四、数据计算 
	sort(v.begin(),v.end(),cmp);
	myFind(1,v[0]);
	

	//五、输出结果 
	
	cout<<cmax;
	
	return 0;	
}


网站公告

今日签到

点亮在社区的每一天
去签到