总结一下这场比赛,就是我太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,在搞。