杭电2037

来源:互联网 发布:北京环鼎铭阳网络 编辑:程序博客网 时间:2024/05/20 09:21

本题是一道贪心算法的题目,这是属于贪心重的选择不相交区间,具体的内容这里不提,就讲下这道题的解题思路。

解决这类问题第一步排序,对时间的开头与结尾储存用两个数组分别a[ i ] , b[ j ]表示,对b[ j ]进行从小到大的排序,当对b数组进行排序时,对应的a也发生变化。当两个b相等时,根据a的大小对b进行排序。对b排好后,用b[j]与b[j]后的每个a[i]进行比较,如果a[i]>=b[j]时,就用一个变量几下,并且用该a[i]对应的b[j]替换原来的b[j]。经过一个for循环就可以得到结果了


我是新手

如果有错误,欢迎吐槽。

#include<stdio.h>int main(){    int a[105],b[108];    int i,j,k,n,m,t,L,q;    while (scanf("%d",&n) != EOF)    {        if (n==0)break;        L=0;        for (i=1; i<=n; i++)        {            scanf("%d%d",&a[i],&b[i]);        }                for (i=1; i<=n; i++)        {            for (j=i+1; j<=n; j++)            {                if(b[i]>b[j])                {k=b[i];                b[i]=b[j];                b[j]=k;                                t=a[i];                a[i]=a[j];                a[j]=t;                }                else                if (b[i]==b[j])                if (a[i]>a[j])                {                k=b[i];                b[i]=b[j];                b[j]=k;                                t=a[i];                a[i]=a[j];                a[j]=t;                }            }        }            q=b[1];L=1;        for (i=2; i<=n; i++)        {             if (a[i]>=q)             {                L++;                q=b[i];              }        }    printf("%d\n",L);            }    return 0;} 

0 0
原创粉丝点击