题目
这道题最开始没有思路,但是分析了一下,两个人最终各自移动硬币数之和,必为全部硬币数的一半res。且栈里最大的硬币数一定小于或等于res。但是接下来思路就偏了,以为要得到划分到一起的栈的下标。实际上并不用,因为两个人是一轮中一个一个拿走的,所以让两个栈中的硬币数各自减一,为0即止。所以轮数必为res。这样不断的循环,就能表示每轮的情况。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
priority_queue<PII> q;
const int N=55;
int n, s[N];
void solve(){
int maxx=0;
cin>>n;
for(int i=1; i<=n; i++){
cin>>s[i];
maxx=max(maxx, s[i]);
if(s[i]>0)
q.push({s[i], i});
s[i]+=s[i-1];
}
if(s[n]&1 || maxx*2>s[n]){
puts("no");
return;
}
puts("yes");
while(q.size()>0){
PII a=q.top();
q.pop();
PII b=q.top();
q.pop();
printf("%d %d\n", a.second, b.second);
if(a.first!=1)
q.push({a.first-1, a.second});
if(b.first!=1)
q.push({b.first-1, b.second});
}
}
int main()
{
solve();
return 0;
}