ZOJ1409 POJ1018 Communication System

本文介绍了一种通过排序和筛选来解决特定问题的暴力解法。该方法首先对带宽进行排序,然后遍历所有可能的带宽阈值,找出最优解。文章提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上说这题贪心可以, DP也可以... 我都不会, 就只好用暴力了...

先对bandwidth排序, 对于每种可能以bandwidth为门槛筛出.


/*******************************************************************************
 # Author : Neo Fung
 # Email : neosfung@gmail.com
 # Last modified: 2012-03-12 20:52
 # Filename: ZOJ1409 POJ1018 Communication System.cpp
 # Description : 
 ******************************************************************************/
#ifdef _MSC_VER
#define DEBUG
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <functional>
#include <ctype.h>
#include <float.h>
#include <set>
#define MAX 10010
using namespace std;

int dev[MAX][2], total[MAX];


int main(void)
{
#ifdef DEBUG  
  freopen("../stdin.txt","r",stdin);
  freopen("../stdout.txt","w",stdout); 
#endif  

	int ncases,n,m;
	scanf("%d",&ncases);
	total[0]=0;

	while(ncases--)
	{
		scanf("%d",&n);
    set<int> band;
		int cnt=0;
		for(int i=1;i<=n;++i)
		{
			scanf("%d",&m);
			if(i>0)
				total[i]=total[i-1]+m;
			else
				total[i]=m;
			
			for(int j=total[i-1];j<total[i];++j)
      {
				scanf("%d%d",&dev[j][0], &dev[j][1]);
        band.insert(dev[j][0]);
      }
		}

    double ans=0.0;
    for(set<int>::reverse_iterator i=band.rbegin();i!=band.rend();++i)
    {
      double minband=(*i)*1.0;
      int price=0;
      for(int j=1;j<=n;++j)
      {
        double min=1000000;   //这里用DBL_MAX过不了...FUCK
        for (int k=total[j-1];k<total[j];++k)
        {
          if(dev[k][0]>=minband && dev[k][1]<min)
            min=dev[k][1];
        }
        price+=min;
      }
      ans = max(ans,minband/price);
    }

		printf("%.3lf\n",ans);
	}


  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值