openjudge 2787 小兔子捡金币 模拟
来源:互联网 发布:cocos2d js 粒子效果 编辑:程序博客网 时间:2024/04/27 01:15
题目:
http://noi.openjudge.cn/ch0207/2987/
模拟;
思路:
离线操作;
记录每一层最后一个数(最大);
然后模拟;
主要步骤:
1.初始化;
2.求出x,y所在层数;
3.蛇形矩阵的模拟;
又丑又长的代码;
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=10001;int n,m;int a[MAXN],ask[MAXN];void init(){ int k=n,cnt=1,sum=0,h; if(n%2) h=n/2+1; else h=n/2; while(cnt<=h) { sum+=k*4-4,a[cnt]=sum; ask[cnt]=k*4-4,k-=2,cnt++; } cnt--; if(n%2) a[cnt]=a[cnt-1]+1; return;}int calc(int x,int y){ int k,fx=x,fy=y; if(n%2) { if(fx>n/2+1) fx=abs(fx-n)+1; if(fy>n/2+1) fy=abs(fy-n)+1; } else { if(fx>n/2) fx=abs(fx-n)+1; if(fy>n/2) fy=abs(fy-n)+1; } k=min(fx,fy); int x1,y1,maxn,cnt=0; if(x==y && n%2 && x==n/2+1) return a[k]; else x1=k+1,y1=k; maxn=(ask[k]+4)/4; x1--; int ans=a[k]-ask[k]+1; if(x1==x && y1==y) return ans+cnt; while(y1<k+maxn-1) { y1++,cnt++; if(x1==x && y1==y) return ans+cnt; } while(x1<k+maxn-1) { x1++,cnt++; if(x1==x && y1==y) return ans+cnt; } while(y1>k) { y1--,cnt++; if(x1==x && y1==y) return ans+cnt; } while(x1>k+1) { x1--,cnt++; if(x1==x && y1==y) return ans+cnt; }}void solve(){ int x,y; scanf("%d%d",&m,&n); init(); while(m--) { scanf("%d%d",&x,&y); printf("%d\n",calc(x,y)); }}int main(){ solve(); return 0;}
阅读全文
1 0
- openjudge 2787 小兔子捡金币 模拟
- OpenJudge noi 2987 小兔子捡金币(模拟)
- openjudge noi 2987 小兔子捡金币(模拟)
- 【OpenJudge 2987 】小兔子捡金币
- Openjudge 2987 小兔子捡金币
- 【OpenJudge 2987】小兔子捡金币
- POJ 小兔子捡金币
- OpenJudge_P2987 小兔子捡金币
- [openjudge2987]小兔子捡金币
- poj 4006:小兔子捡金币
- 【OpenJ 2987】T3 小兔子捡金币(小金币捡兔子)
- 小兔子
- 小兔子故事集锦
- 古典小兔子问题
- 捡金币
- 捡金币
- 大兔子和小兔子
- '小兔子'的感情人生
- Android的Fragment BackStack回退功能
- UTF-8HTML部署到tomcat乱码
- 060 不定积分之第二类换元积分法
- openjudge noi 2987 小兔子捡金币(模拟)
- 个性桌面
- openjudge 2787 小兔子捡金币 模拟
- 面试心得(2017-10-13)
- 树状数组改段求段
- Tablayout的简单使用
- 【状压DP】【cofun1760】angrybirds
- 漏桶算法和令牌桶算法
- 微信支付服务商开发能力说明文档范本-微信公众号使用教程31
- 【codevs 3115 3116 3117】高精度练习之加/减/乘法
- 微信公众平台编辑器教程-微信公众号使用教程32