求助。。F题!
查看原帖
求助。。F题!
768530
Expert_Dream楼主2023/12/5 21:11

非二分写法

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const int N = 2E5+5;
int a[N],b[N],c[N];
int f[N],g[N];
bool cmp(int a,int b){
	return a > b;
}
signed main() {
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		int t,x;
		cin >> t >> x;
		if(t==0) a[++a[0]] = x;//先分类
		else if(t==1) b[++b[0]] = x;
		else c[++c[0]] = x;
	}
	sort(a+1,a+1+a[0],cmp);//排序
	sort(b+1,b+1+b[0],cmp);
	sort(c+1,c+1+c[0],cmp);
	
	for(int i = 1;i <= a[0];i++){//前缀和a
		f[i] = f[i-1] + a[i];
	}	
	int res=0,ci=0;
	int cnt=0;
	for(int i = 1;i <= b[0];i++){//g[i]记录当取i个b或c时的最大收获。
	//res为ci个c能够开多少个b
		while(res < i && ci <= c[0]) res += c[++ci];
		if(res<i) break;
		cnt+=b[i];
		g[ci+i]=cnt;
	}
	int ans=0;
	for(int i = 0;i <= m;i++){
		ans=max(ans,g[i]+f[m-i]);
	}cout<<ans;
	return 0;
}

提交记录

请大佬帮忙调一下,或者给出heck

2023/12/5 21:11
加载中...