第一次阶段性机试的反思:
约瑟夫环暴露的问题:
1.对平时作业题目的重视程度不够,总想着做完却没有学习他人的思维,没有认真想清楚正确的逻辑。
2.考试时紧张,脑子不清晰,逻辑混乱。与其在那乱七八糟添加代码,还不如先暂时沉下心来好好想想代码实现的过程是什么样的。多思考,而不是盲目上机敲。
#include <stdio.h>
int n,k,alive[501],pos;//这种方法用了取反,也就是我们假定死亡为1,生存为0.同时,直接做的最重要思路就是:只要加了pos,我就一定要去检查是否溢出(因为没有除法限制)
int main(){
pos=0;//为什么取0?因为可以想象是第0个人被杀后从第一个才开始报数,这与后面的逻辑一致。
scanf("%d %d",&n,&k);
for(int i=1;i<n;i++){//杀n-1个人
for(int j=1;j<=k;j++){
pos++;
if(pos>n)pos=1;//只要位置变动,变一个立马判断
while(alive[pos]){
pos++;
if(pos>n)pos=1;//同上
}
}
alive[pos]=1;
}
for(int i=1;i<=n;i++){
if(!alive[pos])printf("%d",pos);
}
return 0;
}
三只小猪暴露的问题:
1.对异或运算如何实现没有在纸上想清楚,还是一样,没有思考好就不要上机敲!哪怕用其他方法实现也不要用脑子还是一团浆糊的东西。
2.没有注意到数据的大小,及时采取适合的实现方式。本题数据范围很小,所以可以直接逐一点进行分析。
LC264丑数:
用构造的方法,从1开始往后构造丑数。(每一个数的最大质因子。例如:4的最大质因子是2,那就可以乘以2 3 5 避免重复)
采用一个小顶堆,去维护整个堆最小值。
class Solution {
public:
int nthUglyNumber(int n) {
set<long long>s;
s.insert(1);
for(int i=1;i<n;i++){
long long a=*s.begin();
s.erase(s.begin());
s.insert(2*a);
s.insert(3*a);
s.insert(5*a);
}
return *s.begin();
}
};
评价一下:为什么可以直接做,不用管生成重复的数据呢?因为set元素会自动帮你去重。当然,老师的方法也值得学习,特别是对switch的巧妙运用:
HZ284超市卖货:
1.将所有商品按照过期日期d从小到大牌序。
2.维护一个最优方案的集合。 将当前商品的过期日期d和集合中元素的数量n比较。如果过期日期d>n,就直接加入。如果d=n,我们就将利润p与集合中最小利润进行比较,以利润作 为是否插入的依据。d不可能小于n。因为已经对商品排序了。
//todo:本题要使用到运算符重载,超纲,先暂时跳过。