codeforces #261 C題 Pashmak and Buses(瞎搞),
題目地址:http://codeforces.com/contest/459/problem/C
C. Pashmak and Busestime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard output
Recently Pashmak has been employed in a transportation company. The company has k buses and has a contract with a school which has n students. The school planned to take the students to d different places for d days (each day in one place). Each day the company provides all the buses for the trip. Pashmak has to arrange the students in the buses. He wants to arrange the students in a way that no two students become close friends. In his ridiculous idea, two students will become close friends if and only if they are in the same buses for all d days.
Please help Pashmak with his weird idea. Assume that each bus has an unlimited capacity.
Input
The first line of input contains three space-separated integers n, k, d (1 ≤ n, d ≤ 1000; 1 ≤ k ≤ 109).
Output
If there is no valid arrangement just print -1. Otherwise print d lines, in each of them print n integers. The j-th integer of the i-th line shows which bus the j-th student has to take on the i-th day. You can assume that the buses are numbered from 1 to k.
Sample test(s)input
3 2 2
output
1 1 2 1 2 1
input
3 2 1
output
-1
Note
Note that two students become close friends only if they share a bus each day. But the bus they share can differ from day to day.
這題就是求一全排列。因為要求每一天的都不相同,所以最多是k^d種。如果要輸出的話,最簡單的方法就是進行全排列唄。。。。要注意。。如果用的跟我的求全排列方法一樣的話,那需要注意中間的cnt值是會很大的,但是由於最多隻需要輸出n種,所以如果大於n的話就直接讓他等於n+1。
代碼如下:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64LL mp[3100][3100];int main(){ LL n, k, d, i, j, cnt, h, flag=0, x, y; scanf("%I64d%I64d%I64d",&n,&k,&d); memset(mp,0,sizeof(mp)); cnt=1; for(i=1;i<=d;i++) { for(j=1;j<=n;j++) { if((j-1)%cnt==0) { mp[i][j]=mp[i][j-1]+1; if(mp[i][j]>k) { mp[i][j]=1; if(i==d) { flag=1; break; } } } else mp[i][j]=mp[i][j-1]; } if(j!=n+1) break; cnt*=k; if(cnt>1000) cnt=1001; } if(flag) { printf("-1\n"); } else { for(i=d;i>=1;i--) { for(j=1;j<=n;j++) { printf("%I64d ",mp[i][j]); } printf("\n"); } } return 0;}
codeforces問題: codeforces比賽怎攻擊別人?
對某一題,首先你自己要先過TEST。然後回到比賽的PROBLEM列表,把這題後面的鎖鎖上(鎖上了就不能再提交了,所以沒把握就別鎖了),然後到ROOM裡面,你就可以看別人代碼了,下面有HACK按鈕,點一下,輸入你覺得他錯的範例。
codeforces上怎看測試資料
進入比賽,點MY SUBMISSIONS,然後再點#號下面的運行編號,就可以看到測試資料了