Harbinger vs Sciencepal

Harbinger vs Sciencepal 

题意:给你n对人, 每一对都有2个人,每个人分别有一个值, 现在将每队人拆开塞入2组,要求分完这n对人之后,2个组的差值最小。

题解:将每队人的差值算出来,并且对于差值求和 tot, 然后这个题目就变成了给你n个数, 分成2组, 求差值最小的题目, 对差值进行跑背包操作就好了。

         这份代码用bitset完成的, 因为在练习这个东西。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
 4 #define LL long long
 5 #define ULL unsigned LL
 6 #define fi first
 7 #define se second
 8 #define pb push_back
 9 #define lson l,m,rt<<1
10 #define rson m+1,r,rt<<1|1
11 #define max3(a,b,c) max(a,max(b,c))
12 #define min3(a,b,c) min(a,min(b,c))
13 typedef pair<int,int> pll;
14 const int INF = 0x3f3f3f3f;
15 const LL mod = 1e9+7;
16 const int N = 200*250+10;
17 bitset<N> b;
18 int a[N];
19 int main(){
20     ///Fopen;
21     int T;
22     scanf("%d", &T);
23     while(T--){
24         b.reset();
25         b[0] = 1;
26         int n, v, u, tot = 0;
27         scanf("%d", &n);
28         for(int i = 1; i <= n; i++){
29             scanf("%d%d", &u, &v);
30             a[i] = abs(u-v);
31             tot += a[i];
32         }
33         for(int i = 1; i <= n; i++){
34             b |= (b << a[i]);
35         }
36         int l = 0;
37         for(int i = tot/2; i >= 0; i--){
38             if(b[i]){
39                 l = i;
40                 break;
41             }
42         }
43         int ans = tot - 2*l;
44         printf("%d\n", ans);
45     }
46     return 0;
47 }
View Code

 

posted @ 2018-04-24 16:54  Schenker  阅读(185)  评论(0编辑  收藏  举报