HDU 4671 Backup Plan 构造

http://acm.hdu.edu.cn/showproblem.php?pid=4671

水题...构造前两列 ...最傻逼的模拟方法...统计数量后均摊到所有项...

/********************* Template ************************/
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;

#define EPS         1e-8
#define MAXN        100005
#define MOD         (int)1e9+7
#define PI          acos(-1.0)
#define INF         ((1LL)<<50)
#define max(a,b)    ((a) > (b) ? (a) : (b))
#define min(a,b)    ((a) < (b) ? (a) : (b))
#define max3(a,b,c) (max(max(a,b),c))
#define min3(a,b,c) (min(min(a,b),c))
#define BUG         cout<<"BUG! "<<endl
#define LINE        cout<<"------------------"<<endl
#define L(t)        (t << 1)
#define R(t)        (t << 1 | 1)
#define Mid(a,b)    ((a + b) >> 1)
#define lowbit(a)   (a & -a)
#define FIN         freopen("in.txt","r",stdin)
#pragma comment     (linker,"/STACK:102400000,102400000")

// typedef long long LL;
// typedef unsigned long long ULL;
// typedef __int64 LL;
// typedef unisigned __int64 ULL;
// int gcd(int a,int b){ return b?gcd(b,a%b):a; }
// int lcm(int a,int b){ return a*b/gcd(a,b); }

/*********************   F   ************************/
int a[105][2];
struct pp{
    int v;
    int id;
}s[105];
int cmp(pp a, pp b){
    return a.v < b.v;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("ou.txt","w",stdout);
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        int q[105],p[105];
        if(n <= m){
            for(int i = 0 ; i < 105 ; i++) s[i].v = 0;
            for(int i = 0 ; i < m ; i++) q[i] = i % n + 1;
            sort(q,q+m);
            for(int i = 0 ; i < m ; i++) {
                s[q[i]].v++;
                s[q[i]].id = q[i];
            }
            sort(s+1,s+n+1,cmp);
            for(int i = 0 ; i < m ; i++){
                int j = 0;
                while(q[i] == q[i+1]){
                    if(s[j%n+1].id != q[i])
                        p[i++] = s[j%n+1].id;
                    else
                        p[i++] = s[(++j)%n+1].id;
                    j++;
                }
                if(s[j%n+1].id != q[i])
                    p[i] = s[j%n+1].id;
                else
                    p[i] = s[(++j)%n+1].id;
            }
        }else {
            for(int i = 0 ; i < m ; i++) q[i] = i % n + 1;
            for(int i = 0 ; i < m ; i++) p[i] = n;
        }
        for(int i = 0 ; i < m ; i++){
            cout<<q[i] <<" "<<p[i]<<" ";
            for(int j = 1; j <= n ;j++){
                if(j != q[i] && j != p[i])
                    cout<<j<<" ";
            }
            cout<<endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Felix-F/p/3256290.html