[Day.1]贪心算法

目录

背景:

正文:

贪心算法能解决的问题:

思路:

那如果我们要知道可以参加哪些活动怎么办???

Love is worth years.❤热爱可抵岁月漫长。


背景:

作为一名刚转专业到软件工程的菜鸡小白,只是简单的知道一些基础的c语言的编程语言,第一次听到ACM,然后抱着试一试的求虐心态就参加了校内举办的ACM的选拔赛,3个小时!!一共九道题,我就做出了一道!!没接触过算法的我,通过一个安排活动问题第一次听说了贪心算法,这个名词,而且有好多做出来两道的同学就是做出来的,我做的最简单的那道和贪心算法的那道题。所以我决定今天开始我的算法学习之路!!!!先从贪心算法开始!

正文:

贪心算法:贪心贪心,就是贪,从来不从全局考虑而是做当前最好的选择!当然一个个当前最好的选择可能就构成了最完美的整体最优解。比如你找女朋友,要是每次都考虑钱,钱省下来了,但女朋友没了。所以=。=贪心算法不是万能的他只能解决一些特定的问题。

贪心算法能解决的问题:

1.背包问题

2.活动时间安排的问题(我不会的那个题今天先重点研究这个)区间 问题

3.线段覆盖问题(lines cover)

4.数字组合问题

5.最小生成树(克鲁斯卡尔算法)

思路:

好好好,算法贪心我可不能贪心先用c活动时间问题解决!

假设某同学某一天要参加n个活动 E = {1, 2, 3 … n},其每个活动 i 都有起始时间 si 和结束时间 fi, 且有 si < fi。若区间(si,fi)和(sj,fj)不相交,则称活动 i 与活动 j 是相容的。现在给定 n 个活动的开始时间和结束时间,请设计一个活动安排方案,使得参加的活动数目最多。

123456789101112
起始时间1303568882212
结束时间4568910111217131314

下面是代码:

思路:建立sort函数利用其先对结束时间进行排序。

void sort (int s[],int f[],int n);
void sort (int s[],int f[],int n)
{
    int j,i,t;
    int a[n];
    for (i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(f[j]<f[i])
            {
                t=f[i];f[i]=f[j];f[j]=t;
            }
        }
    }
     

排完序以后哩就要进行“贪心”了!! 下面是关于贪心算法的代码:

      g=1;/*默认第一个是选入的*/
        count=1;
    for(i=1;i<n;i++)
        if(a[i]>=b[g])
    {
        count++;
        g=i;
    }/*让其的开始时间大于等于结束时间的活动入选,也可以用函数完成*/

完整代码如下:

#include <stdio.h>
void sort (int s[],int f[],int n);
void sort (int s[],int f[],int n)
{
    int j,i,t;
    int a[n];
    for (i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(f[j]<f[i])
            {
                t=f[i];f[i]=f[j];f[j]=t;
            }
        }
    }
}
int main()
{
    int m,i,n,g,count;

    printf("请输入活动个数:");
    scanf("%d",&n);
    int a[n],b[n];
    printf("请依次输入%d个活动的开始时间和结束时间:",n);
      for(i=0;i<n;i++)
        {
              scanf("%d %d",&a[i],&b[i]);
        }
    sort(a,b,n);
        g=1;/*默认第一个是选入的*/
        count=1;
    for(i=1;i<n;i++)
        if(a[i]>=b[g])
    {
        count++;
        g=i;
    }/*让其的开始时间大于等于结束时间的活动入选,也可以用函数完成*/
    printf("小明没有分身术还能参加的活动的个数是:%d",count);/*这样就可以知道小明还可以参加多少活动了!*/
        return 0;
}

这样我们就可以知道小明能参加多少二课活动了!!!

那如果我们要知道可以参加哪些活动怎么办???

可以用一个计数数组跟着它的变化而变化如下代码:

#include<stdio.h>
void sort (int *a,int *num,int *s,int n);
void sort (int *a,int *num,int *s,int n)
{
    int i,j,t,t1,t2;
    for(i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];a[j]=a[j+1];a[j+1]=t;
                t1=num[j];num[j]=num[j+1];num[j+1]=t1;
                t2=s[j];s[j]=s[j+1];s[j+1]=t2;
            }
        }
    }
}
int main ()
{
    int n,m,st,ed;
    scanf("%d",&n);
    int start[n],end[n],num[n];
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%d %d",&start[i],&end[i]);
        num[i]=i;
    }
    sort(end,num,start,n);//降序排列数组

    ed=end[0];
    printf("%d",num[0]+1);
        for(i=1;i<n;i++)
    {
        if(start[i]>=ed)
        {
            ed=end[i];
            printf(",%d",num[i]+1);
        }
    }
}

Love is worth years.
热爱可抵岁月漫长。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYzByZQ==,size_20,color_FFFFFF,t_70,g_se,x_16

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c0re

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值