POJ 1018 Communication System

http://poj.org/problem?id=1018

枚举加优化,这题提交AC了,但是却发现自己的代码根本不正确,数据弱爆了,后来改了一下。。。  注意这题网上的大多数代码是错误的,虽然用它们的程序能过。。。


#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>
using namespace std;

//----------------------------------------------------------
#define CL(a,b)       memset(a,b,sizeof(a))
#define CLQ(q)        while(!q.empty())q.pop();
#define FOR(i,a,b)    for(int i=a;i<=b;++i)
#define FD(i,a,b)     for(int i=a;i>=b;--i)
#define FS(i,a)       for(int i=0;a[i];++i)
#define REP(i,n)      for(int i=0;i<n;++i)
#define PR2(a,n,m)    for(int i=0;i<n;++i){for(int j=0;j<m;++j)cout<<a[i][j]<<" ";puts("");}
#define max(a,b)      ((a)>(b)?(a):(b))
#define min(a,b)      ((a)<(b)?(a):(b))
#define checkMax(a,b) {if(a<b)a=b;}
#define checkMin(a,b) {if(a>b)a=b;}
#define READ(a)       freopen(a,"r",stdin)
#define WRITE(a)      freopen(a,"w",stdout)
#define sqr(x)        ((x)*(x))
#define inf           0x3f3f3f3f
#define INF           0x3f3f3f3f3f3f3f3fLL
#define eps           1e-10
typedef long long LL;
const double pi  = acos(-1.0);
const double hpi = asin(1.0);
//-----------------------------------------------------------

const int MAXN = 10010;

struct Node
{
    int id, b, p;
    Node() {}
    Node(int t_id, int t_b, int t_p) : id(t_id), b(t_b), p(t_p) {}
    friend bool operator < (const Node &p1, const Node &p2)
    {
        if(p1.b == p2.b)
            return p1.p < p2.p;
        return p1.b < p2.b;
    }
}arr[MAXN];
int max_item[110], min_item[110], used[110];
int T, tot, n, m, min_max;
double ans;

void solve()
{
    ans = -inf;
    min_max = inf;
    int cnt, sum;
    FOR(i, 1, n) min_max = min(min_max, max_item[i]);
    FOR(i, 1, tot-n+1)
    {
        if(arr[i].b > min_max) break;
        cnt = 1; sum = 0; CL(used, 0); used[arr[i].id] = 1;
        CL(min_item, inf); min_item[arr[i].id] = arr[i].p;
        FOR(j, i+1, tot)
        {
            if(arr[j].id == arr[i].id) continue;
            min_item[arr[j].id] = min(min_item[arr[j].id], arr[j].p);
            if(!used[arr[j].id])
            {
                used[arr[j].id] = 1;
                cnt++;
            }
        }
        if(cnt < n)
            break;
        else
        {
            FOR(j, 1, n) sum += min_item[j];
            ans = max(ans, arr[i].b*1.0 / sum);
        }
    }
}



int main()
{
    //READ("aa.in"); WRITE("bb.out");
    int x, y;
    cin >> T;
    while(T--)
    {
        tot = 0; CL(max_item, -1);
        cin >> n;
        FOR(i, 1, n)
        {
            cin >> m;
            FOR(j, 1, m)
            {
                cin >> x >> y;
                max_item[i] = max(max_item[i], x);
                arr[++tot].id = i;
                arr[tot].b = x;
                arr[tot].p = y;
            }
        }
        sort(arr, arr + tot + 1);
        solve();
        printf("%.3lf\n", ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值