【BZOJ】【1029】【JSOI2007】建筑抢修

贪心

  按T2(完成时限)排序,然后从前往后依次枚举

    如果sum+a[i].t1<=a[i].t2则加入

    如果来不及修这个建筑:

      如果当前这个建筑的维修时间t1比之前修过的建筑中耗时最长的耗时短,则替换一下

      否则跳过- -

    以上过程用一个堆(priority_queue)维护即可

SB了一下:pq默认是大根堆……sigh

 1 /**************************************************************
 2     Problem: 1029
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:284 ms
 7     Memory:2836 kb
 8 ****************************************************************/
 9
10 //BZOJ 1029
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<iostream>
15 #include<algorithm>
16 #include<queue>
17 #define rep(i,n) for(int i=0;i<n;++i)
18 #define F(i,j,n) for(int i=j;i<=n;++i)
19 #define D(i,j,n) for(int i=j;i>=n;--i)
20 #define fi first
21 #define se second
22 using namespace std;
23
24 int getint(){
25     int v=0,sign=1; char ch=getchar();
26     while(ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();}
27     while(ch>=‘0‘&&ch<=‘9‘) {v=v*10+ch-‘0‘; ch=getchar();}
28     return v*=sign;
29 }
30 /*******************tamplate********************/
31 const int N=150010;
32 typedef pair<int,int> pii;
33 pii a[N];
34 priority_queue<int> Q;
35 int main(){
36 //  freopen("input.txt","r",stdin);
37     int n=getint();
38     F(i,1,n){
39         a[i].se=getint(); a[i].fi=getint();
40     }
41     sort(a+1,a+1+n);
42     int _sum=0,ans=0;
43     F(i,1,n){
44         if (_sum+a[i].se<=a[i].fi){
45             _sum+=a[i].se;
46             Q.push(a[i].se);
47             ans++;
48         }
49         else if (Q.top()>a[i].se){
50             _sum=_sum-Q.top()+a[i].se;
51             Q.pop();
52             Q.push(a[i].se);
53         }
54     }
55     printf("%d\n",ans);
56     return 0;
57 }

时间: 2024-10-12 19:30:30

【BZOJ】【1029】【JSOI2007】建筑抢修的相关文章

BZOJ 1029 [JSOI2007] 建筑抢修(贪心)

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2285  Solved: 1004[Submit][Status] Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达

BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 4810  Solved: 2160[Submit][Status][Discuss] Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全 毁坏.现在的情况是:T部落基地里只有一个修理

BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑.如果某个建筑在一段时间之内没有完全修理完毕,这

BZOJ 1029 [JSOI2007]建筑抢修

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2748  Solved: 1213[Submit][Status][Discuss] Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人

BZOJ 1029: [JSOI2007]建筑抢修 优先队列

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1029 Description 小 刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设 施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地

bzoj 1029 [JSOI2007]建筑抢修 - 贪心 + 大根堆

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MB Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建

BZOJ 1029: [JSOI2007]建筑抢修 贪心

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1029 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建

[BZOJ 1029] [JSOI2007] 建筑抢修 【贪心】

题目链接:BZOJ - 1029 题目分析 使用一种贪心策略. 现将任务按照deadline从小到大排序. 然后枚举每一个任务,如果当前消耗的时间加上完成这个任务的时间不会超过这个任务的deadline,那么就完成这个任务. 否则,如果完成这个任务的时间比之前选择完成的任务中完成时间最长的一个要短,那么就弹出之前完成的那个任务,换上当前的这个任务. 这样当前的答案没有变,当前消耗的时间却减少了. 用堆来实现取最大值的操作. 代码 #include <iostream> #include <

BZOJ 1029 JSOI2007 建筑抢修 贪心+堆

题目大意:n个建筑须要抢修.第i个建筑须要T1时间抢修.必须在T2时间之前抢修完成.求最多能抢修多少建筑 首先我们对T2排序 然后依次修理 可是这样贪心显然是不对的 比方说这组数据: 5 10 10 10 20 2 21 2 21 2 21 贪心仅仅能修理前两个.而实际上最多能够修理4个 于是我们考虑修正贪心算法 比方说这组数据,当我们枚举到3的时候.尽管已经无法修理很多其它了,可是我们能够取消修理建筑1而改修理3.这样尽管不能更新ans 可是能够为后面的建筑节省时间 所以做法就非常明白了 我们

1029: [JSOI2007]建筑抢修

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2382  Solved: 1033[Submit][Status] Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达