LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)
生活随笔
收集整理的這篇文章主要介紹了
LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解析
和國王游戲一樣的做法
容易寫出cmp函數的依據:
但是這個題的比較函數有一個取min的操作
這個東西會有一個問題:不滿足不可比性的傳遞性
通俗的說,x=y,y=z,但是x不一定=z
比如說如果y的a和b都很小,就會出現這個無論a和c之間關系如何,等式總是成立的尷尬情況
為了避免這個東西,引入了Johnson 法則
設置d
d=1(a>b)
d=0(a=b)
d=-1(a<b)
在d不同時,優先按照d排序(顯然d不同時是正確的)
d相同在把他們的最小值比較即可
代碼
(先是自己搞的所有沒有按題解寫)
#include<bits/stdc++.h> using namespace std; #define ll long long #define il inline const int N=4e3+100; const int M=150; const int mod=998244353; const int mx=7e4; inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } int n; struct node{int a,b,id; }p[N]; bool cmp (const node u,node v){if(min(u.a,v.b)!=min(u.b,v.a)) return min(u.a,v.b)<min(u.b,v.a);return u.a<v.a; }int main(){n=read();for(int i=1;i<=n;i++) p[i].a=read(),p[i].id=i;for(int i=1;i<=n;i++) p[i].b=read();sort(p+1,p+1+n,cmp);int ta=0,tb=0;for(int i=1;i<=n;i++){ta+=p[i].a;tb=max(ta,tb)+p[i].b;}printf("%d\n",tb);for(int i=1;i<=n;i++){printf("%d",p[i].id);putchar(' ');}return 0; } /**/總結
以上是生活随笔為你收集整理的LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子公章在线制作最常见的方法如何用电脑制
- 下一篇: LOJ:黑暗城堡(最短路)