日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

北大poj1018题解题报告

發布時間:2024/10/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 北大poj1018题解题报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//我是萊鳥,多多交流

//380k

//94ms

題目的意思是:每種裝備可由多個生產商提供,從每一種裝備中選擇一個廠家的設備,使得所選的總的各種裝備中的最小帶寬B與他們的價格之和P的比值B/P達到最大。

解題思路:

準備工作:在輸入時,統計所有裝備中的最小值min,和每種裝備中的最大值max,然后從最大值中選出最小的一個Max。

然后:從最小值min到Max之間枚舉所有的可能的結果,并輸出最大的一個值

1、對每種裝備進行按p的大小進行升序快排。以便之后的查找工作。

2、保存min到Max之間的所有的的B的節點及他們所在行列數,便于之后查詢。

3、對min到Max之間的B[i]進行枚舉,并進行更新。

4、輸出最大的值。

#include <stdlib.h>
#include <stdio.h>
typedef struct Node
{
int bb;
int p;
}Node;
typedef struct BID
{
int bb;//帶寬值
int row;//所在的行號
int col;
}BID;
Node node[101][101];//保存節點
BID B[10001];//保存需要枚舉的帶寬B值
int comp(const void *a,const void *b)
{
BID* x=(BID*)a;
BID* y=(BID*)b;
if(x->bb==y->bb)
{
if(x->row==y->row)
return x->col-y->col;
return x->row-y->row;
}
return x->bb-y->bb;
}
int cmp(const void *a,const void *b)
{
return ((Node*)a)->p-((Node*)b)->p;
}
int main()
{
void search(int num,int index[]);
int max[101];//保存每組的P最大值
int index[101];//保存每行廠家的個數
int n,num;
int i,j,k;
scanf("%d",&n);
while(n-->0)//
{
int min=65535;//保存最小的P值
int count=0;
for(i=0;i<10001;i++)
B[i].bb=0;
scanf("%d",&num);//設備種數
for(i=0;i<num;i++)//輸入一組測試數據
{
scanf("%d",&index[i]);
for(j=0;j<index[i];j++)//輸入一行數據
{
scanf("%d %d",&node[i][j].bb,&node[i][j].p);
if(node[i][j].bb>max[i])
max[i]=node[i][j].bb;
if(node[i][j].bb<min)
min=node[i][j].bb;
}
}
int Max=65535;//保存最大中的最小P值
for(k=0;k<num;k++)
if(max[k]<Max)
Max=max[k];
for(i=0;i<num;i++) //對各種廠家的設備按P從大到小的順序升序排序
qsort(node[i],index[i],sizeof(Node),cmp);
for(i=0;i<num;i++)
for(j=0;j<index[i];j++)
if(node[i][j].bb>=min&&node[i][j].bb<=Max)
{
B[count].bb=node[i][j].bb;
B[count].row=i;
B[count++].col=j;
}
qsort(B,count,sizeof(BID),comp); //對B中的值按b為第一關鍵字,row為第二,cow為第三關鍵字升序排序
search(num,index);
}
return 1;
}
void search(int num,int index[101])//按B[]中的順序進行枚舉,并不斷更新
{
int k=0;
int i,j;
double result=0;
while(B[k].bb)
{
double sum=0;
if(k&&B[k].bb==B[k-1].bb&&B[k].row==B[k-1].row)
{
k++;
continue;
}
int flag=0;
for(i=0;i<num;i++)
{
if(i!=B[k].row)
{
for(j=0;j<index[i];j++)
if(node[i][j].bb>=B[k].bb)//保證每種裝備都有一件,否則不更新
{
sum=sum+node[i][j].p;
flag=1;
break;
}
if(flag)
flag=0;
else
break;
}
}
if(i==num)
{
double average;
average=B[k].bb/(sum+node[B[k].row][B[k].col].p);//
if(average>result)
result=average;
}
k++;
}
printf("%.3lf\n",result);
}

轉載于:https://www.cnblogs.com/ltfbk/archive/2012/07/05/2578535.html

總結

以上是生活随笔為你收集整理的北大poj1018题解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。