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;   
    }
  • 相关阅读:
    CF Round #427 (Div. 2) C. Star sky [dp]
    顺时针打印矩阵
    堆 栈-相关知识【转】
    二叉树的镜像
    树的子结构
    合并两个排序的链表
    数值的整数次方
    位运算:二进制中1的个数
    斐波那契数列及其变形
    重建二叉树
  • 原文地址:https://www.cnblogs.com/HarryPotter-fan/p/11378397.html
Copyright © 2011-2022 走看看