New Year Contest
阿新 • • 發佈:2021-10-02
很有趣的題目一道
顯然的貪心就是按照時間順序做,先最耗時短的,零點前的都零點交,零點後的都做完就交
正確性怎樣保證呢
我們按照這個耗時進行排名後,假如交換兩個任務的話
如果這兩個任務都再零點前,沒有影響,
如果後一個任務跨零點了,那麼交換以後,後面的任務的罰時不會變,但前面的任務有可能也要罰時了,答案不可能更優
如果前一個任務跨零點,那麼交換以後,後一個任務罰時不變,前一個任務罰時更大,答案更差
如果兩個任務都在零點以後,顯然
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<stack> #include<map> #define lll long long using namespace std; int n; int a[100001]; int kt=350; int lim=710; int ans; int cnt; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } sort(a+1,a+n+1); int sum=0; for(int i=1;i<=n;++i){ sum+=a[i]; if(sum>lim){ break; } cnt=i; if(sum<=kt){ continue; }else{ ans+=(sum-kt); } } cout<<cnt<<" "<<ans<<endl; return 0; }