20级课程作业-贪心算法 做题总结(三)

Y
题意:给出工厂每天加工每个奶酪需要的价格,以及每天的需求量,奶酪可以存放在仓库里,给出每个奶酪存放一天需要的价格,问,这些生产任务全部完成,最少的花费多少

这道题题干看了好久我才看懂,不过思路比较明确,每天的奶酪的花费要么是前一天提前做加放在仓库里的价格,要么是当天做的价格,想的比较简单,后来和同学讨论了一下,举了几个例子,发现每天的奶酪花费也不一定是前一天做,可能提前好几天做,而放在仓库里的花费非常小,这样也有可能让花费最少,于是就写了两个代码,结果两个都通过了,想了好久也没有想明白第一个思路为什么能过题,后来觉得应该是每一步都取了最优,所以最后结果是最优(欢迎指正),下面把两个代码都放在这里

#include<iostream>
using namespace std;
struct n
{
    
    
    int c,f;
} a[10005];
int main()
{
    
    
    long long int n,s,i,sum=0;
    cin>>n>>s;
    for(i=0; i<n; i++)
        cin>>a[i].c>>a[i].f;
    sum=a[0].c*a[0].f;
    for(i=1; i<n; i++)
    {
    
    
       if(a[i].c*a[i].f>(a[i-1].c+s)*a[i].f)
       {
    
    
           sum+=(a[i-1].c+s)*a[i].f;
       }
       else sum+=a[i].c*a[i].f;
    }
    cout<<sum<<endl;
    return 0;
}
#include<iostream>
using namespace std;
struct n
{
    
    
    int c,f;
} a[10005];
int main()
{
    
    
    long long int n,s,i,sum=0,m;
    cin>>n>>s;
    for(i=0; i<n; i++)
        cin>>a[i].c>>a[i].f;
    sum=a[0].c*a[0].f;
    m=a[0].c;
    for(i=1; i<n; i++)
    {
    
    
        if(a[i].c*a[i].f>(m+s)*a[i].f)
        {
    
    
            sum+=(a[i-1].c+s)*a[i].f;
            m=m+s;
        }
        else {
    
    
            sum+=a[i].c*a[i].f;
            m=a[i].c;
        }
    }
    cout<<sum<<endl;
    return 0;
}

M

题意:用6 * 6的箱子装给定数量的1 * 1,2 * 2,3 * 3,4 * 4 ,5 * 5,6 * 6的箱子,计算最少需要用多少个6*6的箱子才可以将所有的箱子都装进去。

典型的找规律题,如果装满一整箱有一下几种方式
一个66
一个5
5 11个11
一个4
4 5个22
一个3
3 5个22 7个33
两个33 3个22 6个11
三个3
3 1个22 5个11
九个22
36个1
1
然后我就每个方式都分析了一遍,从6*6开始,每次都按1和2的空缺情况把1 * 1和2 * 2相应减去,但是因为没有考虑每种方式可能出现2减为0,需要把剩余的空缺2转1的情况,结果错了,如果再对每一种情况的增加分析,虽然能做但代码太长,于是就换了一种处理方式,先把每次1和2的空缺情况个数记录下来,最后依次比较2和1,这样写就稍微简单一点。
以下是错解和正解,可对比分析
正解:

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    
    
    int a[7];
    while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
    {
    
       if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
            break;
        int sum=0,y=0,r=0;
        sum=a[6]+a[5]+a[4]+ceil(double(a[3]*1.0/4));
        y+=11*a[5];
        r+=5*a[4];
        if(a[3]%4==1)
        {
    
    
            y+=7;
            r+=5;
        }
        else if(a[3]%4==2)
        {
    
    
            y+=6;
            r+=3;
        }
        else if(a[3]%4==3)
        {
    
    
            y+=5;
            r+=1;
        }
        if(a[2]>r)
        {
    
    
            sum++;
            a[2]-=r;
            while(a[2]>9)
            {
    
    
                sum++;
                a[2]-=9;
            }
            y+=36-4*a[2];
        }
        else y+=(r-a[2])*4;
        if(a[1]>y)
        {
    
    
            a[1]-=y;
            sum+=ceil(double(a[1]*1.0/36));
        }
        cout<<sum<<endl;
    }
    return 0;
}

错解

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    
    
    int a[7];
    while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
    {
    
       if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
            break;
        int sum=0,y=0,r=0;
        sum=a[6]+a[5]+a[4]+ceil(double(a[3]*1.0/4));
        y+=11*a[5];
        r+=5*a[4];
        if(a[3]%4==1)
        {
    
    
            y+=7;
            r+=5;
        }
        else if(a[3]%4==2)
        {
    
    
            y+=6;
            r+=3;
        }
        else if(a[3]%4==3)
        {
    
    
            y+=5;
            r+=1;
        }
        if(a[2]>r)
        {
    
    
            sum++;
            a[2]-=r;
            while(a[2]>9)
            {
    
    
                sum++;
                a[2]-=9;
            }
            y+=36-4*a[2];
        }
        else y+=(r-a[2])*4;
        if(a[1]>y)
        {
    
    
            sum++;
            a[1]-=y;
            sum+=ceil(double(a[1]*1.0/36));
        }
        cout<<sum<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_51443397/article/details/115257609