1020 月饼
参考代码:https://www.liuchuo.net/archives/543
“一个人的数学能力可以差到什么地步?”
大概就是我。
看见这个题目,我第一反应是把总售价当成单价,想为什么他不把最贵的月饼全卖完,再卖第二贵的,后知后觉反应过来之后,没想到去算月饼的单价,而是以为这个是什么按照经验得出来的结论,就跟蚂蚁搬家要下雨似的·······¥……¥¥&……%&
贴一段柳神的分析吧,看完简直觉得自己智商被碾压·······这个小学算术题欺负我这个读大学的小同志,实在是不讲武德!

#includeiostream
#includevector
#includealgorithm
using namespace std;
struct MoonCake
{
float price;//总价
float number;//库存
float unit;//单价
};
bool compare(MoonCake m1,MoonCake m2)
{
return m1.unitm2.unit;//按单价从高到低排序
}
int main()
{
int n=0;//种类数
int need=0;//需求量
cinnneed;
vectorMoonCake mooncake(n);
for(int i=0;in;i++)//注意此处是分开输入的总量和单价
{
cinmooncake[i].number;
}
for(int i=0;in;i++)
{
cinmooncake[i].price;
mooncake[i].unit=mooncake[i].pricemooncake[i].number;//总售价库存=单价
}
sort(mooncake.begin(),mooncake.end(),compare);
float result=0.0;
for(vectorMoonCakeiterator it=mooncake.begin();it!=mooncake.end();it++)//迭代器遍历数组
{
if(it-numberneed)//这种月饼的总量大于需求,卖不完
{
result+=needit-unit;//收入就是需求量月饼单价
break;//不需要再看后面的月饼,直接退出循环
}
else
{
result+=it-price; //全卖完这种月饼,盈利就是总售价
}
need=need-it-number;//月饼少了,需求量还没有填完,需要再卖其他品种的月饼
}
printf(%.2f,result);
return 0;
}
看见柳神遍历Vector用的for(i=0;i<n;i++)这种形式,有点疑惑为什么不用迭代器,虽然我知道Vector是数组的替代品,但之前网课老师一直讲的迭代器,emm··········
百度之后,搜到了如下教程:
https://blog.csdn.net/fly_time2012/article/details/78590552
原来Vector有三种遍历方法

方法一是柳神用的

方法二跟我网课老师的差不多,不过他的写法是for(Vector<类型> :: iterator it=XX.begin() ; it!=XX.end() ; it++)

方法三有点新鲜,奇怪的知识增加了。
以及,在百度这个遍历的问题时,我还遇到了另一位码友贴出来的错误。
https://blog.csdn.net/FSC12345655/article/details/102552615

我感觉这个错误很新奇,就找一位很厉害的大神讨论了一下原因。

确实,这样写不会报错。

但是一运行,就会导致程序崩溃·····

大神调试之后的结果:


我自己换到release测试的结果:

之后大神发现,把v.push_back()注释掉,就不会发生段错误。

自己试试,的确如此。

大神的理解是,*如果在push_back之前就i=v.begin()的话,此时i是空指针,后面*i就出错了。
而如果在push_back之后i=v.begin()的话,i得到的是vector内第一个元素的地址,不是空指针,i就没有问题
如果注释了push_back,i得到的是空指针,但是此时i=v.end(),for循环没走,就没有*i,没有访问空指针,就不会段错误


总之,正确的操作是原作者总结的方法:

感谢这几位码友和大神的帮助,今天又是站在巨人的肩膀上仰望远方的一天~~
博客讲述了作者在解决月饼销售优化问题时遇到的思考过程,包括如何计算最大收益和对C++中Vector的不同遍历方式的理解。文中提到错误的Vector遍历方式可能导致程序崩溃,并通过示例解释了原因。文章强调了正确遍历Vector的方法以及在编程中注意空指针的重要性。
&spm=1001.2101.3001.5002&articleId=115276972&d=1&t=3&u=568fd642cd3448209f5bf0c5b66c5502)
3047

被折叠的 条评论
为什么被折叠?



