zoukankan      html  css  js  c++  java
  • 【CodeForces】[659C]Tanya and Toys

    这里写图片描述

    本来是用数组的下标来存储数字
    结果意识到大数存不了
    所以换用数组直接存储
    然后排序后通过二分查找来判断数字是否在数组里

    具体的过程则是考虑 剩余的钱数与数字的关系
    如果钱足以买这个数字的玩具
    则考虑买后剩下的钱能否再买一个其它的玩具
    如果不能
    则需选择一个尽可能最大价值的玩具

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int a[100020];
    int b[100020];
    int al;
    int n,m;
    bool findm(int m) {
        int lt=0,rt=al-1;
        while(lt<=rt) {
            int t=(lt+rt)/2;
            if(m==a[t])
                return true;
            else if(m>a[t]) {
                lt=t+1;
            } else
                rt=t-1;
        }
        return false;
    }
    int findl(int k,int l) {
        int i;
        for(i=l; i>=0; i--) {
            if(findm(i))
                continue;
            else
                break;
        }
        return i;
    }
    int findn(int k,int l) {
        int i;
        for(i=k+1; i<=m; i++) {
            if(findm(i))
                continue;
            else
                break;
        }
        return i;
    }
    int main() {
        while(scanf("%d %d",&n,&m)!=EOF) {
            al=0;
            memset(a,0,sizeof(a));
            for(int i=0; i<n; i++) {
                int t;
                scanf("%d",&a[al++]);
            }
            sort(a,a+al);
            int cnt=0;
            int l=m;
            for(int i=1; i<=l&&m>0; i++) {
                if(findm(i))
                    continue;
                else {
                    if(m>=i) {
                        int tn=findn(i,m);
                        if(tn==m||m-i>=tn) {
                            b[++cnt]=i;
                            m-=i;
                        } else {
                            int t=findl(i,m);
                            b[++cnt]=t;
                            break;
                        }
                    } else
                        break;
                }
            }
            printf("%d
    ",cnt);
            for(int i=1; i<=cnt; i++) {
                printf("%d",b[i]);
                if(i==cnt)
                    printf("
    ");
                else
                    printf(" ");
            }
        }
        return 0;
    }
    

    题目地址:【CodeForces】[659C]Tanya and Toys

  • 相关阅读:
    beautiful number 数位DP codeforces 55D
    最长上升子序列
    0-1背包 codeforces 55 D
    概率DP HDU 4586 play the dice
    水题 不要62 HDU 2089
    抓老鼠 codeForce 148D
    ZOJ 3551 吸血鬼 概率DP
    poj 2151 Check the difficulty of problems 概率DP
    HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
    HDU 1814 模板题 2-sat
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569618.html
Copyright © 2011-2022 走看看