AtCoder Beginner Contest 100 D - Patisserie ABC[思维]

D - Patisserie ABC

题意:n个物品,每个物品有三个属性a,b,c(可能正,可能负) .现在取m个,使得|sigma a| + |sigma b| + |sigma c| 最大化

思路:考虑绝对值里的符号.每个绝对值里的符号取值无非有2种情况. 趋向   极负/极正  .那么就有2*2*2=8种符号可能.每次排序nlogn,按i*a+j*b+c*k排序.8种情况必有一种情况满足要求

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
using namespace std;
typedef long long ll;
const int N=1e5+5;
//ll a[N],sum[N];
struct node{
    ll a,b,c;
}p[N];
int n,m,i,j,k;
bool cmp(node x,node y){
    return x.a*i+x.b*j+x.c*k>y.a*i+y.b*j+y.c*k;
}
int main(void){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin >> n>>m;
    ll ans=0;
    for(int i=1;i<=n;i++)   cin >>p[i].a>>p[i].b >>p[i].c;
    for( i=-1;i<=1;i+=2){// i,j,k分别代表绝对值里的符号趋向
        for( j=-1;j<=1;j+=2){
            for( k=-1;k<=1;k+=2){
                sort(p+1,p+1+n,cmp);
                ll t[4]={0};
                for(int te=1;te<=m;te++)    t[1]+=p[te].a,t[2]+=p[te].b,t[3]+=p[te].c;
                ans=max(ans,t[1]*i+t[2]*j+t[3]*k);
            }
        }
    }
    cout << ans << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/haipai1998/article/details/80718510