贪心的三道题代码

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

 

第一题是猫粮和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 夜

 

【SCI复现】基于纳什博弈的多微网主体电热双层共享策略研究(Matlab代码实现)内容概要:本文围绕“基于纳什博弈的多微网主体电热双层共享策略研究”展开,结合Matlab代码实现,复现了SCI级别的科研成果。研究聚焦于多个微网主体之间的能源共享问,引入纳什博弈理论构建双层优化模型,上层为各微网间的非合作博弈策略,下层为各微网内部电热联合优化调度,实现能源高效利用与经济性目标的平衡。文中详细阐述了模型构建、博弈均衡求解、约束处理及算法实现过程,并通过Matlab编程进行仿真验证,展示了多微网在电热耦合条件下的运行特性和共享效益。; 适合人群:具备一定电力系统、优化理论和博弈论基础知识的研究生、科研人员及从事能源互联网、微电网优化等相关领域的工程师。; 使用场景及目标:① 学习如何将纳什博弈应用于多主体能源系统优化;② 掌握双层优化模型的建模与求解方法;③ 复现SCI论文中的仿真案例,提升科研实践能力;④ 为微电网集群协同调度、能源共享机制设计提供技术参考。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注博弈均衡的求解过程与双层结构的迭代逻辑,同时可尝试修改参数或扩展模型以适应不同应用场景,深化对多主体协同优化机制的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值