这道题在我心里是一道不错的题,虽然没有用到什么难度较大的算法,但是一些细节和思维方面的问题还是值得注意的。
题意:有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的数据范围就可以感受到题目的用意。