AGC 018C Coins 貪心 排序

2021-08-04 05:35:46 字數 783 閱讀 5557

題意:n個人(n=x+y+z) 每個人有金銀銅三種顏色硬幣a[i],b[i],c[i]個,問向x個人拿金,y個人拿銀,z個人拿銅,只能向每個人要一次,最多能拿到多少硬幣? n<=1e5,a[i],b[i],c[i]<=1e9.

先考慮每個人只有兩種硬幣的情況,按照a[i]-b[i]從小到大排序後,因為j>i時 a[j]+b[i]>a[i]+b[j] 任意乙個金都應該選在任意乙個銀之後才能能最優.

把c累加進ans,(a,b,c)就轉換成(a-c,b-c,0) 則問題變為剩下n個選x個金,y個銀的最大值.

列舉分界點k(k>=y),從前k個中選最大的y個銀,後k+1個中選出最大的x個金.優先佇列或者multiset維護.

#include using namespace std;

typedef long long ll;

const int n=2e5+20;

ll f[n],g[n],n,x,y,z;

struct nodea[n];

bool cmp(node a,node b)

sort(a+1,a+1+n,cmp);

ll sum=0;

for(int i=1;i<=n;i++)

f[i]=sum;

} s.clear(),sum=0;

for(int i=n;i>=1;i--)

g[i]=sum;

} ll ans=0;

for(int i=y;i<=n-x;i++)

ans=max(ans,res+f[i]+g[i+1]);

cout<

思維題 貪心 AGC018C Coins

題目傳送門 嘗試了一下弱化條件想題的方法,還不錯?題目中有三種硬幣,並不利於直接貪心.我們不妨先考慮只有兩種硬幣的情況.按照貪心的思想,應該按照兩種硬幣的差值 即乙個人金幣的個數減去銀幣的個數 進行排序,然後從前選y個,剩下的x個都為金幣.然後我們將條件加回來,發現性質有了一點點變化.因為有銅幣的影...

AGC 019 C 貪心 線段樹

題目大意 網個圖邊長100,有些格點有半徑為10的圓盤。只能沿著邊和圓盤邊界走,不能進入圓盤。問乙個點到另乙個點的最短路。網格圖大小1e8,圓盤個數1e5。不存在兩個圓盤在同一條橫線或者豎線上。題解 圓盤看上去只會繞遠路,其實不然,如果想要從 x,y 走到 x 1,y 1 並且 x 1,y 處有乙個...

018 C語言靜態庫動態庫

linux下 c語言程式設計環境 頭檔案目錄 usr include 庫目錄 usr lib 動態庫與靜態庫的區別 在電腦程式源 需要通過翻譯 彙編 鏈結過程而生成可執行檔案,再由載入器載入到記憶體,兩者區別就在於程式載入時鏈結到相應庫的方式不同,程式編譯時指定了靜態庫,編譯後可直接執行,而編譯時指...