sgu 138 Games of Chess

Posted gaudar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sgu 138 Games of Chess相关的知识,希望对你有一定的参考价值。

题意:给出所有人比的场数,设计一种方案。赢的人必须连续打下一轮。

能得知2个结论:1:不会有人的场数超过场数和的一半,否则他的对手会有自己。2:要打赢一个人的人至少会打2场,因为他打赢算1场,然后还必须参加下一场。打2场以上的人打的场数和>=所有人的场数和的一半。

这样的话,就用场数多的当胜者,他打的最后一场让他败,换另一个胜场多的当胜者。

实际实现有点困难。特别注意对手不能是自己。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#define mkp make_pair
using namespace std;
const double EPS=1e-8;
const int SZ=10050,INF=0x7FFFFFFF;
typedef long long lon;
priority_queue<pair<int,int>> pq;
int arr[SZ][2];

void work(int n)
{
    pair<int,int> top=pq.top();
    pq.pop();
    for(int i=1;i<=top.first-1;++i)arr[i][0]=top.second;
    arr[top.first][1]=top.second;
    int pos=top.first;
    if(pos==n)++pos;
    for(;pos!=n+1;)
    {
        top=pq.top();
        pq.pop();
        for(;top.first&&pos!=n+1;--top.first)
        {
            //cout<<pos<<endl;
            //if(!arr[pos][1])arr[pos++][1]=top.second;
            if(top.first==1)
            {
                arr[pos][1]=top.second;
                if(pos==n)++pos;
            }
            else arr[pos++][0]=top.second;
        }
        
    }
    pos=1;
    if(top.first)
    {
        for(;top.first;)
        {
            if(arr[pos][0]==0)arr[pos++][0]=top.second,--top.first;
            else if(arr[pos][1])++pos;
            else arr[pos++][1]=top.second,--top.first;
        }
    }
    for(;!pq.empty();)
    {
        top=pq.top();
        pq.pop();
        for(;top.first;)
        {
            if(arr[pos][0]==0)arr[pos++][0]=top.second,--top.first;
            else if(arr[pos][1])++pos;
            else arr[pos++][1]=top.second,--top.first;
        }
    }
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\1.txt","r",stdin);
    lon casenum;
    //cin>>casenum;
    //for(lon time=1;time<=casenum;++time)
    {
        int n;
        cin>>n;
        int sum=0;
        for(int i=1;i<=n;++i)
        {
            int tmp;
            cin>>tmp;
            pq.push(mkp(tmp,i));
            sum+=tmp;
        }
        sum/=2;
        work(sum);
        cout<<sum<<endl;
        for(int i=1;i<=sum;++i)
        {
            cout<<arr[i][0]<<" "<<arr[i][1]<<endl;
        }
    }
    return 0;
}

 

以上是关于sgu 138 Games of Chess的主要内容,如果未能解决你的问题,请参考以下文章

SGU104 Little shop of flowers (DP)

SGU 104 Little Shop of Flowers (DP&打印路径)

SGU109 Magic of David Copperfield II

GAMES101&Fundamentals of Computer Graphics

hihoCoder 1392 War Chess 模拟 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

Panda Games: Corporate Disclosure in the Eclipse of Search