題目傳送門
因為小 \(d\) 打出的牌與小 \(c\) 打出的牌花色必須相同,所以我們需要按照花色分類討論
對於某一種花色
如果小 \(c\) 沒有這種花色的牌但是小 \(d\) 有,那麼小 \(d\) 的牌一定打不出去,直接 \(continue\) 掉
如果小 \(c\) 有這種花色的牌,那麼對於小 \(d\) 來說,他肯定想讓他贏的次數盡可能多
這其實就是乙個田忌賽馬的問題
我們把小 \(c\) 和小 \(d\) 的牌按照點數從大到小排序
對於小 \(d\) 的每一張牌,我們在小 \(c\) 小於等於這張牌點數的牌裡選擇點數最大的那一張與其配對
因為消耗乙個點數大的牌肯定更優,這樣可以為之後的牌創造更多的獲勝機會
因為小 \(d\) 的牌的點數是單調遞減的,所以選出的牌的點數也一定是單調遞減的
因此,我們可以用乙個指標維護
這樣到最後小 \(d\) 的牌要麼都打光,要麼剩下一些
對於剩下的牌,我們隨便配對就可以了,因為打出去肯定比不打出去更優
在匹配的過程中如果小 \(c\) 的牌不夠用,那麼就停止匹配
如果小 \(d\) 的牌打光後小 \(c\) 還剩下牌,那麼小 \(d\) 只能選擇棄權
#include#include#include#include#define rg register
struct asd
asd(int aa,int bb)
};bool cmp(asd aa,asd bb)
const int maxn=1e5+5;
std::vectorgd[maxn],gc[maxn];
int ans[maxn],n,m,maxid;
long long c,v;
bool vis[maxn];
void solve(int id)
} }for(rg int i=0;i=gd[id].size()) else }}
int main()
for(rg int i=1;i<=m;i++)
for(rg int i=1;i<=maxid;i++)
for(rg int i=1;i<=maxid;i++) solve(i);
printf("%lld\n",v);
for(rg int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
洛谷 P1233 貪心
一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...
洛谷P1684 考驗(貪心)
貪心 盡可能的在已經連線起來的詩歌後面接上新的詩歌 新建乙個last儲存上次匹配串的末尾的後乙個字元 每當當前點的位置到last的長度大於四,有可能成為新串的時候 暴力判斷是否可以成為詩歌,若成功更新答案和last 我們用f i 表示以i結尾的詩歌數 所以每次更新是f last 1 1 若不成功f ...
洛谷p1233 sort 貪心
題目描述 一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍...