http://acm.hdu.edu.cn/showproblem.php?pid=4671php
5 3
2 4 3 1 5 1 5 4 2 3 3 5 2 4 1HintIn the sample test case, the active copies of these databases are on server 2,1 and 3 in normal state. A = {1,1,1,0,0} If server 1 or 3 has broken, server 5 will take its work. In case we lost server 2, the second database will use server 4 instead. A = {1,BROKEN,1,1,0} It's clear that in any case this system is load-balanced according to the plan in sample output.
/** hdu4671 思惟構造 題目大意:有n臺server和m個數據庫,咱們要用server執行數據庫,對於每個數據庫被執行server的優先級爲1~n的一個排列。每個數據庫僅僅執行一次, 問如何定義m個數據庫的優先級,若是有一臺server壞了的狀況下仍然知足每臺server的執行數據庫的數量差不能大於1 解題思路:這個題是一個考驗思惟的題。固然答案有很是多。我僅僅要肯定每個數據庫優先級最高和次高的就可以了。咱們分兩種狀況來討論: 1.n>=m 在這樣的狀況下1~m第一優先級的爲1~m,第二優先級的爲餘下的隨意(若n==m,則所有隨意。要保證第一第二不能是一個數) 2.n<m 在這樣的狀況下1~m爲1~n。再1~n。知道循環夠m。第二優先級,咱們對於第一優先級同樣的放在一塊考慮,從n~1循環(和第一反覆就跳過)。 爲何這樣呢?因爲若是i壞了,那麼第二優先級添加的仍是各一個,仍保證是對的。注意要n~1循環,因爲第m不必定是n的倍數。因此有i~n 可能會在第一優先級裏少排一個,咱們在第二優先級裏要優先考慮,不然會出現有一個壞了的話差大於1的狀況 */ #include <string.h> #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int n,m,a[105][2],flag[105]; int main() { while(~scanf("%d%d",&n,&m)) { if(n>=m) { for(int i=1;i<=m;i++) { a[i][0]=i; if(a[i][0]==n) a[i][1]=1; else a[i][1]=n; } } else { for(int i=1;i<=m;i++) { a[i][0]=(i%n==0)?ios
n:i%n; } for(int i=1;i<=n;i++) { int k=n; for(int j=1;j<=m;j++) { if(a[j][0]==i) { k=(k%n==0)?數據庫
n:k%n; if(k==i)k--; k=(k%n==0)?ide
n:k%n; a[j][1]=k--; // printf("??%d:%d\n",a[j][0],a[j][1]); } } } } for(int i=1;i<=m;i++) { //printf(">>%d %d\n",a[i][0],a[i][1]); } for(int i=1;i<=m;i++) { memset(flag,0,sizeof(flag)); printf("%d %d",a[i][0],a[i][1]); flag[a[i][0]]=flag[a[i][1]]=1; for(int j=1;j<=n;j++) { while(flag[j])j++; if(j>n)break; printf(" %d",j); flag[j]=1; } printf("\n"); } } return 0; } /** 3 14 answer: 1 3 2 2 3 1 3 2 1 1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 3 2 1 1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 */post