正反各跑一遍匹配
正着满足,反着不满足,没有坐反
正着不满足,反着满足,坐反
都满足,不知道
#include <bits/stdc++.h> using namespace std; int n , m , x , y , a[20] , b[20] , c1[20] , c2[20] , op , t1 , t2; int main() { cin >> n >> x >> y; for( register int i = 1 ; i <= n ; i ++ ) cin >> a[i]; cin >> m; for( int i = 1 ; i <= m ; i ++ ) cin >> b[i]; t1 = t2 = 1; if( x < y ) { for( int i = 1 ; i <= m ; i ++ ) if( a[ x + i ] != b[i] ) t1 = 0; if( x - 1 >= m ) { for( int i = 1 ; i <= m ; i ++ ) if( a[ x - i ] != b[i] ) t2 = 0; } else t2 = 0; } else { for( int i = 1 ; i <= m ; i ++ ) if( a[ x - i ] != b[i] ) t1 = 0; if( n - x >= m ) { for( int i = 1 ; i <= m ; i ++ ) if( a[ x + i ] != b[i] ) t2 = 0; } else t2 = 0; } if( t1 && t2 ) puts("Unsure"); else if( t1 ) puts("Right"); else puts("Wrong"); return 0; }
相邻的两个村庄之间一定会连一条道路,权值就是两个村庄的较大值
证明
设区间[l,r]
,有\(\forall i \in [l,r] , a_k \ge a_i(l\le k\le r)\),则该区间可分为三个连通块,[l,k-1],[k+1,r]
和[k]
无论怎样左右两个联通块和[k]
连接的权值都是\(a_k\),所以不妨让其与相邻的两个村庄相连,递归操作就可以得到结论
#include <bits/stdc++.h> using namespace std; #define ll long long ll n , l , r , ans; int main() { cin >> n >> l; for( register int i = 1 ; i < n ; i ++ ) { cin >> r; ans += max( l , r ) , l = r; } cout << ans << endl; }
当\(r\)足够大时,每个基站都可以覆盖所有的点
\[lim_{r\to +\infty} f(r)=\frac{1}{n} \]#include <bits/stdc++.h> using namespace std; int main() { double a; cin >> a; printf("%.9lf" , 1.0 / a ); return 0; }
模拟题
#include <bits/stdc++.h> #define fx ( x + dx[dir] ) #define fy ( y + dy[dir] ) using namespace std; const int N = 55; const int dx[] = { -1 , -1 , 0 , 1 , 1 , 1 , 0 , -1 }; const int dy[] = { 0 , +1 , +1 , 1 , 0 , -1 , -1 , -1 }; int x , y , n , m , t , v = 0, dir = 0; char mapp[N][N] , opt; int main() { cin >> n >> m; for( register int i = 0 ; i <= m + 1 ; i ++ ) mapp[i][0] = mapp[i][ m + 1 ] = '#'; for( register int i = 0 ; i <= n + 1 ; i ++ ) mapp[0][i] = mapp[ n + 1 ][i] = '#'; for(register int i = 1 ; i <= n ; i ++ ) { for( register int j = 1 ; j <= m ; j ++ ) { cin >> mapp[i][j]; if( mapp[i][j] == '*') x = i , y = j; } } cin >> t; for( register int i = 1 ; i <= t ; i ++ ) { cin >> opt; if( opt == 'U' ) v ++; else if( opt == 'D' ) v = max( 0 , v - 1 ); else if( opt == 'L' ) dir = ( dir + 7 ) % 8; else if( opt == 'R' ) dir = ( dir + 1 ) % 8; //move register bool f = 1; for( register int j = 1 ; j <= v && f; j ++ ) { if( mapp[x][fy] == '#' && mapp[fx][y] == '#' && dir % 2 == 1 ) f = 0 , v = 0; else if( mapp[fx][fy] == '#' ) f = 0 , v = 0; else x = fx , y = fy; } if( f ) cout << x << " " << y << endl; else cout << "Crash! " << x << ' ' << y << endl; } return 0; }
统计-
数量
#include <bits/stdc++.h> using namespace std; int main() { int n , cnt = 0; cin >> n; string s; getchar(); for( register int i = 1 ; i <= n ; i ++ ) { getline( cin , s ); for( auto t : s ) { if( t == '-' ) cnt ++; } } cout << cnt << endl; }