版权声明:本文为博主原创文章,未经博主允许也可以转载。 https://blog.csdn.net/FrankAx/article/details/83150727
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int main(){
int n;
string s;
cin >> n ;
cin >> s ;
if( n == 1 ){
if( s[0] == '1' ) cout << "Yes" << endl;
else cout << "No" << endl;
}else if( n == 2 ){
if( s[0] == s[1] ) {
cout << "No" << endl;
}else{
cout << "Yes" << endl;
}
}else{
int f = 1 ;
for( int i = 0 ; i < n ; i ++ ){
if( i >= 2 && s[i-2] == '0' && s[i-1] == '0' && s[i] == '0' ){
f = 0 ; break ;
}
if( i && s[i-1] == '1' && s[i] == '1' ){
f = 0 ; break ;
}
}
if( f && s[0] == '0' && s[1] == '0' && s[2] == '1' ) f = 0 ;
if( f && s[n-1] == '0' && s[n-2] == '0' && s[n-3] == '1' ) f = 0 ;
cout << ( f ? "Yes" : "No" ) << endl;
}
return 0 ;
}
B
思路:维护一个大顶堆一个小顶堆,内向的人选座位就从小的取一个然后加到大的里面,外向的就从大顶堆取并删除。
Code:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
struct Node{
int id , x ;
bool operator < ( const Node &ch ) const{
return x < ch.x ;
}
bool operator > ( const Node &ch ) const{
return x > ch.x ;
}
}b;
int main(){
int n ;
cin >> n ;
int x;
priority_queue<Node>s; //da
priority_queue<Node ,vector<Node> , greater<Node> >q;
for( int i = 0 ; i < n ; i++ ){
cin >> x ;
b.x = x ; b.id = i + 1 ;
q.push(b) ;
}
string a;
cin >> a;
int len = a.size() ;
for( int i = 0 ; i < len ; i++ ){
if( a[i] == '0' ){
Node u = q.top() ;
q.pop() ;
cout << u.id << ' ' ;
s.push(u) ;
}else{
Node v = s.top() ;
s.pop() ;
cout << v.id << ' ' ;
}
}
cout << endl;
return 0 ;
}
C
题意:删除最多的边,使得每个联通块都是偶数个顶点。
思路:对于u,v,看v这个子树顶点数为偶数则删除u-v边。如果n为奇数,肯定没有结果。
Code:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int AX = 1e5 + 66 ;
std::vector<int> G[AX];
int res = 0 ;
int dfs( int u , int fa ){
int tmp = 0 ;
for( int i = 0 ; i < G[u].size() ; i++ ){
int v = G[u][i] ;
if( v == fa ) continue ;
int t = dfs( v , u ) + 1 ;
tmp += t ;
res += !( t % 2 ) ;
}
return tmp ;
}
int main(){
int n ;
cin >> n ;
if( n % 2 ){
cout << -1 << endl; return 0 ;
}
int x , y ;
for( int i = 1 ; i < n ; i ++ ){
cin >> x >> y ;
G[x].push_back(y) ;
G[y].push_back(x) ;
}
dfs( 1 , -1 ) ;
cout << res << endl ;
return 0 ;
}