处女座的期末复习-贪心

链接:https://ac.nowcoder.com/acm/contest/327/J
来源:牛客网

快要期末考试了,处女座现在有n门课程需要考试,每一门课程需要花ai小时进行复习,考试的起始时间为bi,处女座为了考试可以不吃饭不睡觉,处女座想知道他能否复习完所有的科目(即在每一门考试之前复习完该科目)。每一门课的考试时间都为两小时。

输入描述:

第一行一个整数n

第二行n个整数a1,a2,…,an,表示每门课需要复习的时间

第三行n个整数b1,b2,…,bn,表示每门课考试的时间

1<=n<=105

0<=a i<=10 9
0<=b i<=10 9

输出描述:

如果处女座能复习完,输出”YES”,否则输出”NO”
示例1

输入

3
0 1 1
2 6 4

输出

YES

说明

在0-1小时复习第2门课,
在1-2小时复习第3门课,
在2-4小时考第1门课,
在4-6小时考第3门课,
在6-8小时考第2门课

备注:

考试时不能复习,保证考试时间不会重叠。

复习可以拆开,只要复习时间够了即可。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
 
/*
复习完所有科目,
考试前复习,
先考的先复习(贪心),
每次考2小时,
可以分开复习,
把空余时间累加,看看考前够不够时间
*/
 
struct f
{
    int ft;
    int idx;
};
f a[100005];
 
struct k
{
    int kt;
    int idx;
};
k b[100005];
 
bool cmp(k x,k y)
{
    return x.kt<y.kt;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            {scanf("%d",&a[i].ft); a[i].idx=i;}
        for(int i=0;i<n;i++)
            {scanf("%d",&b[i].kt); b[i].idx=i;}
        sort(b,b+n,cmp);
        int i;//先考的科目
        int r=b[0].kt-0;//该科考试前空余的复习时间段
        //从某科考试前空余的时间抽出来复习
        for(i=0;i<n;i++)
        {
            int num=b[i].idx;//考试科目
            if(r<a[num].ft)//该科目复习时间不够,gg
                {printf("NO\n");break;}
            else
                r=r-a[num].ft;//否则扣去空余时间
            if( i != (n-1) )
            r=r+( b[i+1].kt-b[i].kt-2 );//加上两场考试之间的空余时间
        }
        if(i==n)
            printf("YES\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/shoulinniao/p/10322409.html