HDU 6435 CSGO

按照我们蒟蒻菜队的核心思想(排序贪心)来搞这个题,首先想到暴力的方法,然后不用说肯定会TLE。。

然后加一波玄学排序,标准就是 武器点数+Σ|(主武器的属性值-副武器相应属性的平均值)|,这样第一个不总是正解,

因为可能会有这样的情况

2 2 1

0 233

0 346

0 123

0 456

主武器最大值和最小和平均值比较偏离情况是一样的,既然正解不出现在第一对,那第二对如何?第三对如何?

然后

#define prec 1000 //设置精确度,准备在WA与TLE间找到AC

交上去一发就过了。。。

就过了。。。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <map>
#include <list>
#include <set>
using namespace std;
#define N 100005
typedef long long ll;
struct wep{
    ll S;
    ll X[5];
};
wep Main[N],Sec[N];
ll Msum[5],Ssum[N];
int n,m,k;
bool cmpm(const wep&X,const wep&x){
    ll sum1 = 0,sum2 = 0;
    for(int i = 0 ; i < k ; ++i){
        sum1+=abs(m*X.X[i]-Ssum[i]);
        sum2+=abs(m*x.X[i]-Ssum[i]);
    }
    return sum1+m*X.S>sum2+m*x.S;
}
bool cmps(const wep&X,const wep&x){
    ll sum1 = 0,sum2 = 0;
    for(int i = 0 ; i < k ; ++i){
        sum1+=abs(n*X.X[i]-Msum[i]);
        sum2+=abs(n*x.X[i]-Msum[i]);
    }
    return sum1+n*X.S>sum2+n*x.S;
}
#define prec 1000
int main(){
    int T;
    cin>>T;
    while (T--){
        cin>>n>>m>>k;
        memset(Msum,0, sizeof(Msum));
        fill(Ssum,Ssum+5,0);
        for(int i = 0 ; i < n ; ++i){
            scanf("%lld",&Main[i].S);
            for(int j = 0 ; j < k ; ++j){
                scanf("%lld",&Main[i].X[j]);
                Msum[j]+=Main[i].X[j];
            }
        }
        for(int i = 0 ; i < m ; ++i){
            scanf("%lld",&Sec[i].S);
            for(int j = 0 ; j < k ; ++j){
                scanf("%lld",&Sec[i].X[j]);
                Ssum[j]+=Sec[i].X[j];
            }
        }
        sort(Main,Main+n,cmpm);
        sort(Sec,Sec+m,cmps);
        ll res = Main[0].S+Sec[0].S;
        for(int i = 0; i < k ;++i){
            res+=abs(Main[0].X[i] - Sec[0].X[i]);
        }
        ll cur;
        int nn = min(prec,n);
        int mm = min(prec,m);
        for(int i = 0 ; i < nn ; ++i){
            for(int j = 0 ; j < mm ; ++j){
                cur = Main[i].S+Sec[j].S;
                for(int ii = 0; ii < k ;++ii){
                    cur+=abs(Main[i].X[ii] - Sec[j].X[ii]);
                }
                res = res>cur?res:cur;
            }
        }
        printf("%lld\n",res);
    }
}

 算法的正确程度和数据强度成反比。

天天写玄学WA/TLE算法。。

 

posted @ 2018-08-23 09:25  DevilInChina  阅读(174)  评论(0编辑  收藏  举报