牛客練習賽40 B 小A與任務(貪心)
其實是個比較套路的貪心
按照結束時間排序,每個任務依次考慮過去
n o w now now代表當前做任務花費的時間
當我們要做第 i i i個任務的時候,首先讓 n o w + = x i now+=x_i now+=xi
這時候,如果 n o w now now不大於結束時間,就往後考慮
如果 n o w now now比結束時間大了,說明前面的任務需要用金幣來騰出時間
用哪些任務來騰時間最划算??當然是 z z z值比較小的那些任務
由於我們需要動態維護 [ 1 , i ] [1,i] [1,i]任務的 z z z值
所以搞一個優先佇列即可,每次把當前任務壓入佇列
動態維護之前每個任務還有多少時間可以用金幣換,看程式碼就容易了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
struct node{
int z,x,y;
bool operator < (const node&tmp ) const{ return z<tmp.z; }
}a[maxn]; int n;
bool com( node a,node b ){ return a.y<b.y; }
priority_queue<node>q;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&a[i].z,&a[i].x,&a[i].y );
sort( a+1,a+1+n,com );
int now = 0;//目前花費的時間
double ans = 0;//做完[1,i]任務需要花費的最少金幣
for(int i=1;i<=n;i++)
{
q.push( a[i] );
now += a[i].x;//加上完成時間
while( now>a[i].y )
{
node u = q.top(); q.pop();
int k = min( now-a[i].y,u.x );//用金幣購買的時間
ans += 1.0*k/u.z;
now -= k, u.x-=k;
if( u.x ) q.push( u );
}
}
printf("%.1f\n",ans);
}
相關文章
- 牛客練習賽26 C 城市規劃【思維+貪心】
- 牛客練習賽
- 牛客練習賽 26
- 牛客練習賽60
- 牛客 tokitsukaze and Soldier 貪心
- 牛客練習賽 71 AC
- 牛客 切長條(貪心)
- 牛客練習賽14B 區間的連續段
- 牛客周賽 Round 40
- 牛客練習賽26 A 平面【遞推】
- 牛客練習賽129 A-數數
- 牛客周賽 Round 36 (小白練習記)
- 牛客練習賽73 D題:離別
- 【牛客訓練記錄】牛客周賽 Round 69
- 【牛客訓練記錄】牛客周賽 Round 70
- Mysql 練習(牛客網)MySql
- 牛客小白月賽103 A--B--C
- 牛客小白月賽95 (賽前的練習之我是小菜雞)
- 牛客練習賽27【C 水圖 dfs求最長路】
- 牛客SQL練習第21題SQL
- 牛客練習賽74 E CCA的期望(算概率的技巧+floyd處理)
- PAT-B 1070 結繩【貪心】
- B. Negative Prefixes(貪心,構造)
- 牛客周賽48
- 牛客周賽 Round 40 (小白醬的被虐之旅嗚嗚嗚)
- 牛客小白周賽9
- 牛客小白月賽89
- 牛客小白月賽88
- 牛客周賽 Round 38
- 牛客周賽 Round 57
- 牛客周賽 Round 56
- 牛客小白月賽105
- 牛客周賽 Round 47
- 牛客周賽Ronud 46
- 牛客周賽 Round 8
- 牛客小白月賽97
- 牛客周賽 Round 63
- 牛客周賽 Round 1