題目大意:給出 n 個物品,每個物品有兩個屬性代表價值,有兩個玩家依次輪流拿物品,玩家一拿到物品後的貢獻為屬性一的累加,同理玩家二拿到物品後的貢獻為屬性二的累加,現在問兩人都希望在拿完物品後的貢獻比對方盡可能多,問兩人會如何選擇
題目分析:現在看來是一道很簡單的貪心問題,但是在比賽的時候卻沒有反應過來,可能是被那兩道簡單但是坑非常奇怪的題卡崩了心態吧,貪心策略就是將每個物品的屬性累加即可,因為當某個玩家選擇了這個物品後,其貢獻是相應的屬性,而其餘的那個屬性則代表了對方拿不到這個物品所損失的代價,所以這個物品的貢獻是 a + b,同理,無論輪到哪個玩家拿取時,每個物品的貢獻都是 a + b ,所以按照這個值排序後,依次分配個兩個玩家就好了
**:
#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int n=2e5+100;
struct node
}a[n];
int main()
for(int i=1;i<=n;i++)
scanf("%d",&a[i].b);
sort(a+1,a+1+n);
vectorans1,ans2;
for(int i=1;i<=n;i++)
for(int i=0;iprintf("%d ",ans1[i]);
printf("\n");
for(int i=0;iprintf("%d ",ans2[i]);
printf("\n");
return 0;
}
牛客 wyh的物品
題解 一道經典的實數二分題。二分答案,假設取這k個物品的下標為i1,i2,iki1 i2 ik 二分得到乙個答案x。a為重量,b為價值,實際的結果為 j 1kbi jaij sum k frac j 1k aij bij 如果 j 1kbi jaij x sum k frac x j 1k aij ...
牛客 Guard the empire 貪心
首先看到題目求最小覆蓋,應該可以想到是貪心類的問題 題目要求覆蓋所有骨龍,首先所有骨龍都會在一段區間內被覆蓋,我們可以算出每個骨龍的這段距離。之後就是求有多少個點可以將這些區間全部覆蓋,這是貪心的經典問題。顯然是先排序,以第乙個點的右端點為初始值,往下遍歷,如果某個左端點大於他,那麼更新為當前的右端...
2020牛客寒假演算法基礎集訓營2 F 拿物品
思路 仍然是大佬題解 乙個人拿走了ai,則另乙個人就失去了bi,所以都優先選擇總價值最高,不是只拿自己價值最高的物品 所以按總價值從大到小排序,依次輸出物品原本的序號。ac include using namespace std const int maxn 200002 int n struct ...