B. Zero Array
题意:给出一个长为N的序列然后,每次能对序列中任意两个不相同的值同时减1,判断最后能否将全部减为0
思路:一开始毫无疑问可以想到,要把序列减为0,总值必须为偶数。其次,就是要避免最后减完后还余留某个值(自身不能够相减),即将所给序列先sort一边然后判断最大的是否大于总值的1/2;
题解:
#include <cstdio> #include <iostream> #include <string> #include <algorithm> #include <cstring> #define ll long long using namespace std; const int maxn = 1e5; ll ans; int arr[maxn]; bool cmp(int a,int b){ return a>b; } int main(){ int n; while(cin>>n){ int tmp; ll ans = 0; for(int i=0;i<n;i++){ cin>>arr[i]; ans += arr[i]; } sort(arr,arr+n,cmp); if(ans%2) cout<<"NO"<<endl; else if(2*arr[0]>ans){ cout<<"NO"<<endl; } else cout<<"YES"<<endl; } }
C. Maximum Median
题意:给出一个奇数序列经过m次操作使它的中位数尽可能最大
思路:真的是想多了,一开始想着离散化处理 统计个数乘以差值来一段一段减快一些。结果一直TLE或者WA
回到最简单的思路就应该是一个一个的减去更新
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long long using namespace std; const int maxn = 2e5+10; ll arr[maxn]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; ll m; while(cin>>n>>m){ for(int i=0;i<n;i++){ cin>>arr[i]; } sort(arr,arr+n); int mid = n/2; if(arr[mid]+m < arr[mid+1]){ cout<<arr[mid]+m<<endl; continue; } int t = 1; ll ans = arr[mid]; for(int i=1;mid +i<n;i++){ if(m -(arr[mid+i]- ans)*i <0){ break; } t = i+1; m -= (arr[mid+i]-ans)*i; ans = arr[mid+i]; } cout<<ans+(m/t)<<endl; } }