codejam_2014_qualification
来源:互联网 发布:企业快报网络报送系统 编辑:程序博客网 时间:2024/05/02 01:17
Problem A. Magic Trick
#include <iostream>#include <algorithm>#include <vector>using namespace std;void read(vector<int> &vec) { int card; for (int i = 0; i < 16; ++i) { cin >> card; vec.push_back(card); } return;}int main() { int T, row1, row2, card; cin >> T; for (int c = 1; T--; c++) { vector<int> arrange1, arrange2; cin >> row1; read(arrange1); cin >> row2; read(arrange2); int cnt = 0; auto iter1 = arrange2.begin() + (row2 - 1) * 4, iter2 = iter1 + 4; for (int i = 0; i < 4; ++i) { if (find(iter1, iter2, arrange1[(row1 - 1) * 4 + i]) != iter2) { ++cnt; card = arrange1[(row1 - 1) * 4 + i]; } } if (cnt == 1) cout << "Case #" << c << ": " << card << endl; else if (cnt > 1) cout << "Case #" << c << ": " << "Bad magician!" << endl; else cout << "Case #" << c << ": " << "Volunteer cheated!" << endl; } return 0;}
Problem B. Cookie Clicker Alpha
迭代,每次够C的时候进行判断,是买新fram达到X速度快还是不买速度快,如果某次判断不买farm则以后也不需要买。
#include <stdio.h>int main() { double c, f, x; int T; scanf("%d", &T); for (int cnt = 1; T--; ++cnt) { scanf("%lf %lf %lf", &c, &f, &x); double spd = 2, time_sum = 0, time_y, time_n; while (x > c) { time_sum += c / spd; time_y = x / (spd + f); time_n = (x - c) / spd; if (time_y <= time_n) { spd += f; } else { x -= c; break; } } time_sum += x / spd; printf("Case #%d: %0.7lf\n", cnt, time_sum); } return 0;}
Problem D. Deceitful War
主要是看明白体意,模拟两种游戏策略即可。
在实现的时候用set比较浪费,因为给每种策略的函数传参数时候都要传值,因为函数中会对set进行修改,比较好的方法是用vector,然后排序或者用数组来记录烧掉的blocks,这样可以传引用。
另外还要注意,由于set的底层是红黑树,非线性结构,因此iterator没有operator-(不能像vector等进行iterator的+ - 操作),但是有++和--。
#include <stdio.h>#include <set>using namespace std;int Deceitful(set<double> naomi, set<double> ken, int n) { int ds = 0; while (n--) { auto iter_n1 = naomi.begin(); auto iter_k1 = ken.begin(), iter_k2 = ken.end(); if (*iter_n1 > *iter_k1) { ++ds; naomi.erase(iter_n1), ken.erase(iter_k1); } else { naomi.erase(iter_n1), ken.erase(--ken.end()); } } return ds;}int War(set<double> naomi, set<double> ken, int n) { int ws = 0; // 1:min 2:max while (n--) { auto iter_n1 = naomi.begin(); auto iter_k1 = ken.begin(), iter_k2 = ken.end(); for ( ; iter_k1 != iter_k2 && *iter_n1 > *iter_k1; ++iter_k1) {} if (iter_k1 == iter_k2) { // cannot use naomi.end() - 1, set is no operator - ken.erase(ken.begin()), naomi.erase(--(naomi.end())); ++ws; } else { ken.erase(iter_k1), naomi.erase(iter_n1); } } return ws;}void Read(set<double> &st, int n) { double block; for (int i = 0; i < n; ++i) { scanf("%lf", &block); st.insert(block); } return;}int main() { int T, N; scanf("%d", &T); for (int c = 1; T--; ++c) { set<double> naomi, ken; scanf("%d", &N); Read(naomi, N), Read(ken, N); // must pass value, too cost! use vector is more better. int ds = Deceitful(naomi, ken, N); int ws = War(naomi, ken, N); printf ("Case #%d: %d %d\n", c, ds, ws); } return 0;}
0 0