51Nod 1112 KGold(直線相交)

2021-07-25 14:49:50 字數 1617 閱讀 3252

1112 kgold

uvalive 5868

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

給出n個人在0時刻的財富值m[i](所有人在0時刻的財富互不相等),以及財富增長速度s[i],隨著時間的推移,某些人的財富值會超越另外一些人。如果時間足夠長,對於財富增長最快的人來說,他的財富將超越所有其他對手。

求發生的前10000次超越,分別是誰超過了誰?如果總的超越次數不足10000,則輸出所有超越,如果1次超越都不會發生,則輸出no solution。

輸出按照超越發生的時間排序,同一時刻發生的超越,按照超越者的編號排序,如果編號也相同,則按照被超越者的編號排序。所有排序均為遞增序。

input

第1行:n,表示人的數量。(1 <= n <= 10000)

第2 - n + 1行:每行2個數,分別是初始的財富值m[i],和財富增長速度s[i]。(0 <= m[i] <= 10^5, 1 <= s[i] <= 100)

output

輸出前10000次超越,超越者和被超越者的編號。如果總的超越次數不足10000,則輸出所有。如果1次超越都不會發生,則輸出no solution。

輸出按照超越發生的時間排序,同一時刻發生的超越,按照超越者的編號排序,如果超越者編號也相同,則按照被超越者的編號排序。所有排序均為遞增序。

input示例

4

1 100

2 100

3 14 50

output示例

2 3

1 32 4

1 4

李陶冶(題目提供者)

這題可以簡單轉化為求直線交點問題,當且僅當財富值m[i]s[j]時才會發生超越

因此  find函式裡找到當前時間下,每個點超越(或者被超越了幾次)->這裡二分一下即可,剩下的用

乙個優先佇列儲存即可(n^2存點,僥倖通過)

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 10005

#define eps 1e-8

using namespace std;

struct res

}s[maxn];

struct coin

}c[maxn];

struct point

}now;

priority_queueq;

int n;

int find(double x)//判斷x秒時,每個人的財富超過了多少人的財富

sort(c+1,c+n+1);

for(i=1;i<=n;i++)

if(i0.00001)

for(i=2;i<=n;i++)

for(j=1;jeps && x

}for(i=1;i<=10000;i++)

else

break;

}}

51nod 1278 相離的圓

題目 平面上有n個圓,他們的圓心都在x軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。例如 4個圓分別位於1,2,3,4的位置,半徑分別為1,1,2,1,那麼,這5對都有交點,只有是相離的。input 第1行 乙個數n,表示圓的數量 1 n 50000 第2 n 1行 每行2個數p,r中間用空格...

51 NOD 1278 相離的圓

1278 相離的圓 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 平面上有n個圓,他們的圓心都在x軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。例如 4個圓分別位於1,2,3,4的位置,半徑分別為1,1,2,1,那麼,這5對都有交點,只有是相離的。inpu...

51Nod1753 相似子串

兩個字串相似定義為 1.兩個字串長度相等 2.兩個字串對應位置上有且僅有至多乙個位置所對應的字元不相同 給定乙個字串,每次詢問兩個子串在給定的規則下是否相似。給定的規則指每次給出一些等價關係,如 a b b c 等,注意這裡的等價關係具有傳遞性,即若 a b b c 則 a c input 第一行乙...