1.21总结
8:00-12:00
接着昨天的问题 维斯顿的烦劳
-
参考了一篇blog,对动态规划的过程与原理有了一定了解。
https://www.cnblogs.com/kkbill/p/12081172.html
(这篇写的还是比较通俗易懂的) -
但是这道题有一个难点,就是体积带浮点数,直接带进数组下标行不通,不能dp(dp[i],i下标必需是整型);
-
然后想着建立一个结构体,达到能直接使用浮点型的目的,发现没啥用
-
又看了一篇关于背包问题总结的百度文档,有一点启发:
把浮点型转换成整型,*100即可
(题目中给出了精度:modf(V)>=0.01)
大致过程如下:
-
将double v *100赋值给int v1;
-
输入double s[i]的时候,将s[i]*100存入s1[i](整型数组)
-
然后是dp核心部分
for( i=1; i<=k; i++)
{
for( j=v1; j>=s1[i]; j--)
{
dp[j]=max(dp[j],dp[j-s1[i]]+p[i]);
}
}
- 最后输出printf("%.6lf",dp[v1]);
写了 homework
- 整体不是很难,注意考虑时间为0也有价值的特例;
- 最先交了一次,错误50%,然后经过一番断点排错(疯狂printf)
发现
++num[i].ave=num[i].value/num[i].time++出了问题,当初没有强制转换,应该是这样:
num[i].ave=(double)num[i].value/(double)num[i].time; - 再又是对于时间为0的例子要单独考虑,时间为0的话,价值直接加上即可,给ave赋值99999让其排名靠前:
if(num[i].time!=0)
{
num[i].ave=(double)num[i].value/(double)num[i].time;
}
if(num[i].time==0)
{
num[i].ave=999999;
}
- 最后就是写一个简单排序,然后贪心一下累加总价值:
for(i=1; i<=paper_sum; i++)
{
if(time_sum>=num[i].time)
{
time_sum-=num[i].time;
value_max+=num[i].value;
}
else
{
value_max+=time_sum*num[i].ave;
break;
}
}
14:00-16:00
接着昨天的 放牛问题
- 发现用上课讲的模板写,输出结果会比正确值大1;
查阅了一些资料:
https://www.acwing.com/blog/content/31/
https://zhuanlan.zhihu.com/p/195741341 - 了解到有关二分模板的upper_bound()和low_bound问题,前者返回第一个比要查找的数大的的值,后者返回第一个>=要查找的数的值;
因此题设案例按照low_bound写,会输出4而非3;
- 后来又参考了一些blog:
https://blog.csdn.net/qq_40147092/article/details/109284272
把二分写成如下所示,就能ac:
long long int l,r;
l=0;
r=num[n-1]-num[0];
while(l<=r)
{
long long int mid=(r-l)/2+l;
if(check(mid))
{
l=mid+1;
}
else
{
r=mid-1;
}
}
printf("%lld\n",r);
}
回顾这题:二分框架需要选择好,然后就是要弄懂check()部分的原理
19:00-21:00
- 研究了一些高校(c9,top2)的对软件工程培养方案,他们对国际化能力比较重视,很多采用了双语教学(英语上课,英文课本)。
- 然后还有就是比较注重学生的全方位发展,要求学生不只是具备专业课方面的知识;
- 还有是对学生的一些自主发展能力,创新能力,计算思维的看重(包括比较强势的杭电);
- 对实践、实训方面的看重(比如浙大:在大四一整年,学院将帮助学生们联系好实习单位,或者是到国外公司、高校进行长时间带薪实习,提高实干能力。)
- 此外,除了必要的软工核心课程之外,还会设立许多选修课程,让学生结合自己的兴趣,以达到某些领域的专业能力(这一点的话我们学校也有)
总之:英语要好,能力要强(编程实践,学习能力等)、知识面要广