CodeForces - 1203F1 Complete the Projects (easy version)(贪心)
題目鏈接:點(diǎn)擊查看
題目大意:現(xiàn)在有一個(gè)人,初始時(shí)有r元錢,現(xiàn)在有n個(gè)項(xiàng)目需要讓他來解決,每個(gè)項(xiàng)目的門檻是a元錢,完成項(xiàng)目后的報(bào)酬是b元(報(bào)酬可以是負(fù)數(shù)),問能否在適當(dāng)調(diào)整項(xiàng)目順序后完成所有項(xiàng)目,能的話輸出YES,否則輸出NO
題目分析:我是在補(bǔ)題的時(shí)候做的這個(gè)題,所以就可以直接看到標(biāo)簽了,標(biāo)簽只寫了是一個(gè)2100分的貪心,不過想了好久還只是想到了一點(diǎn)點(diǎn)部分,這個(gè)題目的核心是如何排序,只要排好序后,從頭到尾按照題意掃描一遍就可以判斷了
那么對(duì)于這個(gè)題目的排序,我們首先肯定是要優(yōu)先拿報(bào)酬都是非負(fù)數(shù)的,這樣才能讓這個(gè)人的錢越來越多,則對(duì)于報(bào)酬都是正數(shù)的項(xiàng)目來說,最優(yōu)解是讓門檻較低的項(xiàng)目排在前面,這樣就解決了報(bào)酬是正數(shù)的項(xiàng)目了
則剩下的就是報(bào)酬是負(fù)數(shù)的項(xiàng)目了,我們不能單純對(duì)于門檻的大小來排序,隨便找一組數(shù)據(jù)就hack掉了,比如:
2 10
10 -5
8 -1
所以肯定還是需要思考的,因?yàn)槲覀冊(cè)谕瓿身?xiàng)目后需要盡可能的讓剩下的錢更多,那么就可以按照a+b作為權(quán)值進(jìn)行降序排序,因?yàn)楫?dāng)這個(gè)人在完成當(dāng)前項(xiàng)目的時(shí)候,錢一定是大于等于門檻的,我們不妨設(shè)當(dāng)前的錢就是門檻,這樣一來在完成當(dāng)前項(xiàng)目后,剩下的錢就是a+b元了,這樣就能簡單證明出來了(好像不太嚴(yán)謹(jǐn),但大概能說明這樣排序的可行性了)
排完序之后掃一遍,按照規(guī)則判斷就行了,規(guī)則就是這個(gè)人的錢每次必須都比門檻要高,并且錢不能出現(xiàn)負(fù)數(shù)
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;int n,r;struct Node {int a,b,flag;//flag=0:b為正或零 flag=1:b為負(fù) bool operator<(const Node& k)const{if(flag!=k.flag)return flag<k.flag;if(flag==0)//都是正數(shù)return a<k.a;//這里如果都是正數(shù)的話,那么b的大小就無所謂了,只需要讓a升序排列就行了else//都是負(fù)數(shù) {if(a+b!=k.a+k.b)//優(yōu)先按照a+b降序排序return a+b>k.a+k.b;return a>k.a;//其次按照a較大的排序}} }a[N];bool check() {for(int i=1;i<=n;i++){if(r<a[i].a)//如果當(dāng)前的錢不足以抵消當(dāng)前任務(wù)的門檻return false;r+=a[i].b;if(r<0)//如果中途出現(xiàn)了負(fù)數(shù)return false;}return true; }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);scanf("%d%d",&n,&r);for(int i=1;i<=n;i++){scanf("%d%d",&a[i].a,&a[i].b);if(a[i].b>=0)a[i].flag=0;elsea[i].flag=1;}sort(a+1,a+1+n);if(check())printf("YES\n");elseprintf("NO\n");return 0; }?
總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1203F1 Complete the Projects (easy version)(贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU - 1528 Card Game
- 下一篇: UVALive - 3126 Taxi