codeForces #577 (div.2)

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;
    }
} 

 

posted @ 2019-08-06 11:21  Tianwell  阅读(172)  评论(0编辑  收藏  举报