SGU 114 Telecasting station 单峰极值函数

原创 2012年03月24日 15:51:20

挺有意思的题目,我的方法是排序,然后依次扫描过去,统计起点到扫描到的位置的人数,计算出未被扫描到的人数,可以证明如果在某个位置扫描到的人数要小于未被扫描到的人数的话那么这个位置一定不是最佳的,因为如果再往右边移动一个微小距离 dx 后你会发现能够得到更小的值,故一定不是最佳位置;

当你不段扫描,直到扫描到某个位置上的被扫描到的人数加起来要大于或等于剩下的人数;

讨论:1.若被扫描到的人数大于剩下的人数,那么这个位置一定是最佳的,因为不管往左移动dx或者往右移动dx都会发现权值变大了,而且可以证明在这一条线段上的权值函数是一个单峰极值函数,所以这个点就是最佳位置。

2.做被扫描到的人数等于剩下的人数,这种情况的话最佳的位置就是一条线段,这时扫描到的位置实际上是这条线段的左边界,那么右边界就是继续扫描到 第一次被扫描的人数大于未被扫描的人数的那个点,可以证明这个点就是最佳位置的右边界!

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cassert>
#include<cstring>
#include<iomanip>
using namespace std;

#ifdef _WIN32
#define i64 __int64
#define out64 "%I64d\n"
#define in64 "%I64d"
#else
#define i64 long long
#define out64 "%lld\n"
#define in64 "%lld"
#endif

#define FOR(i,a,b)      for( int i = (a) ; i <= (b) ; i ++)
#define FF(i,a)         for( int i = 0 ; i < (a) ; i ++)
#define FFD(i,a)        for( int i = (a)-1 ; i >= 0 ; i --)
#define S64(a)          scanf(in64,&a)
#define SS(a)           scanf("%d",&a)
#define LL(a)           ((a)<<1)
#define RR(a)           (((a)<<1)+1)
#define SZ(a)           ((int)a.size())
#define PP(n,m,a)       puts("---");FF(i,n){FF(j,m)cout << a[i][j] << ' ';puts("");}
#define pb              push_back
#define CL(Q)           while(!Q.empty())Q.pop()
#define MM(name,what)   memset(name,what,sizeof(name))
#define read            freopen("in.txt","r",stdin)
#define write           freopen("out.txt","w",stdout)

const int inf = 0x3f3f3f3f;
const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;
const double oo = 10e9;
const double eps = 10e-10;
const double pi = acos(-1.0);


struct zz
{
    int x;
    int p;
    bool operator < (const zz & cmp ) const
    {
        return x < cmp.x;
    }
}zx;

int n,sum;
vector<zz>v;

int main()
{
    while(cin>>n)
    {
        v.clear();
        sum=0;
        for(int i=1;i<=n;i++)
        {
            SS(zx.x);
            SS(zx.p);
            sum += zx.p;
            v.push_back(zx);
        }
        sort(v.begin(),v.end());
        int ans,temp=0;
        int rest = sum;
        for(int i=0;i<v.size();i++)
        {
            temp += v[i].p;
            rest -= v[i].p;
            if(temp >= rest)
            {
                cout<<v[i].x;
                cout<<".00000"<<endl;
                break;
            }
        }
    }
    return 0;
}




相关文章推荐

SGU 114 Telecasting station(二分)

114. Telecasting station Every city in Berland is situated on Ox axis. The government of the co...

SGU 114. Telecasting station 三分or找中位数

题目链接点这儿 一开始想都没想。。。

Sgu 114 Telecasting station

貌似忘记写题意了 给x,p 找到x0使得∑abs(xi-x0)*pi  min 实际上就是一个中位数的东西 不想写中位数了 又写的三分=,= 表示叉姐说的是对的...有数据可以卡三分 比...
  • ronnoc
  • ronnoc
  • 2013年04月27日 22:52
  • 377

ZOJ 3203 Light Bulb【可求出极值的单峰函数】

链接: 算法:利用函数的凸性或者直接三分 思路:  L = 0 时,倾斜角越小 shadow 越长 所以 L 正好为 0 时,  影子的长度为左极限  (H-h)/ X = H /...

群体智能算法求函数极值

  • 2015年11月06日 11:13
  • 576KB
  • 下载

sgu114

SGU114 Telecasting Station 题目大意: 百慕大的每一座城市都坐落在一维直线上。这个国家的政府决定建造一个新的广播电视台。经过了许多次试验后,百慕大的科学家们提出了一个结论...

C# 遗传算法 求函数极值

  • 2011年04月09日 18:30
  • 27KB
  • 下载

SGU114 水题 Easy Problem

题意:N个城市在坐标轴上,每个城市有坐标和人口。现设立一个广播站,每个城市的不满度是该城市人口与该城市到广播站距离的乘积。求广播站坐标使得各个城市不满度之和最小。 Problem: Every cit...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SGU 114 Telecasting station 单峰极值函数
举报原因:
原因补充:

(最多只允许输入30个字)