码迷,mamicode.com
首页 > 其他好文 > 详细

POJ - 1080 枚举

时间:2017-12-12 01:05:43      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:end   /tmp   记录   continue   code   first   iter   enum   name   

要求max{F/P},先枚举下界lowf,再贪心求符合约束条件的n个最小价值和
记录F的离散值和去重可以大幅度常数优化
(本来想着用DP做的)
(辣鸡POJ连auto都Complie Error)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<iterator>
using namespace std;
const int maxn = 1e5+11;
typedef pair<int,int> P;
vector<P> vec[maxn];
vector<int> F;
int n,m,x,y;
int main(){
    int T; scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        memset(vec,0,sizeof vec); F.clear();
        for(int i = 1; i <= n; i++){
            scanf("%d",&m);
            for(int j = 1; j <= m; j++){
                scanf("%d%d",&x,&y);
                vec[i].push_back(P(x,y));
                F.push_back(x);
            }
        }
        sort(F.begin(),F.end());
        vector<int>::iterator it = unique(F.begin(),F.end());
        F.erase(it,F.end());
        double ans=-1;
        long long tmp=0;
        for(int k = 0; k < F.size(); k++){//enum the lb of F
            int lowf=F[k];
            tmp=0;
            bool flag=0;
            for(int i = 1; i <= n; i++){
                int mn=0x7fffffff;
                for(int tt = 0; tt < vec[i].size(); tt++){
                    P t=vec[i][tt];
                    if(t.first>=lowf){
                        mn=min(mn,t.second);
                    }
                }
                if(mn==0x7fffffff)flag=1;
                tmp+=mn;
            }
            if(flag==1) continue;
            ans=max(ans,(double)lowf/tmp);
        }
        printf("%.3lf\n",ans);
    }
    return 0;
}

POJ - 1080 枚举

标签:end   /tmp   记录   continue   code   first   iter   enum   name   

原文地址:http://www.cnblogs.com/caturra/p/8025798.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!