ZOJ3870 Team Formation

 1 /**
 2 Author: Oliver
 3 ProblemId: ZOJ3870 Team Formation
 4 */
 5 /*
 6 思路
 7 1.异或运算,使用^会爆,想到二进制;
 8 2.我们可以试着从前往后模拟一位一位的^那么只要当前位结果变大便是;
 9 3.一般我们如何利用二进制呢?既然要爆那我们就存1的位置;
10 4.问题是怎么存,如何用?
11 5.我之前想的是每个数的每位1都存,但是那样造成的重复计算还没想出怎么避免。看了一下别人的博客,再尝试把每位数的最高位1存起来。
12 6.想想为什么是存最高位呢;
13 7.那好,现在是不是把所有的高1都存好了,然后我们up(1,n)把原本要和剩余数做异或的步骤变为和bin[]运算。
14 我们要的是变得比max{A,B}大。那么先看变大,那就要找大一点的那个数,这个时候我们不是和数比较,而是和剩余数的最高位比较。
15 注意我们要能想到,是以暴力的方法推移过去,做的优化,也就是说每次只要加上可以和这个队伍完成的数目就好了。
16 注意这样不会有重复(类似A and B,B and A),不会这样。因为有没有发现,每次都是一遍历的这个数为max{A,B}。
17 注意我们是一位一位往后移,直到吧0->1。
18 步骤 可以不写吗?思路很详细了吧。
19 *
20 #include <cstdio>
21 #include <cstring>
22 #include <algorithm>
23
24 using namespace std;
25
26 const int MAXM = 100000+10;
27 int bin[100];
28 int a[MAXM];
29 int main()
30 {
31 int T,n;
32 scanf("%d",&T);
33 while(T--)
34 {
35 memset(bin,0,sizeof bin);
36 scanf("%d",&n);
37 int X;
38 for(int i=0;i<n;i++)
39 {
40 scanf("%d",&a[i]);
41 X=a[i];
42 for(int j=31;j>=0;j--)//这里若从32开始,你试试会发生什么事
43 if(X&(1<<j)){//提取最高位
44 bin[j]++;
45 break;
46 }
47 }
48 long long ans=0;
49 int j;
50 for(int i=0;i<n;i++)
51 {
52 X=a[i];
53 for(j=31;j>=0;j--)
54 if(X&(1<<j))break;
55 for(;j>=0;j--)//bin[]运算
56 if(!(X&(1<<j))){
57 ans+=bin[j];
58 }
59 }
60
61 printf("%lld\n",ans);
62 }
63 }

2015-04-29  22:30:05

时间: 2024-10-10 02:43:58

ZOJ3870 Team Formation的相关文章

位运算 ZOJ 3870 Team Formation

题目传送门 1 /* 2 题意:找出符合 A^B > max (A, B) 的组数: 3 位运算:异或的性质,1^1=0, 1^0=1, 0^1=1, 0^0=0:与的性质:1^1=1, 1^0=0, 0^1=0, 0^0=0: 4 假设A < B,一定要满足B的最高位对应A的值是0,这样才可能>B(即0^1=1): 5 然后比赛时假设A的极限是类似0111111的情况,最后假设有误: 6 题解是先把每个数最高位(1)的位置统计个数,1<<4 的意思是 000010000:

Team Formation 浙江省赛 (异或)

Team Formation 题意:在n个队伍种选择两个队伍,使 满足 (i.e. A ⊕ B > max{A, B}).   n<1e5   时间:2s 分析: 首先对每个队员的the skill level 做处理,用二进制表示时记录1出现的位置,用数组bit[]保存: 遍历元素,在二进制中出现0的位置时,bit数组中此处为1的二进制就可以存进来,计算所有和即可. # include<iostream> #include<cstdio> #include<cs

ZOJ 3870 Team Formation(位运算)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5518 For an upcoming programming contest, Edward, the headmaster of Marjar University, is forming a two-man team from N students of his university. Edward knows the skill level of each s

HackerRank - &quot;Team Formation&quot;

Pretty classic greedy problem to work on. Here is how to approach it: 1. "the smallest team is as large as possible." actually means, team members should be distributed as average as possible 2. When you are to put member with skill-level 'x', y

[虚拟机OA]Team Formation 2 团队构成

FC Codelona is trying to assemble a team from a roster of available players. They have a minimum number of players they want to sign and each player needs to have a skill rating within a certain range. Given a list of players' skill levels with desir

ZOJ 3870 Team Formation

题目链接: http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3870 题解: 如果x xor y>max(x,y),那么就会有x和y的最高位不同(二进制表示),并且对于最高位小的那个数的最高位的位置,最高位大的那个数在相同的位置应为0. 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespac

Team Formation

1 #include<bits/stdc++.h> 2 3 const int Maxn = 1000005; 4 5 #define ll long long 6 using namespace std; 7 int x[Maxn], pos[33]; 8 int main() { 9 int T, N; 10 cin >> T; 11 while (T--) { 12 scanf("%d", &N); 13 for (int i = 0; i <

ZOJ 3933 Team Formation

费用流裸体......比赛的时候少写了一句话....导致增加了很多无用的边一直在TLE #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; const int maxn=500+10; int n; int belong[maxn]; in

浙江省 2015 省赛 B Team Formation

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #include <deque