CF346div2-C题(买玩具)

这里写图片描述

这道题在我心里是一道不错的题,虽然没有用到什么难度较大的算法,但是一些细节和思维方面的问题还是值得注意的。

题意:有10的九次方种玩具,编号是1~10的九次方,每个玩具的价格就等于他的编号,然后Tanya想要收集这些玩具,她已经有n种玩具了,有m元钱,问最多能有多少种不一样的玩具。
其中1≤n≤100000,1≤m≤10的九次方。
输入是n,m,然后n个数,每个数1≤m≤10的九次方。

AC代码之一

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<algorithm>

bool havetype[99999999];//bool类型的数组占得内存要少一些,不容易Memory limit exceeded
//这是八个9,距离10的九次方还有很大的距离,但是实际上这个题是数据的问题,这个方法还是有一定问题的。


int main()
{
    long long n, m;
    while (cin >> n >> m)
    {
        vector<int>buy;
        int num = 0;
        int i;
        memset(havetype, 0, sizeof(havetype));
        for (i = 0; i < n; i++)
        {
            int num;
            cin >> num;
            if (num >= 999999999)
                continue;//超过数据范围就不存了,不然会runtime error
            havetype[num]=1;
        }
        for (i = 1; i <= m; i++)
        {
            if (m < 0)
                break;
            if (havetype[i] == 0)
            {
                m = m - i;
                buy.push_back(i);
            }
        }
        cout << buy.size() << endl;
        for (i = 0; i <buy.size(); i++)
            cout << buy[i] << " ";
        cout <<endl;
    }
    return 0;
}

AC代码之二
个人感觉更正确的一种算法。

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<algorithm>

long long havetype[100007];//数组不需要开那么大了,这次是n的范围


int main()
{
    long long n, m;
    while (cin >> n >> m)
    {
        vector<int>buy;
        int i;
        for (i = 1; i <=n; i++)
            cin>>havetype[i];

        sort(havetype + 1, havetype + 1 + n);//排序,贪心所需要的

        int j;

        for (j=1,i = 1;; j++)
        {
            if (havetype[i] != j)
                if (m < j)
                    break;
                else
                {
                    m -= j;
                    buy.push_back(j);
                }
            else
            if(havetype[i] == j&&i<=n)
            {
                j = havetype[i];
                i++;
            }           
        }//这一段逻辑比较好,仔细琢磨一下,哈哈。
        cout << buy.size() << endl;
        for (i = 0; i <buy.size(); i++)
            cout << buy[i] << " ";
        cout << endl;
        //另外,没有哪个题目会因为输出的一行数据最后一个有一个空格再换行而判成wrong answer的
        //不要乱写,这种for循环要考虑一下0,不然还是rutime error
    }
    return 0;
}

其实这个题目从给的n,m的数据范围就可以感受到题目的用意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值