hdu 3818模拟
刚开始看到这题的时候,理解错了数据范围,以为K<100,那就是道高精度水题了,于是用java打了交,runtime error!然后就想出了这么个模拟的方法,直接用一个数组存下fibonacci表示的数,两个数合并在一起以后,就是处理这个数组的问题了,其实也不难,也就是如果存在两个相邻的,如a,a+1,就把它们合并成a+2,还有就是如果有两个a,则分成a-2和a+1。
/* * hdu3818cpp/win.cpp * Created on: 2012-10-28 * Author : ben */ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <iostream> #include <algorithm> #include <queue> #include <set> #include <map> #include <stack> #include <string> #include <vector> #include <deque> #include <list> #include <functional> #include <numeric> #include <cctype> using namespace std; const int MAXM = 1000005; int fibo[MAXM]; void work() { bool flag = true; while(flag) { flag = false; for(int i = 1; i < MAXM; i++) { if(fibo[i] >= 2) { fibo[i] -= 2; fibo[i - 2]++; fibo[i + 1]++; flag = true; } if(fibo[i] > 0 && fibo[i + 1] > 0) { fibo[i]--; fibo[i + 1]--; fibo[i + 2]++; flag = true; } } if(fibo[1] > 0) { fibo[2] += fibo[1]; fibo[1] = 0; flag = true; } } } void myprint() { int t = 0; for(int i = 1; i < MAXM; i++) { if(fibo[i] > 0) { t++; } } printf("%d", t); for(int i = 1; i < MAXM; i++) { if(fibo[i] > 0) { printf(" %d", i); } } putchar('\n'); } int main() { #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif int T, a, b; scanf("%d", &T); for(int t = 1; t <= T; t++) { fill(fibo, fibo + MAXM, 0); scanf("%d", &a); while(a--) { scanf("%d", &b); fibo[b]++; } scanf("%d", &a); while(a--) { scanf("%d", &b); fibo[b]++; } work(); printf("Case %d:\n", t); myprint(); } return 0; }