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; }