社区讨论
有dalao看一下么
P1514[NOIP 2010 提高组] 引水入城参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi6ubfl7
- 此快照首次捕获于
- 2025/11/20 10:56 4 个月前
- 此快照最后确认于
- 2025/11/20 10:56 4 个月前
CPP
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct interval{
int s,e,k;
}each[103];
bool cmp(interval a, interval b) {
if(a.s ==b.s) return a.e<b.e;
else return a.s<b.s;
}
int map[503][503];
int vis[503][503];
int cover[503];
int n,m;
int cnt =5;
const int step[4][2] ={{1,0},{-1,0},{0,1},{0,-1}};
inline void dfs(int x ,int y, int f) {
vis[x][y] =1;
if(x ==n) {
if(!cover[y]) cnt--;
cover[y] =1;
each[f].e =max(each[f].e, y);
each[f].s =min(each[f].s, y);
}
for(int i=0; i<4; i++) {
int a=x+step[i][0];
int b=y+step[i][1];
if(a >0 && b>0 && a <=n && b <=m && !vis[a][b] && map[a][b] <map[x][y]) {
dfs(a,b,f);
}
}
}
int main(void)
{
scanf("%d %d", &n, &m);
cnt =m;
memset(cover, 0, sizeof(cover));
memset(vis, 0,sizeof(vis));
memset(map, 0,sizeof(map));
for(int i=1; i<=m; i++) {
each[i].e=0;
each[i].s=9999999;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
scanf("%d", &map[i][j]);
}
}
for(int i=1; i<=m; i++) {
dfs(1,i,i);
memset(vis, 0, sizeof(vis));
}
if(cnt !=0) {
cout <<0<<endl<<cnt<<endl;
return 0;
}
sort(each+1, each+1+m, cmp);
int f[m+1];
memset(f, 126, sizeof(f));
f[0] =0;
for(int i=1; i<=m; i++) {
for(int j=1; j<=m; j++) {
if(each[j].s <=i && each[j].e >=i) {
f[i] =min(f[i], f[each[j].s-1] +1);
}
}
}
cout <<1<<endl <<f[m];
return 0;
}
思路清奇
第三个点wa了第五个点t了
别的点都是20ms左右
回复
共 3 条回复,欢迎继续交流。
正在加载回复...