CF 192 DIV.2

来源:互联网 发布:凯迪网络手机版 编辑:程序博客网 时间:2024/05/14 16:16

总结一下这场比赛,就是我太SB了。说多了都是泪。

A,大水题。

B,根据题意,可以肯定有一个城市是可以与所有城市相连的,直接找到该点然后输出该点与其他所有点相连即可。

int x[111111] , y[111111] ,num ;bool vis[111111] ;int aa[111111] ,nn  = 0 ;void antry(){    num = 0 ;    int n , m ;    cin >> n >> m ;    mem(vis,0) ;    for (int i = 0 ;i < m ;i ++ ){        int a , b ;        cin >> a >> b ;        vis[a] = 1 ;        vis[b] = 1 ;    }    int pos ;    for (int i = 1 ;i <= n ;i ++ ){        if(!vis[i]){            pos = i ;            break ;        }    }    cout << n - 1 << endl;    for (int i = 1 ;i <= n ;i ++ ){        if(i == pos)continue ;        cout << pos <<" " << i << endl;    }}int main() {    antry() ;    return 0 ;}

C,先说-1的情况,当点[x , y ]行x 与列y 都是E的时候,那么就是-1。

然后只要判断 每一行 ,是否没满 ,或者每一列是否没满 。

如果每一行都没满 ,那么每一行都输出一个点,如果每一列都没满,那么每一列都找一个点输出。

char Map[1111][1111] ;int hang[1111] ;int lie[1111] ;int main() {    int n ;    cin >> n ;    for (int i = 1 ; i <= n ;i ++ ){        for (int j = 1 ;j <= n ;j ++ ){            cin >> Map[i][j] ;            if(Map[i][j] == 'E'){                hang[i] ++ ;                lie[j] ++ ;            }        }    }    int flag = 0 ;    for (int i = 1 ;i <= n ;i ++ ){        for (int j = 1 ;j <= n ;j ++ ){            if(hang[i] == n && lie[j] == n){                flag = 1 ;            }        }    }    if(flag)cout << -1 << endl;    else {        int num1 = 0 ;        int num2 = 0 ;        for (int i = 1 ;i <= n ;i ++ ){            if(hang[i] != n)num1 ++ ;            if(lie[i] != n)num2 ++ ;        }        if(num1 == n){            for (int i = 1 ;i <= n ;i ++ )            {                bool ff = 0 ;                for (int j = 1 ;j <= n ;j ++ ){                    if(Map[i][j] == '.'){                        cout << i << " " << j << endl;                        ff = 1 ;                    }                    if(ff)break ;                }            }        }        else if(num2 == n){            for (int i = 1 ;i <= n ;i ++ ){                int ff = 0 ;                for (int j = 1 ;j <= n ;j ++ ){                    if(Map[j][i] == '.'){                        cout << j << " " <<i << endl;                        ff = 1 ;                    }                    if(ff)break ;                }            }        }    }    return 0;}

D,大水题,直接从E开始BFS,找出所有点的距离,然后判断是否比S 到E的时间小,加起来即可。

#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <queue>#include <set>#include <vector>#include <stack>#include <map>#include <iomanip>#define PI acos(-1.0)#define Max 2505#define inf 1<<28#define LL(x) ( x << 1 )#define RR(x) ( x << 1 | 1 )#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )#define ll long long#define mem(a,b) memset(a,b,sizeof(a))#define mp(a,b) make_pair(a,b)#define PII pair<int,int>using namespace std;inline void RD(int &ret) {    char c;    do {        c = getchar();    } while(c < '0' || c > '9') ;    ret = c - '0';    while((c=getchar()) >= '0' && c <= '9')        ret = ret * 10 + ( c - '0' );}char Map[1111][1111] ;PII st[11111111] ;int sx ,sy ;int ex ,ey ;int vis[1005][1005] ;int n , m ;int num[1005][1005] ;queue<PII > qe ;int mx[4] = {0 , 0 ,-1, 1} ;int my[4] = {1, -1, 0 ,0 } ;int inmap(int x ,int y){    if(x >= 1 && x <= n && y >= 1 && y <= m)return 1 ;    return 0 ;}int dbfs(){    PII  s , e ;    mem(vis,0) ;    mem(num , 0) ;    e.first =  ex ;    e.second = ey ;    while(!qe.empty())qe.pop() ;    qe.push(e) ;    num[ex][ey] = 0 ;    vis[ex][ey] = 1 ;    while(!qe.empty()){        PII tmp = qe.front() ;        qe.pop() ;        for (int i = 0 ;i < 4 ;i ++ ){            int tx = tmp.first + mx[i] ;            int ty = tmp.second + my[i] ;            if(inmap(tx, ty) && Map[tx][ty] != 'T'){                if(!vis[tx][ty]){                    vis[tx][ty] = 1 ;                     num[tx][ty] = num[tmp.first][tmp.second] + 1 ;                    qe.push(mp(tx,ty)) ;                }            }        }    }    return inf ;}void antry(){    cin >> n >> m ;    int num1 = 0 ;    for (int i = 1 ;i <= n ; i ++ ){        for (int j = 1 ;j <= m ; j ++ ){            cin >> Map[i][j] ;            if(Map[i][j] >= '1' && Map[i][j] <= '9'){                st[num1].first = i ;                st[num1].second = j ;                num1 ++ ;            }            else if(Map[i][j] == 'S'){                sx = i ;                sy = j ;            }            else if(Map[i][j] == 'E'){                ex = i ;                ey = j ;            }        }    }    dbfs() ;    int ans = 0 ;    int s1 = num[sx][sy] ;    for (int i = 0 ;i < num1 ; i ++ ){        int s2 = num[st[i].first][st[i].second] ;        if(s2 <= s1 && s2 != 0){            ans += Map[st[i].first][st[i].second] - '0' ;        }    }    cout << ans << endl;}int main() {    antry() ;    return 0 ;}

E,在搞。