code jam 2014

第一题 magictrick 很简单,用16次循环搞定

第二题 cookies 什么玩意儿的  也比较简单

判断个不等式就行

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
FILE* in = fopen(argv[1], “r+”);
FILE* out = fopen(“out”, “w+”);
int T;
fscanf(in, “%d”, &T);
for(int t = 1; t <= T; t++)
{
double C, F, X;
fscanf(in, “%lf%lf%lf”, &C, &F, &X);
double k = (double)X/C – 2.0/F – 1.0;
if(k < 0.0)
k = 0.0;
int times = ceil(k);
double re = 0.0;
for(int i = 0; i < times; i++)
{
re += (double)C/(2+i*F);
}
re += (double)X/(2+times*F);
fprintf(out, “Case #%d: %.7lf\n”, t, re);
}
}

第三题 Minesweeper 

这个题提交了三次都没对。想法是把所有不是雷的点集中在左下角,写成两个矩形相交的样子。

比如13 = 3 + 2 *5

可以弄成

。。。

。。。。。

。。。。。

这种。 

不知道问题出在哪儿, 求大神指教。

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
ifstream in(argv[1]);
ofstream out(“out”);
int testcase;
in >> testcase;
int t = 1;
while(1)
{
start:
if(t > testcase)
break;
int R, C, M;
in >> R >> C >> M;
int left = R * C – M;
string output(C, ‘*’);
out << “Case #” << t << “:”  << endl; 
if(left == 1)
{
for(int i = 1; i < R; i++)
out << output << endl;
output.replace(0, 1, 1, ‘c’);
out << output << endl;
t++;
goto start;
}
if(R == 1 && C == 1)
{
out << “c” << endl;
t++;
goto start;
}
if(R == 1)
{
out << string(M, ‘*’) << string(left-1, ‘.’) << ‘c’ << endl;
t++;
goto start;
}
if(C == 1)
{
out << ‘c’ << endl;
for(int i = 0; i < left – 1; i++)
out << ‘.’ << endl;
for(int i = 0; i < M; i++)
out << ‘*’ << endl;
t++;
goto start;
}
for(int m = 2; m <= R; m++)
{
for(int x = 2; x <= C; x++)
{
if(m * x > left)
break;
if(m * x == left)
{
for(int i = 0; i < R-m; i++)
out << output << endl;
output.replace(0, x, x, ‘.’);
for(int i = 0; i < m-1; i++)
{
out << output << endl;
}
output.replace(0, 1, 1, ‘c’);
out << output << endl;
t++;
goto start;
}
for(int n = 2; n <= m; n++)
{
for(int y = 1; x + y <= C; y++)
{
if(n * y > left – m * x)
break;
if(n * y == left – m * x)
{
for(int i = 0; i < R – m; i++)
out << output << endl;
output.replace(0, x, x, ‘.’);
for(int i = 0; i < m – n; i++)
out << output << endl;
output.replace(x, y, y, ‘.’);
for(int i = 0; i < n-1; i++)
out << output << endl;
output.replace(0, 1, 1, ‘c’);
out << output << endl;
t++;
goto start;
}
}
}
}
}
out << “Impossible” << endl;
t++;
}
}

第四题 Deceitiful War.

这题也算比较简单,不过读题很费劲。 ken的策略就是从手中还剩的所有block中找出比Naomi选择的大的最小的那个,如果没有,就拿现有最小的。

Naomi deceitful的策略就是,从左到右选手里的block,如果ken手里没有比她选出来的更小的,就谎称这个block比ken的最大的稍小,骗ken用掉最大的块;如果有,就报比ken的最大的还大,那么ken就会选择最小的。

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{
ifstream is(argv[1]);
ofstream os(“out”);
int T;
is >> T;
vector<double> naomi;
vector<double> ken;
int N;
for(int t = 1; t <= T; t++)
{
naomi.clear();
ken.clear();
is >> N;
naomi.resize(N);
ken.resize(N);
for(int i = 0; i < N; i++)
is >> naomi[i];
for(int i = 0; i < N; i++)
is >> ken[i];
sort(naomi.begin(), naomi.end());
sort(ken.begin(), ken.end());
int deceit = 0;
int nondeceit = 0;
int b = 0;
int e = N – 1;
for(int i = 0; i < N; i++)
{
if(naomi[i] < ken[b])
{
e–;
}
else
{
deceit++;
b++;
}
}
b = 0;
e = N – 1;
for(int i = 0; i < N; i++)
{
if(ken[i] > naomi[b])
{
b++;
}
else
{
nondeceit++;
e–;
}
}
os << “Case #” << t << “: ” << deceit << ” ” << nondeceit << endl;
}
}

点赞