你说的对,但这道题为什么二进制拆分就能过?
查看原帖
你说的对,但这道题为什么二进制拆分就能过?
684960
Solwek楼主2024/6/6 14:25

rt,吸氧最慢的200多ms,不吸氧就T,氧这么厉害吗? 理论上来说是过不了的。

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

struct node{
	int x,y;
}v[100010];
int f[100010],p[100010];
int a[100010],s[100010];
int main(){		
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,T,m;
	cin>>n>>T>>m;
	for(int i=1;i<=n;i++)
		cin>>s[i]>>p[i]>>a[i];
	int tot=0;
	for(int i=1;i<=n;i++){
		int t=1;
		while(a[i]>=t){
			v[++tot]={t*s[i],t*p[i]};
			a[i]-=t;
			t*=2;
		}
		if(a[i]!=0){
			node ff;
			ff.x=a[i]*s[i];
			ff.y=a[i]*p[i];
			v[++tot]=ff;	
		}	
	}
	for(int i=1;i<=tot;i++)		
		for(int j=m;j>=v[i].x;j--)
			f[j]=max(f[j],f[j-v[i].x]+v[i].y);
	while(T--){
		int a,b,c;
		cin>>a>>b>>c;
		for(int j=m;j>=0;j--){
			for(int k=0;k<=j;k++){
				f[j]=max(f[j],f[j-k]+a*k*k+b*k+c);
			}
		}
	} 
	int mx=0;
	for(int i=0;i<=m;i++)
		mx=max(mx,f[i]);
	cout<<mx<<'\n';
	return 0;
}
/*

*/
2024/6/6 14:25
加载中...