acm第三周学习报告

感触:

总的来说,这周让我记忆最深刻的就是刚上课时,老师没有给我们讲知识,而是讲我们的学习态度,对我记忆最深的就是,学这个是看你想要达到什么目的,你是奔着什么目的去学的,当时我的想法是学习掌握一门新知识,为自己增添实力,可是我的做法就是如同混日子一样,做题也不怎么刻苦钻研,实在想不出来了就去看题解,然后轻轻松松的写出来。
可是经过老师的点醒,我好像就突然之间感觉自己的行为是错的,是无法获得应有的知识的,只有自己亲手写出来的题目,才代表真的是自己掌握的,所以我特别想感谢费老师每次讲课之前对于我们的教诲。

学习贪心算法:

一开始学习时,我也是懵懵的,老师说贪心算法和递归很相似,可是我怎么看也没看出来相似,看别人的解释也没看明白,后来只能自己不断理解,终于发现,贪心其实也是很好理解,就是找到最好的方法把这个题解出来就完事了呗。由于自身的水平没有达到,所以我就只是做校园的oj网站上的题目。我本周做的记忆最深的就是金银岛这个题目,虽然他比较简单,但是也是耗费我一晚上的时间,没有查看任何的题解,还顺便复习了一下近期掌握不扎实的内容,可以说对我有着特别的意义

题目:

某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1, n2, … , ns,同时每个种类的金属总的价值也不同,分别为v1,v2, …, vs。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。
输入:
第1行是测试数据的组数k,后面跟着k组输入。

每组测试数据占3行,第1行是一个正整数w (1 <= w <= 10000),表示口袋承重上限。第2行是一个正整数s (1 <= s <=100),表示金属种类。第3行有2s个正整数,分别为n1, v1, n2, v2, … , ns, vs分别为第一种,第二种,…,第s种金属的总重量和总价值(1 <= ni <= 10000, 1 <= vi <= 10000)。
输出:
k行,每行输出对应一个输入。输出应精确到小数点后2位。
思路:这道题的贪心策略,是比较明显的,就是尽可能带走价值高的呗,而题目中又提及金属是可以被任意分隔的,所以,我们很容易就可以用一个性价比来进行求解,这样也就避免的质量等带来的问题,只要把性价比排序,大的先拿,拿到装不下就可以
以下就是我写的代码

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
struct jinyin//在这里先定义一个结构体,代表其各个属性,而且排序时,其各个属性是在一起的,就不用担心排完序紊乱了
{
    long int weight;
    long int value;
    double x;
}a[105];
struct xiaoshu
{
    long double wei;
    long double va;//这一步其实比较多余,主要是怕题目让输入的可能只是int型,所以又另外定义了一个double型来转换
}b[105];
bool cmp(jinyin a,jinyin b)
{
    if(a.x>b.x)
    {
        return true;
    }
    return false;
}//定义的排序函数
int main()
{
    int n,w,i,m,j;
    double s[10000];
    cin>>n;
    for(j=0;j<n;j++)
   {
       cin>>w>>m;
       for(i=0;i<m;i++)
       {
           cin>>a[i].weight>>a[i].value;
           b[i].wei=a[i].weight;
           b[i].va=a[i].value;
       }
       for(i=0;i<m;i++)
       {
           a[i].x=b[i].va/b[i].wei;
       }
       sort(a,a+m,cmp);
       for(i=0;i<m;i++)//这里即为贪心策略,排完序后,大的先加入,小的后加入,
 {if(a[i].weight<=w)
        {s[j]+=a[i].x*a[i].weight;//如果小于承重,就直接乘上其质量
        w-=a[i].weight;}//承重量在相应的减去
       else
        {
            s[j]+=a[i].x*w;break;}}}//这一步的时候承重量已经为0,故结束循环
        for(j=0;j<n;j++)
        {cout<<fixed<<setprecision(2)<<s[j]<<endl;}


    return 0;
}

这个题目可以说是让我对sort函数的用法有了一定的了解,之前总是听老师讲,但是自己确实没用过,也不明白这个函数有什么用,可以说,这个题目给我的价值除了建立了学习的自信外,更重要的就是学会了使用sort函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值