目录
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 个活动的开始时间和结束时间,请设计一个活动安排方案,使得参加的活动数目最多。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
起始时间 | 1 | 3 | 0 | 3 | 5 | 6 | 8 | 8 | 8 | 2 | 2 | 12 |
结束时间 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 17 | 13 | 13 | 14 |
下面是代码:
思路:建立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);
}
}
}