社区讨论

有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 条回复,欢迎继续交流。

正在加载回复...