2015百度之星资格赛系列

来源:互联网 发布:centos everything 编辑:程序博客网 时间:2024/05/17 08:16
// 2015百度之星资格赛系列//// 首先,1001这道题,挺简单,分成这个数单独一组(i) 或者与某本书一组(i,j)// 则在第n项后面再添加一本书,那么这本书单着的情况就是f(n),与前面n个里面// 的任意一项组成一组,则是f(n-1),那么公式就出来了//// 1002 水题,从第一个开始取设为x,每次加上k,最后超出length的时候让x对k取膜// 加1的结果再送x,直到取完所有,即为答案//// 1003 水题,其实这一题可以在每个子网掩码下,直接算出ip,最后用二重循环爆出// 相同的,把相同的某一项置为负数或者比255大的数,最后找出来就可以了//// 1004 经典博弈,满足第一次可以放盘子,先手必胜,否则必败,算出中心到边的// 距离与r比较即可//// 1005 其实也是个水题,预处理出骑士和国王从各自的起点出发,到达每个点的最短时间// 则对于国王来说,如果能在i秒的时候到达该点,则i+1,i+2...k都可以到达该点// 对于骑士而言,如果在第j秒的时候到达该点,则j+2,j+4...(even)(k,k-1)都可以到达该点// 最后,只要根据这两个时间分类讨论即可// 如果国王先到该点,而骑士后到,则时间就是骑士的时间// 反之骑士先到,国王后到,则时间就是国王的时间+((骑士与国王同奇偶)? 0: 1);//// 1006 概率d问题,这个真不会,,等有功夫再仔细想想吧//// 最后对于这次资格赛的感受,总体上还是比较简单// 就是在1005上,一开始看错了题目,以为国王是只能走四个方向,一直按照国王// 也是奇数或者偶数的情况写,结果一直跪了4个多小时,贴个1005的代码,哎,继续练吧,还是做题目少了//#include <cassert>#include <cctype>#include <cfloat>#include <climits>#include <cmath>#include <complex>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <deque>#include <functional>#include <iostream>#include <list>#include <map>#include <numeric>#include <queue>#include <set>#include <stack>#include <vector>#define ceil(a,b) (((a)+(b)-1)/(b))#define endl '\n'#define gcd __gcd#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))#define popCount __builtin_popcountlltypedef long long ll;using namespace std;const int MOD = 1000000007;const long double PI = acos(-1.L);template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }template<class T> inline T lowBit(const T& x) { return x&-x; }template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }const int maxn = 1008;int v[maxn][maxn];const int inf = 0x6f6f6f6f;int kix,kiy,knx,kny;int n,m,k;bool vis2[maxn][maxn];int a[maxn][maxn];int b[maxn][maxn];struct node{int x;int y;int t;node(int x,int y,int t):x(x),y(y),t(t){}};const int ndx[8] = {-2,-1,1,2,2,1,-1,-2};const int ndy[8] = {1,2,2,1,-1,-2,-2,-1};void init(){cin >> n >> m >> k;cin >> kix >> kiy;cin >> knx >> kny;memset(vis2,0,sizeof(vis2));memset(a,0,sizeof(a));memset(b,inf,sizeof(b));for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){a[i][j] = max(a[i][j],max(abs(i-kix),abs(j-kiy)));}a[kix][kiy] = 2;//for (int i=1;i<=n;i++){//for (int j=1;j<=m;j++){//cout << a[i][j] << " ";//}//cout << endl;//}//cout << endl;}int cnt ;bool ok(int x,int y){if (x>=1&&x<=n&&y>=1&&y<=m)return true;return false;}void bfs2(){queue<node> que;que.push(node(knx,kny,0));vis2[knx][kny] = 1;while(!que.empty()){node x = que.front();if (x.t>=k)break;que.pop();for (int i=0;i<8;i++){int tx = x.x + ndx[i];int ty = x.y + ndy[i];if (!ok(tx,ty))continue;if (!vis2[tx][ty]){vis2[tx][ty] = 1;b[tx][ty] = min(b[tx][ty],x.t+1);que.push(node(tx,ty,x.t+1));}}}b[knx][kny] = 2;//for (int i=1;i<=n;i++){//for (int j=1;j<=m;j++){//cout << b[i][j] << " ";//}//cout << endl;//}}void solve(){if (abs(kix-knx)>3 * k || abs(kiy-kny) > 3 * k){puts("OH,NO!");return ;}bfs2();cnt = inf;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){if (a[i][j]>0 && b[i][j]<inf){int le1 = a[i][j];int le2 = b[i][j];int temp;if (le1<le2)temp = le2;else if (((le1-le2)&1)==1){temp = le1 + 1;}else {temp = le1 ;}//cout << "temp = " << temp << endl;cnt = min(temp,cnt);}}if (cnt>k){puts("OH,NO!");}else {printf("%d\n",cnt);}}int main() {int t;//freopen("G:\\Code\\1.txt","r",stdin);scanf("%d",&t);int kase = 1;while(t--){printf("Case #%d:\n",kase++);init();solve();}return 0;}

0 0