社区讨论

超时求调

P14635[NOIP2025] 糖果店参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mj54l97v
此快照首次捕获于
2025/12/14 10:48
2 个月前
此快照最后确认于
2025/12/16 20:25
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const int NUM = 1e5+1;
long long m;
struct Suger{
	long long  x;
	long long  y;
	long long sum; 
}; 
Suger su[NUM];
long long min_sum = LLONG_MAX;
int n;
long long ans = 0;
bool cmp1(Suger a, Suger b){
	return a.sum<b.sum;
}
bool cmp2(Suger a, Suger b){
	return a.x<b.x;
}
bool check(long long flag){
	long long cha = m - min_sum * flag;
	long long sum = 0;
	for (int i = 1;i<=n;i++){
		sum += su[i].x;
//		cout<<"flag "<<flag<<" sum "<<sum<<" cha "<< cha<<endl; 
		if (sum == cha){
			ans = flag;
			return true;
		}
	}
	if (sum < cha){
		return true;
	}else{
		return false;
	}
}
int main(){
	cin>>n>>m;
	long long tmp_s = 0 ;
	for (int i = 1;i<=n;i++){
		cin>>su[i].x>>su[i].y;
		su[i].sum = su[i].x+su[i].y;
		if(su[i].sum < min_sum){
			min_sum = su[i].sum;
		} 
		tmp_s +=su[i].x;
	} 
	sort(su+1, su+n+1, cmp2);
//	sort(su+2, su+n+1, cmp2);
	long long temp = m/min_sum;
	if (m % min_sum == 0){
		cout<< temp *2;
		return 0;
	}
//	long long cha = m - su[1].sum * temp;
	long long low = (m - tmp_s)/min_sum; long long high = temp;
//	long long ans = 0;
	while(low <= high){
		long long mid = (low + high )/ 2;
		if (check(mid)){
//			ans = mid;
			low = mid+1;
		}else{
			high = mid;
		}
	}
	
	long long sum = 0;
	long long cha = m - min_sum * ans;
	int count = 0;
	for (int i = 1;i<=n;i++){
		sum += su[i].x;
		count++;
		if (sum == cha){
			break;
		}
	}
//	cout<<"&"<<ans<<endl;
	cout<<ans*2+count;
	
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...