紫题训练9.13P4131 [WC2005] 友好的生物

P4131 [WC2005] 友好的生物
https://www.luogu.com.cn/problem/P4131
Tag思维 贪心
题意:略

题解:先拆绝对值处理前几个数,最后一维排序加贪心处理

参考代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll p=998244353;
struct node{
	ll v[6];
	ll id;
}a[100005];
ll n,k,c[6],dp[100005][16],tag[100005][16],val[100005][16];
bool cmp(node x,node y){
	return x.v[k-1]<y.v[k-1];
}
void solve() {
	cin>>n>>k;
	for(int i=1;i<=k;i++) cin>>c[i-1];
	ll x;
	for(int i=1;i<=n;i++){
		a[i].id=i;
		for(int j=1;j<=k;j++){
			cin>>a[i].v[j-1];
			a[i].v[j-1]*=c[j-1];
		}
	}
	
	sort(a+1,a+n+1,cmp);
	for(int j=1;j<=n;j++){
		for(int i=0;i<(1<<(k-1));i++)
		{
			if(j==1) {
				dp[j][i]=a[j].v[k-1];
				for(int r=0;r<k-1;r++){
					if((i>>r)&1) dp[j][i]-=a[j].v[r];
					else dp[j][i]+=a[j].v[r];
				}
				val[j][i]=dp[j][i];
				tag[j][i]=a[j].id;
			}
			else{
				val[j][i]=a[j].v[k-1];
				for(int r=0;r<k-1;r++){
					if((i>>r)&1) val[j][i]-=a[j].v[r];
					else val[j][i]+=a[j].v[r];
				}
				if(dp[j-1][i]<val[j][i]) {
					dp[j][i]=val[j][i];
					tag[j][i]=a[j].id;
				}
				else {
					dp[j][i]=dp[j-1][i];
					tag[j][i]=tag[j-1][i];
				}
		}
	}
}
	ll ans=-1e17,fl,fr;
	for(int j=2;j<=n;j++)
	{
		for(int i=0;i<(1<<(k-1));i++)
		{
			if(ans<val[j][i]-2*a[j].v[k-1]+dp[j-1][(~i)+(1<<(k-1))]){
				ans=val[j][i]-2*a[j].v[k-1]+dp[j-1][(~i)+(1<<(k-1))];
				fl=tag[j-1][(~i)+(1<<(k-1))];
				fr=a[j].id;
			}
		}
	}
	cout<<fl<<" "<<fr<<"\n";
	cout<<ans<<"\n";
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	ll T=1;
	while(T--) solve();
	return 0;
}


posted @ 2026-09-13 22:42  pigeon666  阅读(3)  评论(0)    收藏  举报