Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
多亏讨论区,又学了一招一直想用最大流做,好像不行的说! #include <iostream> #include <stdio.h> using namespace std; int r[25]; int d[25]; bool keyi(int); bool isInit; int from[74] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 1,2,3,4,5,6,7, 0,24}; int to[74] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23, 24,0}; int weight[74] = {0}; int main() { int cases; scanf("%d", &cases); for(int ii = 0; ii < cases; ii++){ //each case isInit = false; for(int i = 0; i < 24; i++) scanf("%d", &r[i]); for(int i = 0; i < 24; i++) d[i] = 0; int numD; scanf("%d", &numD); for(int i = 0; i < numD; i++){ int temp; scanf("%d", &temp); d[temp] ++; } bool yj = true; for(int i = 0; i < 24; i++){ int sum = 0; for(int j = 0; j < 8; j++){ sum += d[(i+j)%24]; } if(sum < r[(i+7)%24]){ yj = false; break; } } if(!yj){ printf("No Solution\n"); continue; } int rsum = 0; for(int i = 0; i < 24; i++) rsum += r[i]; int minAns = (rsum-1)/8+1, maxAns = numD; //minAns不一定行,maxAns肯定可以 while(maxAns > minAns){ //cout << maxAns << endl; int midAns = (minAns+maxAns)/2; if(keyi(midAns)){ maxAns = midAns; } else{ minAns = midAns+1; } } printf("%d\n", maxAns); } return 0; } void initB(){ isInit = true; for(int i = 24; i < 48; i++) weight[i] = d[i-24]; for(int i = 48; i < 65; i++) weight[i] = -r[i-41]; } bool keyi(int ans){ int del[25]; del[0] = 0; for(int i = 1; i <= 24; i++){ del[i] = 10000000; } if(!isInit){ initB(); } for(int i = 65; i < 72; i++) weight[i] = ans - r[i-65]; weight[72] = ans; weight[73] = -ans; for(int i = 0; i < 24; i++){ for(int j = 0; j < 74; j++){ if(del[to[j]] > del[from[j]] + weight[j]){ del[to[j]] = del[from[j]] + weight[j]; } } } for(int j = 0; j < 74; j++){ if(del[to[j]] > del[from[j]] + weight[j]) return 0; } return 1; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator