hdu6229--2017ACM/ICPC亚洲区沈阳站(M题)
2018-01-31 16:45
344 查看
题意:有一个机器人,在一个方格纸上走,每次留在原地和走到相邻的无障碍的格子上的概率是相等的,问无限次走法之后,机器人在格子纸的右下方的概率是多少?
解释一下样例:
因为有无限步,所以起点可以忽略,只要找每个格子是有几个格子可以转移到它就可以了,然后算出红色区域的概率,即为答案,这启示我们找规律的重要性以及无限的重要性。
然后这要怎么算呢?/(ㄒoㄒ)/~~
最暴力的想法就是把每个格子的贡献都算出来,然后用右下方的总数比上总数,但是,二维数组不能开那么大(这里需要map【10005】【10005】)。
数组终于可以开下了…但是又超时!
http://acm.hdu.edu.cn/showproblem.php?pid=5925
这次终于AC的代码!
解释一下样例:
因为有无限步,所以起点可以忽略,只要找每个格子是有几个格子可以转移到它就可以了,然后算出红色区域的概率,即为答案,这启示我们找规律的重要性以及无限的重要性。
然后这要怎么算呢?/(ㄒoㄒ)/~~
#include<iostream> using namespace std; #include<string.h> int map[10005][10005]; int value[10005][10005]; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; long long gcd(long long a,long long b) { if(b==0) return a; else return gcd(b,a%b); } int main() { int t; scanf("%d",&t); int k; for(k=1;k<=t;k++) { memset(map,0,sizeof(map)); int n,k; scanf("%d%d",&n,&k); int i; for(i=0;i<k;i++) { int x,y; scanf("%d%d",&x,&y); map[x][y]=1; } long long sum=0; int j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { int num=0; if((i==0&&j==0)||(i==n-1&&j==0)||(i==0&&j==n-1)||(i==n-1&&j==n-1)) num=3; else if(i==0||i==n-1||j==0||j==n-1) num=4; else num=5; value[i][j]=num; //if(map[i][j]==1) // value[i][j]=0; } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { int w; for(w=0;w<4;w++) { int a=i+dir[w][0]; int b=j+dir[w][1]; if(a<0||a>=n||b<0||b>=n) continue; if(map[a][b]==1) value[i][j]--; } if(map[i][j]==1) value[i][j]=0; } } for(i=0;i<n;i++) for(j=0;j<n;j++) sum+=value[i][j]; long long fenzi=0; for(i=0;i<n;i++) for(j=n-i-1;j<n;j++) fenzi+=value[i][j]; //cout<<sum<<" "<<fenzi<<endl; long long g=gcd(sum,fenzi); sum=sum/g; fenzi=fenzi/g; printf("Case #%d: %lld/%lld\n",k+1,fenzi,sum); } return 0; }
最暴力的想法就是把每个格子的贡献都算出来,然后用右下方的总数比上总数,但是,二维数组不能开那么大(这里需要map【10005】【10005】)。
#include<iostream> using namespace std; #include<string.h> bool map[10005][10005]; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; long long gcd(long long a,long long b) { if(b==0) return a; else return gcd(b,a%b); } int judge(int i,int j,int n) { int num=0; if((i==0&&j==0)||(i==n-1&&j==0)||(i==0&&j==n-1)||(i==n-1&&j==n-1)) num=3; else if(i==0||i==n-1||j==0||j==n-1) num=4; else num=5; return num; } int main() { int t; scanf("%d",&t); int k; for(k=1;k<=t;k++) { memset(map,0,sizeof(map)); int n,k; scanf("%d%d",&n,&k); int i; for(i=0;i<k;i++) { int x,y; scanf("%d%d",&x,&y); map[x][y]=1; } long long sum=0,fenzi=0; sum=3*4+4*4*(n-2)+5*(n-2)*(n-2); fenzi=3*3+4*2*(n-2)+5*((n-2)*(n-1))/2; int j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(map[i][j]==0) continue; int w; if(map[i][j]==1) { sum-=judge(i,j,n); if((i+j)>=(n-1)) fenzi-=judge(i,j,n); } if(map[i][j]==1) { for(w=0;w<4;w++) { int a=i+dir[w][0]; int b=j+dir[w][1]; if(a<0||a>=n||b<0||b>=n||map[a][b]==1) continue; else { sum--; if((a+b)>=(n-1)) fenzi--; } } } } } long long g=gcd(sum,fenzi); sum=sum/g; fenzi=fenzi/g; printf("Case #%d: %lld/%lld\n",k+1,fenzi,sum); } return 0; }
数组终于可以开下了…但是又超时!
http://acm.hdu.edu.cn/showproblem.php?pid=5925
#include<iostream> using namespace std; #include<string.h> typedef struct BadPoint { int x,y; }; BadPoint bad[1005]; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; long long gcd(long long a,long long b) { if(b==0) return a; else return gcd(b,a%b); } int judge(int i,int j,int n) { int num=0; if((i==0&&j==0)||(i==n-1&&j==0)||(i==0&&j==n-1)||(i==n-1&&j==n-1)) num=3; else if(i==0||i==n-1||j==0||j==n-1) num=4; else num=5; return num; } int main() { int t; scanf("%d",&t); int o; for(o=1;o<=t;o++) { //memset(map,0,sizeof(map)); int n,k; scanf("%d%d",&n,&k); int i; for(i=0;i<k;i++) { int x,y; scanf("%d%d",&x,&y); bad[i].x=x; bad[i].y=y; //map[x][y]=1; } long long sum=0,fenzi=0; sum=3*4+4*4*(n-2)+5*(n-2)*(n-2); fenzi=3*3+4*2*(n-2)+5*((n-2)*(n-1))/2; int j; for(i=0;i<k;i++) { sum-=judge(bad[i].x,bad[i].y,n); if((bad[i].x+bad[i].y)>=(n-1)) fenzi-=judge(bad[i].x,bad[i].y,n); int w; for(w=0;w<4;w++) { int a=bad[i].x+dir[w][0]; int b=bad[i].y+dir[w][1]; if(a<0||a>=n||b<0||b>=n) continue; int flag=1; for(int c=0;c<k;c++) { if(a==bad[c].x&&b==bad[c].y) flag=0; } if(!flag) continue; sum--; if((a+b)>=(n-1)) fenzi--; } } long long g=gcd(sum,fenzi); sum=sum/g; fenzi=fenzi/g; printf("Case #%d: %lld/%lld\n",o,fenzi,sum); } return 0; }
这次终于AC的代码!
相关文章推荐
- hdu6223--2017ACM/ICPC亚洲区沈阳站(G题)BFS+剪枝
- 2017ACM/ICPC亚洲区沈阳站_Infinite Fraction Path(BFS)
- 2017ACM/ICPC亚洲区沈阳站(部分解题报告)
- hdu 5510 Bazinga 2015ACM/ICPC亚洲区沈阳站现场赛
- HDU6195 | 2017 ACM-ICPC 亚洲区(沈阳赛区)网络赛-B cable cable cable
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- 2017ACM/ICPC亚洲区沈阳站【solved:6 / 13】
- 重要-- 模板 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛J题Our Journey of Dalian Ends (最小费用最大流)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E Maximum Flow
- hdu 5510 Bazinga 2015ACM/ICPC亚洲区沈阳站-重现赛
- HDU 5954 Do not pour out 积分 二分 — 2016ACM-ICPC亚洲区沈阳站
- HDU - 6201 transaction transaction transaction (2017 ACM-ICPC 亚洲区 (沈阳赛区) 网络赛 1008)
- [计蒜客16955] Islands [2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 F]
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
- 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)HDU5512 Pagodas
- 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学) HDU 5512 Pagodas
- HDU 5950 Recursive sequence(构造矩阵+矩阵幂)——2016ACM/ICPC亚洲区沈阳站
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区) F Islands
- HDU - 6206 Apple (2017 ACM-ICPC 亚洲区 (青岛赛区) 网络赛 1001)
- 2015ACM/ICPC亚洲区沈阳站 Meeting HDU 5521 (优先队列搜索)