B. Zero Array
题目链接:codeforces 1201B
题意:
给 n 个数, 要求两个数同时减去1,问能否将其全部变为0
题解:
当数组总和为奇数时,不能变为0
当数组中最大元素大于 总和减去最大元素的值时,不能变为0
AC代码:C++
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n, ans = 0, maxn = -1;
cin >> n;
for(ll i = 1; i <= n; i++){
ll t;
cin >> t;
if(maxn < t){
maxn = t;
}
ans = ans + t;
}
if(ans % 2 == 0 && maxn <= ans - maxn){
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
return 0;
}
php
<?php
$cin = fopen("php://stdin", "r");
$n = intval(fgets($cin));
$s = fgets($cin);
$a = explode(" ", $s);
$ans = 0;$k = 0;
for($i = 0; $i < count($a); $i++){
$ans = $ans + intval($a[$i]);
$k = max($k, intval($a[$i]));
}
if($ans % 2 == 0 && $k <= $ans - $k){
print_r("YES");
}
else{
print_r("NO");
}
fclose($cin);
?>
C. Maximum Median(思维)
题目链接:codeforces 1201C
题意:
给出一个数组,然后可以给一个或多个数加1,最多加k,求最大的中位数。
题解:
中位数前面的数不用管,如果可以和下一个数齐平,那就一起填上去;如果不够了,那就一起尽量变大
AC代码:c++
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
ll n,k;
ll a[maxn];
int main(){
scanf("%lld%lld", &n, &k);
ll i, j, val;
for(i = 1;i <= n ; i++){
scanf("%lld", &a[i]);
}
sort(a+1,a+1+n);
ll mid = n / 2 + 1, sum = 0;
i = mid + 1;
while(k > 0 && i <= n){
if(k >= (i - mid) * (a[i] - a[i-1])){
k = k- (i - mid) * (a[i] - a[i-1]);
sum += (a[i] - a[i-1]); // 齐平
}
else{
break;
}
i++;
}
if(k > 0){
sum = sum + k / (i - mid); // 如果 k > 0 将k平分给后面的数
}
printf("%lld\n", a[mid] + sum);
return 0;
}
php
<?php
$cin = fopen("php://stdin", "r");
$s = fgets($cin);
$a = explode(" ", $s);
$n = intval($a[0]);
$k = intval($a[1]);
$s = fgets($cin);
$a = explode(" ", $s);
sort($a,SORT_NUMERIC);
$ans = 0;
$mid = intval($n / 2);
for($i = $mid+1; $i < $n; $i++){
if($k >= ($i - $mid) * (intval($a[$i]) - intval($a[$i-1]))){
$k = $k - ($i - $mid) * (intval($a[$i]) - intval($a[$i-1]));
$ans = $ans + (intval($a[$i]) - intval($a[$i-1]));
}
else{
break;
}
}
if($k > 0){
$ans = $ans + intval($k / ($i - $mid));
}
print_r(intval($ans + intval($a[$mid]))."\n");
fclose($cin);
?>