AtCoder Beginner Contest 301
A - Overall Winner
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(nullptr) , cout.tie(nullptr);
int n;
cin >> n;
string s;
cin >> s;
int t = 0 , a = 0;
for( auto i : s )
if( i == 'T' ) t ++;
else a ++;
if( t > a ) cout << "T";
else if( t < a )cout << "A";
else {
if( s.back() == 'T' ) cout << "A";
else cout << "T";
}
return 0;
}
B - Fill the Gaps
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(nullptr) , cout.tie(nullptr);
int n;
cin >> n;
vector<int> a(n);
for( int i = 0 ; i < n ; i ++ )
cin >> a[i];
vector<int> b;
b.push_back( a[0] );
for( int i = 1 ; i < n ; i ++ ){
if( a[i] > b.back() ){
for( int j = b.back()+1 ; j < a[i] ; j ++ )
b.push_back(j);
}else {
for( int j = b.back()-1 ; j > a[i] ; j -- )
b.push_back(j);
}
b.push_back( a[i] );
}
for( auto i : b )
cout << i << " ";
return 0;
}
C - AtCoder Cards
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(nullptr) , cout.tie(nullptr);
string a , b ;
cin >> a >> b;
map<char , int > cnt , ans ;
int d = 0;
for( auto i : a )
cnt[i] ++;
for( auto i : b )
ans[i] ++;
for( auto i : "atcoder" ){
if( cnt[i] == ans[i] ) continue;
else if( cnt[i] > ans[i] ) ans['@'] -= cnt[i] - ans[i] , ans[i] = cnt[i];
else cnt['@'] -= ans[i] - cnt[i] , cnt[i] = ans[i];
}
if( cnt['@'] < 0 || ans['@'] < 0 || cnt['@'] != ans['@'] ){
cout << "No\n";
return 0;
}
set<char> st;
st.insert('a');
st.insert('t');
st.insert('c');
st.insert('o');
st.insert('d');
st.insert('e');
st.insert('r');
for( auto [ k , v ] : cnt ){
if( st.count(k) ) continue;
if( v != ans[k] ){
cout << "No\n";
return 0;
}
}
for( auto [ k , v ] : ans ){
if( st.count(k) ) continue;
if( v != cnt[k] ){
cout << "No\n";
return 0;
}
}
cout << "Yes\n";
return 0;
}
D - Bitmask
把?
当成是一个二进制数,去二分这个数的大小,判断的时候把二进制数还原会原数就可以比较大小了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(nullptr) , cout.tie(nullptr);
string s;
int n , m = 0;
cin >> s >> n;
vector<int> a((int)s.size());
for( int i = 0 ; i < (int)s.size() ; i ++ ){
if( s[i] == '?' ) a[i] = -1, m ++;
else if( s[i] == '1' ) a[i] = 1;
else a[i] = 0;
}
auto op = [a]( int x ){
auto b = a;
for( int i = b.size()-1 ; i >= 0 ; i -- )
if( b[i] == -1 ) b[i] = x % 2 , x /= 2;
int ans = 0;
for( int i : b )
ans = ans * 2ll + i;
return ans;
};
int l = 0 , r = (1ll<<m) - 1 , res = -1;
while( l <= r ){
int mid = ( l + r ) >> 1;
int d = op(mid);
if( d <= n ) res = d , l = mid + 1;
else r = mid - 1;
}
cout << res << "\n";
return 0;
}