D. Stoned Game
题意:
有n堆石头,两个人轮流拿一个石头。后手不能拿刚刚先手抓的堆.
问:
最后谁赢。
思路1:
- 可以先考虑,假如有一堆的总数>其它的堆的总数.那么先手可以一直抓这一堆,把对手磨死(贪心,抓大堆)。
- 那么假如一般情况,也是贪心抓大堆,log维护一下。
思路2:
- 可以先考虑,假如有一堆的总数>其它的堆的总数.那么先手可以一直抓这一堆,把对手磨死(贪心,抓大堆)。
- sum为偶数,肯定后手赢。反之,先手赢。(菜鸡不会证明)
AC1
#include <iostream>
#include <queue>
using namespace std;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
priority_queue<int>q;
int n,x;cin>>n;
for(int i=1; i<=n; i++)cin>>x,q.push(x);
int now=1,last=0;//注意初始化。
while(!q.empty()){
x=q.top(),q.pop();
now^=1;
if(last)q.push(last);
last=x-1;
}
cout<<( (now)?("HL"):("T") )<<endl;
}
return 0;
}
AC2
#include <iostream>
#include <algorithm>
using namespace std;
int a[200];
int main()
{
int t;cin>>t;
while(t--){
int n;cin>>n;
int sum=0;
for(int i=1; i<=n; i++)cin>>a[i],sum+=a[i];
sort(a+1,a+1+n);
if(a[n]>sum-a[n]){//先手靠最大的,把对手磨死
cout<<"T"<<endl;
}else {
if(sum%2==0)cout<<"HL"<<endl;
else cout<<"T"<<endl;
}
}
return 0;
}