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 <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <queue> #include <cmath> #include <stack> #include <map> #define ll long long #define ull unsigned long long #define db double #define int ll #define vi vector<int> #define vii vector<vi > #define pii pair<int, int> #define pb push_back #define mkp make_pair using namespace std; bool cmp(pii a, pii b) { return a.first == b.first ? a.second < b.second : a.first < b.first; } int mn, tot; void update(int sum, int cnt) {//更新答案 sum = sum<0?-sum:sum; if (sum < mn || (sum == mn && cnt < tot)) { mn = sum; tot = cnt; } } signed main() { #ifdef _DEBUG freopen("out", "w", stdout); #endif ios::sync_with_stdio(false); cin.tie(0); while (1) { mn = tot = 9e18; int n; cin >> n; if (!n) break; vi a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } map<int, int> mp;//用map去重 int m = n/2;//折半枚举 for (int i = 1; i < 1<<m; i++) { int cnt = 0, sum = 0; for (int j = 0; j < m; j++) { if (i >> j & 1) { cnt++; sum += a[j]; } } if (!mp.count(sum)) mp[sum] = cnt; else mp[sum] = min(mp[sum], cnt); update(sum, cnt); } vector<pii >b; for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) { b.pb(*it); } for (int i = 1; i < 1<<(n-m); i++) { int cnt = 0, sum = 0; for (int j = 0; j < (n-m); j++) { if (i >> j & 1) { cnt++; sum += a[m+j]; } } update(sum, cnt); int t = lower_bound(b.begin(), b.end(), mkp(-sum, 0), cmp) - b.begin() - 1;//查找绝对值差值最小的 if (t >= 0 && t < b.size()) { update(sum + b[t].first, cnt + b[t].second); } t++;//找两个,一个靠左的,一个靠右的 if (t >= 0 && t < b.size()) { update(sum + b[t].first, cnt + b[t].second); } } cout << mn << ' ' << tot << '\n'; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator