AtCoder Beginner Contest 072
A - Sandglass2
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main() {
int a , b;
cin >> a >> b;
cout << max( a - b , 0ll );
return 0;
}
B - OddString
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main() {
string s;
cin >> s;
for( int i = 0 ; i < s.size() ; i += 2 )
cout << s[i];
return 0;
}
C - Together
这里注意到数字的个数只有\(10^5\),所以最多能够作为答案也不多,并且数字的范围也不大,直接枚举作为答案的值,然后统计一下就好。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5;
int32_t main() {
ios::sync_with_stdio(false) , cin.tie(nullptr) , cout.tie(nullptr);
int n;
cin >> n;
vector<int> cnt( N );
for( int x ; n ; n -- )
cin >> x , cnt[x] ++;
int res = 1;
for( int i = 1 ; i < N-1 ; i ++ )
res = max( res , cnt[i-1] + cnt[i] + cnt[i+1] );
cout << res;
return 0;
}
D - Derangement
首先很容易证明的是,如果当前位置\(p_i=i\)无论向前向后交换都一定可以满足条件,这样我们只要一开始向着一个方向交换,就好了,最后就是特判一下最后一个位置。
#include <bits/stdc++.h>
using namespace std;
int32_t main() {
ios::sync_with_stdio(false) , cin.tie(nullptr) , cout.tie(nullptr);
int n , res = 0 ;
cin >> n;
vector<int> a( n+1 );
for( int i = 1 ; i <= n ; i ++ )
cin >> a[i];
for( int i = 1 ; i < n ; i ++ )
if( a[i] == i ) res ++ , swap( a[i] , a[i+1]);
if( a[n] == n ) res ++;
cout << res << "\n";
return 0;
}