贪心的三道题代码

今天终于把贪心的作业写完了,一下午加一个晚上,终于搞定了两道题,真的是太耻辱了。

 

第一题是猫粮和java币的问题,每个房子里有不同数量的java币,每个房子价值的猫粮也是不一样的,我们要尽可能用最少的猫粮换最多的java币,所以就要关注他们的性价比问题

这里用到的贪心就是把性价比排序,选择最高性价比的房子进行交换。

代码

#include <iostream>
#include<algorithm>
#include <cstdio>
using namespace std;
struct dd
{
    int f;//猫粮
    int j;//java币
    double v;//性价比
} home[1000];
bool cmp(const dd& a,const dd& b)
{
    return a.v>b.v;
}
int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        double ans=0;
        if(m==-1&&n==-1)
            break;
        else
        {
            int i;
            for(i=0; i<n; i++)
            {
                scanf("%d %d",&home[i].j,&home[i].f);
                home[i].v=(home[i].j*1.0)/(home[i].f*1.0);
            }
            sort(home,home+n,cmp);
            int flag=m;
            for(i=0; i<n; i++)
            {
                if(flag>=home[i].f)
                {
                    flag-=home[i].f;
                    ans+=home[i].j;
                }
                else
                {
                    ans+=(double)flag*home[i].j/home[i].f;
                    flag=0;
                }
                if(flag==0)
                    break;
            }

        }
        printf("%.3f\n",ans);
        ans=0;

    }

    return 0;
}

 

 

第二题是今年暑假不ac,这道题我用的是把每个电视节目的结束时间排序,尽量选择结束时间短的看,但是也有用开始时间排序的,但是我现在还想不出来。

代码

 

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct dd
{
    int shart;
    int endd;
} home[105];
bool cmp(dd a,dd b)
{
    if(a.endd==b.endd)
        return a.shart>b.shart;
    return a.endd<b.endd;
}
int main()
{
    int n,i;

    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        for(i=0; i<n; i++)
        {
            scanf("%d%d",&home[i].shart,&home[i].endd);
        }
        sort(home,home+n,cmp);
        int j=home[0].endd;
        int ans=1;
        for(i=1; i<n; i++)
        {
            if(home[i].shart>=j)
            {
                
                ans++;
                j=home[i].endd;

            }

        }
        printf("%d\n",ans);
    }
    return 0;
}

第三题是我今天一直都在卡壳的题,会场安排,最开始也是用的结束时间排的序,每一个活动有一个标记,如果它被安排上了,flag==1,没有就是0,这样的话每一次都要从flag=0的时候开始,要使用很多次循环,可能是算法本身也有问题,A不了。

后来用了开始的时间排序,去找开始时间少的,用一次循环,从最开始看它可不可以被安排,不被安排就单独给它加一个,下一个就看可不可以安排到第一个和第二个,如果都不行再给他单独开一个。。。

一次代码(w)

 

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct dd
{
    int shart;
    int endd;
    int flag;
} home[10050];
bool cmp(dd a,dd b)
{
    if(a.endd==b.endd)
        return a.shart<b.shart;
    return a.endd<b.endd;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d%d",&home[i].shart,&home[i].endd);
        home[i].flag=0;
    }
    sort(home,home+n,cmp);

    int con=0;
    int ans=0;
    while(con<n)
    {
        int j=0;
        for(i=0;i<n;i++)
        {
          if(home[i].shart>=j&&home[i].flag==0)
          {
           //   printf("oooooo\n");
              home[i].flag=1;
              j=home[i].endd;
              con++;
          }
        }
        ans++;
        //printf("iiiiioh");
    }
    printf("%d\n",ans);

    return 0;
}

//这一道题是从网上看的,可能是思路问题,本身找不到错误就是A不了。网上的代码同样不可以。

 

二次代码(A)

 

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct dd
{
    int shart;
    int endd;
} home[10050];
bool cmp(dd a,dd b)
{
    if(a.shart==b.shart)
        return a.endd<b.endd;
    return a.shart<b.shart;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d%d",&home[i].shart,&home[i].endd);
    }
    sort(home,home+n,cmp);
    int j[10050];
    j[1]=home[0].endd;
    int ans=1;
    int k;
    for(i=1; i<n; i++)
    {
        for( k=1; k<=ans; k++)
            if(home[i].shart>=j[k])
            {
                j[k]=home[i].endd;
                break;
            }
        if(k==ans+1)
            j[++ans]=home[i].endd;


    }
    printf("%d\n",ans);
    return 0;
}

第三个题也让我明白了算法的变通,因为老师在讲课的时候说了这个会场安排问题要用,结束的时间排序,我就一昧的用这个方法,就一直也成功不了,后来才知道是本身的想法不对。

 

 

现在也很少有人可以看到这里啦。

大二是一个很神奇的时间段,我活得异常清醒,看见了大一的懵懂,对于初学计算机的困难。就像看去年的我。我也看到了大四的师哥,为了以后的发展奔走,就像看见了以后的我,回忆起从来到这个地方到现在,放松自己给我带来的后果越来越难以承担,不好的习惯,越来越大的差距,我深深的感受到了,却难以改变。我总是记得原来老师说过的一句话,你漏掉的知识,老天总会在一个特定的时间段让你弥补回来,我相信我的这个时间点快要到了。

当助导的前前后后一个月,真的让我清醒了很多,看见了原来看不见的东西,也可能是现在身边的人都开始努力了把,这也是我在这个时间整理这篇文章,打这段字的原因把,我要坚持住这一段热情,别去收回,别去堕落。

 

 

 

                                                                                                                                                       2018.10.17 夜

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值