为减轻服务器负担,将一个进程分为两个进程,每个服务器上原来有四个进程,分完后每个服务器有八个进程,分的过程中每个服务器最多有九个进程
做法:先把每个服务器的四个小进程放到同一个数组,循环遍历所有服务器,遍历到每个服务器时就将其中一个服务器分成两个,如果不符合分解条件就先不分,分下一个,一直循环到所有服务器原来的四个小进程都分完
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 using namespace std; 5 struct node 6 { 7 int b, c, i; 8 node(int x = 0, int y = 0, int z = 0) 9 { 10 b = x; 11 c = y; 12 i = z; 13 } 14 }; 15 vector<node>a[30010]; 16 int n; 17 char vis[30010]; 18 int main() 19 { 20 while (scanf("%d", &n) == 1) 21 { 22 memset(vis, 4, sizeof(vis)); 23 int i, tmp, tmp1, tmp2, j,num; 24 for (i = 0; i <= n; i++) 25 a[i].clear(); 26 n *= 4; 27 num = n; 28 for (i = 1; i <= n; i++) 29 { 30 scanf("%d%d%d", &tmp, &tmp1, &tmp2); 31 a[tmp].push_back(node(tmp1, tmp2, i)); 32 } 33 n /= 4; 34 puts("YES"); 35 int work = 1; 36 while (work) 37 { 38 work = 0; 39 for (j = 1; j <= n; j++) 40 { 41 if (!a[j].empty()) 42 for (vector<node>::iterator k = a[j].begin(); k != a[j].end(); k++) 43 { 44 --vis[j]; 45 ++vis[k->b]; 46 ++vis[k->c]; 47 work = 1; 48 if (vis[k->b] < 10 && vis[k->c] < 10) 49 { 50 printf("%d", k->i); 51 num--; 52 if (num) printf(" "); 53 a[j].erase(k); 54 break; 55 } 56 else 57 { 58 ++vis[j]; 59 --vis[k->b]; 60 --vis[k->c]; 61 } 62 } 63 } 64 } 65 puts(""); 66 } 67 return 0; 68 }
CodeForces 566B Replicating Processes
原文:http://www.cnblogs.com/cdyboke/p/4868020.html