Google Code Jam 2014 Qualification 题解
拿下 ABD, 顺利晋级, 预赛的时候C没有仔细想,推荐C题,一个非常不错的构造题目!
A Magic Trick 简单的题目来取得集合的交并
1: #include <iostream>
2: #include <algorithm>
3: #include <set>
4: #include <vector>
5: using namespace std;
6: int main()
7: {
8: freopen("A-small-attempt0.in","r",stdin);
9: freopen("A-small-attempt0.out","w",stdout);
10: int T;
11: cin>>T;
12: for(int t=1; t<=T; t++)
13: {
14: int x,y;
15: cin>>x;
16: int m[4][4];
17: set<int> X;
18: for(int i=0; i<4; i++)
19: {
20: for(int j=0; j<4; j++)
21: {
22: cin>>m[i][j];
23: if(i+1 == x) X.insert(m[i][j]);
24: }
25: }
26: cin>>y;
27: set<int> Y;
28: for(int i=0; i<4; i++)
29: {
30: for(int j=0; j<4; j++)
31: {
32: cin>>m[i][j];
33: if(i+1 == y) Y.insert(m[i][j]);
34: }
35: }
36: vector<int> ret(X.size() + Y.size());
37: auto itr = set_intersection(X.begin(),X.end(), Y.begin(),Y.end(), ret.begin());
38: ret.resize(itr - ret.begin());
39: cout<<"Case #"<<t<<": ";
40: if(ret.size() == 1)
41: cout<<ret[0]<<endl;
42: else if(ret.size() > 1)
43: {
44: cout<<"Bad magician!"<<endl;
45: } else cout<<"Volunteer cheated!"<<endl;
46: }
47: }
B Cookie Clicker Alpha 核心观察可以通过简单的推导获得一个upper bound,然后枚举到这个upper bound就OK。
1: #include <iostream>
2: #include <cmath>
3: using namespace std;
4:
5: int main()
6: {
7: freopen("B-large.in","r",stdin);
8: freopen("B-large.out","w",stdout);
9: int T;
10: cin>>T;
11: for(int t = 1; t<= T; t++)
12: {
13: double C,F,X;
14: cin>>C>>F>>X;
15:
16: double ret = X/2.0;
17: int up = max( (F*X - 2*C)/(F*C), 0.0);
18: //cout<<up<<endl;
19: double Nec = 0.0f;
20: for(int k = 0; k< up; k++)
21: {
22: Nec += C/(2+k*F);
23: ret = min(ret, Nec + X/(2+(k+1)*F));
24: }
25: printf("Case #%d: %.7f\n", t, ret);
26: //cout<<"Case #"<<t<<": "<<ret<<endl;
27: }
28: }
C Minesweeper Master 这是一个构造的题目,非常非常的不错!核心观察在于扫雷的机制在边界的时候需要是2*n的这样一个结构才可能保证顺利完成边界情况。
1: #include <iostream>
2:
3: using namespace std;
4:
5: char Map[55][55];
6: int main()
7: {
8: freopen("C-large-practice.in","r",stdin);
9: freopen("C-large-practice.out","w",stdout);
10: int T; cin>>T;
11:
12: for(int t= 1; t<=T; t++)
13: {
14: bool possible = false;
15: int R,C,M;
16: cin>>R>>C>>M;
17: for(int i=0; i<R; i++)
18: {
19: for(int j=0; j<C; j++)
20: {
21: Map[i][j] = '*';
22: }
23: }
24: if(R == 1 || C == 1 || R*C == M+1)
25: {
26: possible = true;
27: Map[0][0] = 'c';
28: int num = R*C - M-1;
29: for(int i=0; i<R; i++)
30: {
31: for(int j=0; j<C; j++)
32: {
33: if(i==0 && j==0) continue;
34: else if(num >0)
35: {
36: Map[i][j] = '.';
37: num--;
38: }else Map[i][j] = '*';
39: }
40: }
41: }else
42: {
43: for(int r = 2; r<=R; r++)
44: {
45: for(int c = 2; c<=C; c++)
46: {
47: int mineleft = M - (R*C - r*c);
48: if( mineleft <= (r-2)*(c-2) && mineleft >=0)
49: {
50: possible = true;
51: for(int i=0; i<R; i++) for(int j=0; j<C; j++)Map[i][j] = '*';
52: Map[0][0]= 'c';
53: for(int i=0; i<2; i++) for(int j=0; j<c; j++)
54: {
55: if(i ==0 && j==0) continue;
56: Map[i][j] = '.';
57: }
58: for(int i=2; i<r; i++) for(int j=0; j<2; j++) Map[i][j] = '.';
59: mineleft = (r-2)*(c-2) - mineleft;
60: for(int i= 2; i<r; i++) for(int j=2; j<c; j++)
61: {
62: if(mineleft > 0)
63: {
64: mineleft --;
65: Map[i][j] = '.';
66: } else Map[i][j] = '*';
67:
68: }
69: }
70:
71: }
72: }
73:
74: }
75: cout<<"Case #"<<t<<":"<<endl;
76: if(possible)
77: {
78: for(int i=0; i<R; i++)
79: {
80: for(int j=0; j<C; j++)
81: {
82: cout<<Map[i][j];
83: }
84: cout<<endl;
85: }
86: }
87: else
88: {
89: cout<<"Impossible"<<endl;
90: }
91: }
92: }
详细的分析参见:http://www.huangwenchao.com.cn/2014/04/gcj-2014-qual.html
D Deceitful War 类似于田忌赛马的问题,核心观察在于 每一个人的最优策略都是采用刚刚比你大的来进行比较。
1: #include <iostream>
2: #include <vector>
3: #include <algorithm>
4:
5: using namespace std;
6:
7: int main()
8: {
9: freopen("D-large.in","r",stdin);
10: freopen("D-large.out","w",stdout);
11: int T; cin>>T;
12: for(int t=1; t<= T; t++)
13: {
14: int N;
15: cin>>N;
16: vector<double> A(N);
17: vector<double> B(N);
18: for(int i=0; i<N; i++) cin>>A[i];
19: for(int i=0; i<N; i++) cin>>B[i];
20: sort(A.begin(), A.end());
21: sort(B.begin(), B.end());
22: int War = 0;
23: for(int i = A.size()-1, j= B.size()-1; i>=0 && j>= 0;)
24: {
25: if(B[j]>A[i])
26: {
27: War++;
28: i--;
29: j--;
30: } else if(B[j] <A[i])
31: {
32: i--;
33: }
34: }
35: //cout<<N - War<<endl;
36: int NOWar = 0;
37: for(int i = B.size()-1, j= A.size()-1; i>=0 && j>= 0;)
38: {
39: if(A[j]>B[i])
40: {
41: NOWar++;
42: i--;
43: j--;
44: } else if(A[j] <B[i])
45: {
46: i--;
47: }
48: }
49: //cout<<NOWar<<endl;
50: cout<<"Case #"<<t<<": "<<NOWar<<" "<<N-War<<endl;
51: }
52: return 0;
53: }
Google Code Jam 2014 Qualification 题解的更多相关文章
- Google Code Jam 2014 资格赛:Problem B. Cookie Clicker Alpha
Introduction Cookie Clicker is a Javascript game by Orteil, where players click on a picture of a gi ...
- Google Code Jam 2009 Qualification Round Problem C. Welcome to Code Jam
本题的 Large dataset 本人尚未解决. https://code.google.com/codejam/contest/90101/dashboard#s=p2 Problem So yo ...
- Google Code Jam 2014 Round 1 A:Problem C. Proper Shuffle
Problem A permutation of size N is a sequence of N numbers, each between 0 and N-1, where each numbe ...
- Google Code Jam 2014 资格赛:Problem D. Deceitful War
This problem is the hardest problem to understand in this round. If you are new to Code Jam, you sho ...
- Google Code Jam 2009 Qualification Round Problem B. Watersheds
https://code.google.com/codejam/contest/90101/dashboard#s=p1 Problem Geologists sometimes divide an ...
- Google Code Jam 2009 Qualification Round Problem A. Alien Language
https://code.google.com/codejam/contest/90101/dashboard#s=p0 Problem After years of study, scientist ...
- Google Code Jam 2014 Round 1 A:Problem A Charging Chaos
Problem Shota the farmer has a problem. He has just moved into his newly built farmhouse, but it tur ...
- Google Code Jam 2014 Round 1B Problem B
二进制数位DP,涉及到数字的按位与操作. 查看官方解题报告 #include <cstdio> #include <cstdlib> #include <cstring& ...
- Google Code Jam 2015 Round1A 题解
快一年没有做题了, 今天跟了一下 GCJ Round 1A的题目, 感觉难度偏简单了, 很快搞定了第一题, 第二题二分稍微考了一下, 还剩下一个多小时, 没仔细想第三题, 以为 前两个题目差不多可以晋 ...
随机推荐
- Navigation Bar上的返回按钮文本颜色,箭头颜色以及导航栏按钮的颜色
自从IOS7后UINavigationBar的一些属性的行为发生了变化.你可以在下图看到: 现在,如果你要修改它们的颜色,用下面的代码: self.navigationController.navig ...
- 汽车OBD2诊断程序开发 (原文转载,思路很清晰!)
1.因TL718已经为你建立了物理层.数据链层和部分应用层的协议,所以只要OBD2标准应用层协议文本,ISO15031-5 或 SAE J1979(这两个协议是相同的内容). 2.TL718诊断 ...
- ios代理设计模式
代理设计模式的作用: 1.A对象监听B对象的一些行为,A成为B的代理 2.B对象想告诉A对象一些事情,A成为B的代理 代理设计模式的总结: 如果你想监听别人的一些行为,那么 ...
- 深入理解计算机系统第二版习题解答CSAPP 2.17
假设w=4,我们能给每个可能的十六进制数字赋予一个数值,假设用一个无符号或者补码表示.完成下表: x 无符号(B2U(x)) 补码(B2T(x)) 十六进制 二进制 0xE 1110 14 -2 0x ...
- 关于Git里程碑
里程碑即Tag,是人为对提交进行的命名.这和Git的ID是否太长无关.使用任何数字版本号无论长短, 都没有使用一个直观的表意的字符串来的方便.例如:用里程碑名称"v2.1"对应软件 ...
- IP地址子网掩码、主机数、子网掩码及主机段的算法
http://wenku.baidu.com/view/2aa76cc6aa00b52acfc7ca6f.html很容易理解.
- [转]Spring数据库读写分离
数据库的读写分离简单的说是把对数据库的读和写操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力. 主(master)数据库提供写操作,从(slave)数据库提供读操作,其实在 ...
- 介绍map.entry接口
Map是java中的接口,Map.Entry是Map的一个内部接口.java.util.Map.Entry接口主要就是在遍历map的时候用到. Map提供了一些常用方法,如keySet().entry ...
- Socket知识总结
一.网络编程相关概念 1. 互联网通过ip定位电脑 2. 在电脑中通过port定位程序 3. 程序和程序之间通过协议定义通信数据格式 二.Socket相关概念 1. ip地址 1) 每台联网的电脑都有 ...
- linux process 相关命令
1.显示指定用户信息:ps -u root 2.显示所有进程信息,连同命令行:ps -ef 3. ps 与grep 常用组合用法,查找特定进程:ps -ef|grep ssh 4. 把所有进程显示出来 ...