5723 - Water Gate Management

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3734

解题 :暴力枚举,二进制枚举状态。。

View Code
#include<iostream>

#include<stdio.h>

#include<string.h>

#include<algorithm>

#define inf ~0U>>1

using namespace std;

int n,m;

const int maxn=100000;

struct node0

{

    int f;

    int c;

}node[maxn];

int flow[maxn];

int cost[maxn];

void init()

{

    int mm=1<<n;

    for(int i=1;i<mm;i++)

        for(int j=0;j<n;j++)

            if(i&1<<j)

                flow[i]+=node[j].f,cost[i]+=node[j].c;

}

void solve(int v,int t)

{

    int flage=0;

    int mm=1<<n;

    int temp=inf;

    for(int i=1;i<mm;i++)

        if(flow[i]*t>=v)

            flage=1,temp=min(temp,cost[i]);

    if(flage)

        cout<<temp<<endl;

    else

        cout<<"IMPOSSIBLE"<<endl;

    return ;

}



int main()

{

    while(scanf("%d",&n)!=EOF)

    {

        for(int i=0;i<n;i++)

           scanf("%d%d",&node[i].f,&node[i].c);

        init();

        scanf("%d",&m);

        for(int j=1;j<=m;j++)

        {

            int v,t;

            scanf("%d%d",&v,&t);

            printf("Case %d: ",j);

            solve(v,t);

        }

    }

    return 0;

}

你可能感兴趣的:(water)