poj1018

来源:互联网 发布:muteki域名 编辑:程序博客网 时间:2024/06/06 02:47

需要n件设备,每个设备可以从mi个工厂定制。并给出每个工厂定制的设备的宽带B,价格P。

要求每个设备从一个工厂定制一个,总宽带是所有设备中最小的宽带。总价格是所有设备的价格只和。

求总宽带/总价格。

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

思路:按照①宽带②价格③设备序列   来排序。

然后就是一个枚举。选定一个宽带,求出最小的B/P。可能有点DP吧...

代码有些借鉴,但觉得在借鉴的过程中学会了好多东西~

#include <cstdio>#include <iostream>#include <fstream>#include <stdlib.h>#include <string.h>using namespace std;const int maxn=101;struct node{int B;int p;int line;};int cmp(const void *a1, const void * a2){node *x=(node*) a1;node *y=(node*) a2;if((x->B)==y->B){if(x->p==y->p)return (x->line-y->line);return x->p-y->p;}return x->B-y->B;}int min(int *maxB,int n){int min=maxB[0];for (int i = 1; i < n; ++i){if(min>maxB[i])min=maxB[i];}return min;}int main(){    //ifstream cin("input.txt");    node *a=new node[maxn*maxn];    int *maxB=new int [maxn];    int *rem=new int [maxn];    int t;cin>>t;while(t--){        double maxP=0;int n;int cnt=0;cin>>n;        memset(maxB,0,sizeof(int)*n);for(int i=0;i<n;i++)   //i-th line{int m;cin>>m;while(m--){node d;cin>>d.B>>d.p;d.line=i;if(maxB[i]<d.B)  maxB[i]=d.B;a[cnt++]=d;}}qsort(a,cnt,sizeof(node),cmp);for(int i=0;i<cnt-n+1;i++) //取n个值,故cnt-(n-1){if(a[i].B>min(maxB,n)) break; //可以提前结束memset (rem,-1,sizeof(int)*n);/*rem保留每行可以选择的最大的price*/for(int j=i;j<cnt;j++){if (rem[a[j].line]==-1){rem[a[j].line]=a[j].p;continue;}if(a[j].p<rem[a[j].line])rem[a[j].line]=a[j].p;}double sumP=0;for (int k = 0; k < n; ++k){sumP+=rem[k];}sumP=(double)a[i].B/sumP;if(sumP>maxP)maxP=sumP;}printf("%.3f\n",maxP);}delete maxB;delete a;delete rem;return 0;}


0 0
原创粉丝点击