紫题训练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;
}

浙公网安备 33010602011771号