Sicily 11159. Year Award

来源:互联网 发布:淘宝的地址在哪里设置 编辑:程序博客网 时间:2024/06/03 16:19

11159. Year Award

Constraints

Time Limit: 1 secs, Memory Limit: 256 MB , Special Judge

Description

Melita has just returned from the annual pig slaughter. Don't worry, this is a regular thing in Croatia. The best part was the abundance of food! There was everything, starting from good spicy sausages, ham, black pudding, up to teewurst, top quality bacon and ?varci, all with warm white bread and butter. After these appetizers, it was the perfect time to whip up a deep pot full of sarma (Melita ate twentyish of them) as well as a large platter of fine roast pork, so soft that it almost melts in your mouth. They watered all of this down with copious gulps of the best dry white wine that made them even hungrier.

 
Butcher Bajs kept his award-winning ham for the very end. N people attented the annual pig slaughter, labeled with numbers from 1 to N. These people already ate a lot of meat: the kth person ate A[k] kilograms of meat so far. Bajs will distribute his ham to the people in the ratio B[1] : B[2] : … : B[N], exactly in that order, but he doesn't know the total amount (number of kilos) of ham which he will be distributing yet.
 
At the end of the slaughter, the Man of the Year will be declared. A ranking list is made according to the total kilos of meat eaten. Bajs impacts directly on this list by choosing the amount of ham to distribute. Although Bajs has been offered bribes many times, he refused each time, saying that he was an honest man who would not hurt a fly.
 
Bajs cares about order, because he's a nice gentleman, and wants to have the order of people in the exact form of 1, 2, 3, ..., N, respectively from the one who ate the most kilos of meat to those who ate less, allowing ties between participants. Help Bajs select the total amount of ham that he will distribute (in the ratio mentioned before) to achieve his intention.
 

Input

The first line of input contains an integer N (2 ≤ N ≤ 1000), the number of competitors for the Man of the Year award.

Each of the following k lines contains integers A[k] i B[k], as mentioned in the text (0 ≤ A[k], B[k] ≤ 10^6). At least one of the numbers B[k] will not be equal to 0.

Output

The first and only line of output must contain -1 if the required order cannot be achieved. Otherwise, output the required amount of ham in kilos, a real number (rounded up to 12 decimal places) between 0 and 10^7 (inclusive). If there are multiple possible solutions, output any.

Sample Input

样例1:37 13 210 0样例2:32 14 00 3样例3:515 46 712 59 61 7

Sample Output

样例1:10.5样例2:-1样例3:87

Hint

Clarification of the first example: 10.5 kilos of ham is distributed in the ratio 1 : 2 : 0, which gives us 3.5, 7 and 0 kilos of ham, respectively. If we add this to the already eaten amount of meat, we conclude that the participants ate 10.5, 10 and 10 kilos in total, which is a valid order.

Problem Source

2014年每周一赛第五场

题意就是求出一个x,使得a[i] + (b[i] / sum) * x >= a[i + 1] + (b[i + 1] / sum) * x,其中i从0到n-1,sum是所有b[i]的和,化简公式可以发现对于i从0到n-1,每个上述不等式都能得到x的一个范围,对于每个范围取交集即可。

这题测试样例比较坑,怒交20次才得出下面正确的- -。

#include <algorithm>#include <iostream>#include <string>#include <stdio.h>#include <queue>#include <string.h>#include <vector>#include <iomanip>#include <map>#include <stack>#include <functional>#include <list>using namespace std;#define INF 2000000000int main() {    //std::ios::sync_with_stdio(false);    int n;    cin >> n;        vector<int> a(n);    vector<int> b(n);    long long int sum = 0;    for (int i = 0; i < n; i++) {                cin >> a[i] >> b[i];        sum += b[i];    }    double up = 10000000.0, down = 0;    bool impossible = false;    for (int i = 0; i < n - 1; i++) {        if (b[i + 1] - b[i] > 0) {            double newUp = double(sum * (long long)(a[i] - a[i + 1])) / (double)(b[i + 1] - b[i]);            if (newUp < up) up = newUp;        } else if (b[i + 1] - b[i] < 0) {            double newDown = double(sum * (long long)(a[i] - a[i + 1])) / (double)(b[i + 1] - b[i]);            if (newDown > down) down = newDown;        } else if (a[i] < a[i + 1]) {            cout << -1 << endl;            return 0;        }    }    if (down <= up)        printf("%lf\n", (up + down) / 2);    else        cout << -1 << endl;    //getchar();    //getchar();        return 0;}                   


0 0
原创粉丝点击