Codeforces Round #142 (Div. 2) C
2012-10-02 02:34
387 查看
http://codeforces.com/problemset/problem/229/A
比完以后看了看其他人的代码,其实思路我是想到了,可是就是代码没实现,代码能力太弱了。。
思路就是先预处理一下。把每行的close[i][j]标记出来。close[i][j]表示在第i行的第j个数最少移动几次可以使得map[i][j]变为1。
在这里可以使用队列来得到close[i][j]的值,下面大牛的代码:
在尝试了bfs(其实就是队列....)后。我换成了直接写。。然后貌似没写好,竟然tle了。。可是时间复杂度才n*m*2啊。。。最后没时间了。刚刚改了下变成了下面的形式:
明天交下看看。。不应该tle 啊。
接上,终于知道为什么tle了。tle的可能有很多种啊,不一定是算法的问题。问题出在 char buf[256]上.....竟然脑残的把m<=10000给忘了...泪奔啊,还有一个问题就是我的inf定义的太小。(开始是防止超出int才定义这么小的,但是明显这也是错的。。。因为有可能是n*m==1000000啊。。)
改正后ac了。。太水了。
这份也ac了:还是题目做的太少了啊。比赛的时候也没能冷静下来好好想清楚。下次一定得注意!
View Code
比完以后看了看其他人的代码,其实思路我是想到了,可是就是代码没实现,代码能力太弱了。。
思路就是先预处理一下。把每行的close[i][j]标记出来。close[i][j]表示在第i行的第j个数最少移动几次可以使得map[i][j]变为1。
在这里可以使用队列来得到close[i][j]的值,下面大牛的代码:
#include <cstdio> #include <queue> int ans[10010], min[10010]; int main(){ int n, m; scanf("%d %d\n" ,&n ,&m); char buf[10010]; for(int i = 1; i <= n; i++){ scanf("%s" ,buf + 1); std::queue<int> que; for(int j = 1; j <= m; j++){ if(buf[j] == '1'){ min[j] = 0; que.push(j); } else min[j] = m; } if(que.empty()){ puts("-1"); return 0; } while(!que.empty()){//有点bfs的感觉,我开始也是这么写的,可是我竟然越写越繁琐。唉,代码写的少啊。 int now = que.front(); que.pop(); int lnex = (now == 1)? m: now - 1; int rnex = (now == m)? 1: now + 1; if(min[lnex] > min[now] + 1){ min[lnex] = min[now] + 1; que.push(lnex); } if(min[rnex] > min[now] + 1){ min[rnex] = min[now] + 1; que.push(rnex); } } for(int j = 1; j <= m; j++) ans[j] += min[j]; } int res = m * n; for(int i = 1; i <= m; i++){ if(res > ans[i]) res = ans[i]; } printf("%d\n" ,res); }
在尝试了bfs(其实就是队列....)后。我换成了直接写。。然后貌似没写好,竟然tle了。。可是时间复杂度才n*m*2啊。。。最后没时间了。刚刚改了下变成了下面的形式:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 105 #define inf 10020 #define Min(x,y) (x>y?y:x) int n,m; int map[MAXN][MAXN*MAXN]; int close[MAXN][MAXN*MAXN]; int main() { while(scanf("%d%d",&n,&m) != EOF) { getchar(); char buf[256]; for(int i=1;i<=n;i++) { gets(buf); for(int j=1;j<=m;j++) { if(buf[j-1]=='1') map[i][j]=1; else if(buf[j-1]=='0') map[i][j]=0; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) close[i][j]=inf; for(int i=1;i<=n;i++) { int step=inf; for(int j=1;j<=m*2;j++)//看一个同学的代码是<=m,明显不对。。。估计final test的时候会跪.. { if(j==m+1) j++; if(map[i][j%(m+1)]==1) { step=0; close[i][j%(m+1)]=0; } else { step++; close[i][j%(m+1)]=Min(close[i][j%(m+1)],step); } } step=inf; for(int j=m;j>-m;j--) { if(j==0) j--; if(map[i][(j+m+1)%(m+1)]==1) { step=0; close[i][(j+m+1)%(m+1)]=0; } else { step++; close[i][(j+m+1)%(m+1)]=Min(close[i][(j+m+1)%(m+1)],step); } } } int ans=inf; for(int j=1;j<=m;j++) { int s=0; for(int i=1;i<=n;i++) s+=close[i][j]; if(s<ans) ans=s; } if(ans==inf) puts("-1"); else printf("%d\n",ans); } return 0; }
明天交下看看。。不应该tle 啊。
接上,终于知道为什么tle了。tle的可能有很多种啊,不一定是算法的问题。问题出在 char buf[256]上.....竟然脑残的把m<=10000给忘了...泪奔啊,还有一个问题就是我的inf定义的太小。(开始是防止超出int才定义这么小的,但是明显这也是错的。。。因为有可能是n*m==1000000啊。。)
改正后ac了。。太水了。
这份也ac了:还是题目做的太少了啊。比赛的时候也没能冷静下来好好想清楚。下次一定得注意!
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define MAXN 105 #define inf 1000020 #define Min(x,y) (x>y?y:x) int n,m; char map[MAXN][MAXN*MAXN]; int close[MAXN][MAXN*MAXN]; int main() { while(scanf("%d%d",&n,&m) != EOF) { getchar(); for(int i=1;i<=n;i++) { gets(map[i]+1); } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) close[i][j]=inf; for(int i=1;i<=n;i++) { queue<int>q; int cur,lnext,rnext; while(!q.empty()) q.pop(); for(int j=1;j<=m;j++) if(map[i][j]=='1') { close[i][j]=0; q.push(j); } while(!q.empty()) { cur=q.front(); q.pop(); lnext=(cur==1)?m:cur-1; rnext=(cur==m)?1:cur+1; if(close[i][lnext]>close[i][cur]+1) { close[i][lnext]=close[i][cur]+1; q.push(lnext); } if(close[i][rnext]>close[i][cur]+1) { close[i][rnext]=close[i][cur]+1; q.push(rnext); } } } /* for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cout<<close[i][j]<<" "; cout<<endl; } */ int ans=inf; for(int j=1;j<=m;j++) { int s=0; for(int i=1;i<=n;i++) { s+=close[i][j]; if(s>ans) break; } if(s<ans) ans=s; } if(ans==inf) puts("-1"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- 解题报告:Codeforces Round #142 (Div. 1) C. Triangles (思维好题)
- Codeforces Round #142 (Div. 1) (完全)
- Codeforces Round #142 (Div. 1) C. Triangles
- Codeforces Round #142 (Div. 2)B. T-primes
- Shifts-Codeforces Round #142 (Div. 2) C (矩阵)
- Codeforces Round #142 (Div. 2) C. Shifts
- Codeforces Round #142 (Div. 2)
- Codeforces Round #142 (Div. 2)
- Codeforces Round #142 (Div. 2) 解题报告
- Codeforces Round #142 (Div. 1) C. Triangles 数学,完全图,统计贡献 2017/1/25
- Codeforces Round #142 (Div. 1), problem: (C) Triangles
- Codeforces Round #142 (Div. 2) C. Shifts
- Codeforces Round #142 (Div. 2)
- Codeforces Round #142 (Div. 2)
- Codeforces Round #142 (Div. 2)
- Codeforces Round #142 (Div. 2)
- Codeforces Round #142 (Div. 2) B. T-primes (数学、O(n)筛素数)
- Codeforces Round #142 (Div. 2) C. Shifts
- Codeforces Round #142 (Div. 2)
- Codeforces Round #142 (Div. 2) 解题报告