嘎嘎,今天被一些事耽誤了,但是還是A了幾個題目,這道題還不錯
題目鏈接:
題意:兩個人玩游戲,有N堆紙牌,紙牌上有數字,A每次只能取N堆中的 其中一個的頂部的 紙牌,B只能取N堆中的其中一個底部 的紙牌,A,B都想讓自己取的和最大,問最後比分為多少
畫了一下,如果某一堆裡的 紙牌數量為偶數,發現其實是兩個人各分一半,因為如果對方想從這裡拿走本來屬於自己那半部分的 較大的牌,自己完全來得及阻止的,
接下來就是奇數了,奇數 其實先手者就搶到了中間的一張牌,另外兩半還是各自一半,所以 應該以每個奇數堆的 中間紙牌 的大小來進行貪心,
int n;
typedef struct Node {
int mid;
int id;
};
Node node[100 + 55];
int mp[100 + 55][100 + 55];
int ss[100 + 55];
void init() {
memset(ss,0,sizeof(ss));
memset(node,0,sizeof(node));
}
bool input() {
while(cin>>n) {
return false;
}
return true;
}
bool cmp(Node x,Node y) {
return x.mid > y.mid;
}
void cal() {
int ans1 = 0;
int ans2 = 0;
int cnt = 0;
for(int i=0;i 0) {
int k = node[i].id;
for(int j=1;j<=(ss[k] + 1)/2;j++)
ans1 += mp[k][j];
for(int j=(ss[k] + 1)/2 + 1;j<=ss[k];j++)
ans2 += mp[k][j];
}
else {
int k = node[i].id;
for(int j=1;j<=ss[k]/2;j++)
ans1 += mp[k][j];
for(int j=(ss[k] + 1)/2;j<=ss[k];j++)
ans2 += mp[k][j];
}
mark *= -1;
}
cout<