链接:http://codeforces.com/contest/1183/problem/Gf
题目大意:
在使礼物中的糖果数(放入礼物中的糖果的前提是不同种类糖果的数量不同)最多x的多种选择中,其中fi为1糖果数最多为y,输出x,y
分析:
- 【思路一】开始想的是先将每种糖果的总数按从小到大排序,同时若总数相同,再按fi=1的糖果数从小到大排序。但是这样会存在一个问题,就是若总数最大的两种糖果a, b,并且总数都为n,令a中fi为1的糖果数为a1,fi=0的为a0,b中对应为b1,b0,n=a1+a0=b1+b0,假设b1>a1,那么选入礼物中的糖果为b类,a类糖果可以和总数为n-1的糖果c比较,若a1>c1,那么选入礼物中的就是a,依次类推;
然后在sort的自定义比较函数中定义了个cmp()函数如下,结果wa在了第6组数据,后面想了想,sort排序是以快排的思想排序的,而不是上面讲的从两个总数最大的开始比较(一般的排序也不太可能),因此排序不正确。
bool cmp(p& a,p& b)
{
if(a.first==b.first)
// return a.second<b.second;
if(a.second<b.second)
{
if(a.first>0)
a.first--;
return a.first<b.first;
}
else
{
if(b.first>0)
b.first--;
return a.first<b.first;
}
return a.first<b.first;
}
- 【思路二】后面看了这篇题解:https://www.luogu.org/problemnew/solution/CF1183G
是从另一个角度想的,直接中将i从总数n依次遍历到1,然后找出比总数比i大的但没有选中的,找出fi=1最多的种类就是要选择的。说明换个参考系就是不一样,而且思路更加清晰,效率更高。