250p: 直接暴力搜出所有情况。。。
500p:
题意:
有n支队伍进行积分制联赛,每两支队伍可以相互比赛任意次(包括0次),赢得队伍得w分,输的不得分,平局各得d分,现在给你一个积分榜,问最小需要多少场次能达到这个积分榜,如果不能达到,返回-1。
解题思路:
对于一个积分f,有w x + d y = f,根据扩展欧几里得,对于所有的积分都能求出最小的x,因为y = (y0*f/gcd - d/gcd *t),对y排个序,y0, y1, y2, y3..., ,所有的y的和如果是奇数,方案肯定不可行,如果是偶数,要确保最大的数不大于其他所有数的和。
250p:
/* ********************************************** Author : JayYe Created Time: 2013-8-13 9:15:42 File Name : final.cpp *********************************************** */ #include <cstdio> #include <cstring> #include <cctype> #include <cstdlib> #include <cmath> #include <ctime> #include <iostream> #include <map> #include <set> #include <list> #include <sstream> #include <queue> #include <deque> #include <stack> #include <vector> #include <bitset> #include <algorithm> using namespace std; //typedef __int64 LL; typedef long long LL; class TheBasketballDivOne { public: int find(int n, int m) ; }; int ans, vis[11], a[11]; bool mp[111111]; void dfs(int x, int y, int m, int n) { int i; if(x == n) { for(i = 1;i <= n; i++) a[i] = vis[i]; sort(a+1, a+n+1); if(a[n] == m) { int sum = 0; for(i = 1;i <= n; i++) sum = sum*10+a[i]; if(!mp[sum]) { mp[sum] = 1;ans++; } } return ; } if(y > n) { dfs(x+1, x+2, m, n); return ; } vis[x] += 2; dfs(x, y+1, m, n); vis[x] --; vis[y] ++; dfs(x, y+1, m, n); vis[x] --; vis[y] ++; dfs(x, y+1, m, n); vis[y] -= 2; } int TheBasketballDivOne::find(int n, int m) { ans = 0; memset(vis, 0, sizeof(vis)); memset(mp, 0, sizeof(mp)); dfs(1, 2, m, n); return ans; } // Powered by FileEdit // Powered by TZTester 1.01 [25-Feb-2003] // Powered by CodeProcessor
/* ********************************************** Author : JayYe Created Time: 2013-8-13 15:22:44 File Name : final.cpp *********************************************** */ #include <cstdio> #include <cstring> #include <cctype> #include <cstdlib> #include <cmath> #include <ctime> #include <iostream> #include <map> #include <set> #include <list> #include <sstream> #include <queue> #include <deque> #include <stack> #include <vector> #include <bitset> #include <algorithm> using namespace std; class TheTournamentDivOne { public: int find(vector <int> points, int w, int d) ; }; int exgcd(int a, int b, int &x ,int &y) { if(b == 0) { x = 1; y = 0; return a; } int ans = exgcd(b, a%b, y, x); y -= a/b*x; return ans; } int a[111111]; struct PP { int val; PP() {} PP(int val) : val(val) {} bool operator < (const PP &a) const { return val < a.val; } }cur; priority_queue<PP> q; int TheTournamentDivOne::find(vector <int> ps, int w, int d) { while(!q.empty()) q.pop(); int x, y, i; int g = exgcd(w, d, x, y); int extr = 0; int sum = 0; for(i = 0;i < ps.size(); i++) { if(ps[i]%g != 0) return -1; int xx = x*ps[i]/g; xx = (xx%(d/g) + d/g)%(d/g); int yy = (ps[i] - w*xx)/d; if(yy < 0) return -1; sum += yy; extr += xx; cur = PP(yy); q.push( cur ); // printf("%d %d %d\n", ps[i], xx, yy); } int ret = -1; // printf("sum = %d extr = %d\n", sum, extr); while(!q.empty()) { cur = q.top(); q.pop(); // printf("cur = %d\n", cur); int val = cur.val; if(sum %2 ==0 && val <= sum/2) { if(ret == -1) ret = sum/2 + extr; else if(ret > sum/2+extr) ret = sum/2 + extr; } if(val >= w/g) { cur.val = val - w/g; extr += d/g; sum -= w/g; q.push(cur); } else break; } return ret; } // Powered by FileEdit // Powered by TZTester 1.01 [25-Feb-2003] // Powered by CodeProcessor