zoukankan      html  css  js  c++  java
  • CF798D 糖果(思维题)

    题目描述:

    题解:

    正确性证明:

    首先因为每两个中b都取大的那个,所以b一定满足条件

    我们着重讨论a:

    举一个有五个数的例子,设排序后有这样一个数列

    a+k4+k3+k2+k1,a+k3+k2+k1,a+k2+k1,a+k2,a (k4,k3,k2,k1均>=0)

    极端情况下我们取

      a+k4+k3+k2+k1,a+k2+k1,a

    剩下

      a+k3+k2+k1,a+k1

    因为 a+k4+k3+k2+k1>k3+k1

    所以 a+k4+k3+k2+k1>(a+k3+k2+k1)-(a+k2+k1)+(a+k1)-a

    所以 (a+k4+k3+k2+k1)+(a+k2+k1)+a>(a+k3+k2+k1)+(a+k1)

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int n;
    struct data{
        ll num;int id;
    }a[100005];
    ll b[100005];
    bool cmp(data x,data y){
        return x.num>y.num;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i].num);
            a[i].id=i;
        }
        for(int i=1;i<=n;i++){
            scanf("%lld",&b[i]);
        }
        sort(a+1,a+n+1,cmp);
        printf("%d
    ",n/2+1);
        printf("%d ",a[1].id);
        for(int i=2;i<=n;i+=2){
            if(b[a[i].id]<=b[a[i+1].id])
                printf("%d ",a[i+1].id);
            else
                printf("%d ",a[i].id);
        }
        return 0;   
    }
  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/HarryPotter-fan/p/11378397.html
Copyright © 2011-2022 走看看