贪心算法之会场安排问题

这类问题的基本思路:把结束时间从小到大排序 temp记录当前结束时间  若下一场的开始时间大于temp 那么temp更新为下一场的结束时间  需要三个数组 一个存开始时间 一个存结束时间 第三个存结束时间排序之后的

尽可能多看电视节目

Input

输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。

Output

对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

Sample Input

12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0

Sample Output

5

#include <iostream>
#include<algorithm>
using namespace std;

int main()
{
    int n,i,a[100],b[100],c[100],d,temp,j;
    while(1)
    {
        cin>>n;
        if(n==0)
            break;
        d=1;
        for(i=0; i<n; i++)
        {
            cin>>a[i]>>b[i];
            c[i]=b[i];
        }
        sort(b,b+n);
        temp=b[0];
        for(i=1; i<n; i++)
        {
            for(j=0; i<n; j++)
            {
                if(c[j]==b[i])
                    break;
            }
            if(a[j]<temp)
                continue;
            else
            {
                temp=c[j];
                d++;
            }

        }
        cout<<d<<endl;
    }

    return 0;
}

最少拦截系统

Description

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

Input

输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

Output

对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.

Sample Input

8 389 207 155 300 299 170 158 65

Sample Output

2

题目分析:尽量少的拦截系统,就从第一个开始用,如果第一个不够用了,另开一个,一次类推,每次还是从第一个开始检查是否可以用。

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    int n,i,d=0,j,k;
    int num1,num2[10000],temp;//num1 当前需要拦截的高度 num2代表拦截系统此时此刻可以拦截的最高高度 需要不断更新 
    while(cin>>n)
    {
        d=1;
        for(k=0; k<n; k++)
        {
           cin>>num1;
           if(k==0)
            num2[0]=num1;
            for(j=0; j<d; j++)
            {
                if(num1<=num2[j])
                {
                    num2[j]=num1;
                    break;
                }
            }
            if(j==d&&num2[d-1]<num1)
            {
                num2[d]=num1;
                d++;
            }
        }

        cout<<d<<endl;
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/sinat_39654987/article/details/81220088