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 <sstream> #include <string> #include <vector> #include <set> #include <map> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> #include <math.h> #include <string.h> #include <stdlib.h> using namespace std; #define REP(i, n) for(int i = 0; i<(n); i++) #define abs(a) ((a) >= 0 ? (a) : -(a)) #define inf 999999999 typedef vector<int> VI; typedef vector<string> VS; typedef long long i64; typedef unsigned long long u64; int n, sum, len; int d[65]; int l[65]; int vis[65]; int compare( const void* a, const void* b ) { int* arg1 = (int*) a; int* arg2 = (int*) b; return *arg1 - *arg2; } bool judge(int count, int left, int m) { // printf("11count = %d, left = %d, len = %d\n", count, left, len); if (count == 1 && left == 0) return true; if (left == 0) { m = n; left = len; count--; } for (int i = m-1; i >= 0; i--) { if (left > l[i]) return false; if (!vis[i] && d[i] <= left) { vis[i] = 1; if (judge(count, left - d[i], i)) return true; vis[i] = 0; } } // printf("22count = %d, left = %d, len = %d\n", count, left, len); return false; } void go() { l[0] = d[0]; for (int i = 1; i < n; i++) l[i] = l[i-1] + d[i]; for (len = d[n-1]; len <= sum; len++) { if (sum % len == 0) { int count = sum/len; memset(vis, 0, sizeof(vis)); if (judge(count, len, n) == true) { printf("%d\n", len); break; } } } } int main(void) { while(cin>>n) { if (n == 0) break; memset(d, 0, sizeof(d)); memset(l, 0, sizeof(l)); sum = 0; for (int i = 0; i < n; i++) { cin>>d[i]; sum+=d[i]; } qsort(d, n, sizeof(int), compare); go(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator