社区讨论

80pts玄关求条

P7095[yLOI2020] 不离参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mje1dh01
此快照首次捕获于
2025/12/20 16:28
2 个月前
此快照最后确认于
2025/12/22 18:20
2 个月前
查看原帖
CPP
//P7095

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N = 1e6 + 100;
int T, n;
int csll, dqll, csjs, dqjs;
		//csll:初始力量 dqll:当前力量 csjs:初始精神 dqjs:当前精神 

struct node{
	int ll, js, zjll, zjjs;
			//ll:力量要求  js:精神要求
			//zjll:增加力量(力量增值) zjjs:增加精神(精神增值) 
}a[N];

bool cmp1(node a1, node a2){
	if(a1.ll != a2.ll) return a1.ll < a2.ll;
	else return a1.zjll > a2.zjll;
} 			//力量要求为第一关键词,力量加成为第二关键词,排序 
struct cmp2{
	bool operator()(node a1, node a2){
		if(a1.js != a2.js) return a1.js > a2.js;
		else if(a1.zjjs != a2.zjjs) return a1.zjjs < a2.zjjs;
		else return a1.zjll < a2.zjll;
	}
};			//精神要求为第一关键词,精神加成为第二关键词,力量加成为第三关键词 
priority_queue<node, vector<node>, cmp2> q; 

signed main(){
	
	scanf("%lld%lld", &T, &n);
	for(int i = 1; i <= n; i++){
		scanf("%lld%lld", &a[i].ll, &a[i].js);
		scanf("%lld%lld", &a[i].zjll, &a[i].zjjs);
	}					//输入 
	
	sort(a + 1, a + n + 1, cmp1);  //力量排序 
	for(int i = 1; i <= n; i++){
		if(dqll < a[i].ll){
			int cha = a[i].ll - dqll;
			csll += cha; dqll += cha; 	
		}
		dqll += a[i].zjll;
	}  							//计算最低初始力量值 
	dqll = csll; 	//将当前力量值赋为初始力量值,模拟穿装备过程 
	
	int tag = 1, sum = 1;
						//tag:入队到了第多少个装备 
						//sum:已经穿了多少个装备 
	
	while(sum <= n){
		for(int i = tag; i <= n; i++){
			tag = i;
			if(dqll >= a[i].ll) q.push(a[i]);
			else break;
		}				//当前力量值能穿的装备入队 
		node lins = q.top(); q.pop();
		if(dqjs < lins.js){
			int cha = lins.js - dqjs;
			csjs += cha; dqjs += cha;
		}				//精神值少了就加 
		dqll += lins.zjll;
		dqjs += lins.zjjs;
		sum++;
	}
	
	printf("%lld %lld", csll, csjs);
	
	return 0;
}

回复

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

正在加载回复...