链接:https://ac.nowcoder.com/acm/contest/327/J
来源:牛客网
快要期末考试了,处女座现在有n门课程需要考试,每一门课程需要花ai小时进行复习,考试的起始时间为bi,处女座为了考试可以不吃饭不睡觉,处女座想知道他能否复习完所有的科目(即在每一门考试之前复习完该科目)。每一门课的考试时间都为两小时。
输入描述:
第一行一个整数n
第二行n个整数a1,a2,…,an,表示每门课需要复习的时间
第三行n个整数b1,b2,…,bn,表示每门课考试的时间
1<=n<=105
0<=ai<=109
0<=bi<=109
输出描述:
如果处女座能复习完,输出”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 ");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 "); } return 0; }