CodeForces - 732D Exams(二分+贪心)
2017-08-25 09:40
337 查看
CodeForces - 732D Exams(二分+贪心)
题意:要在n天内通过m科考试,考每一科目是,都必须要有一定的准备时间,准备时间可以不连续,给出n天内每一天可以考的科目,输出最少需要多少天才能通过所有的科目。
思路:对需要多少天才能通过所有科目进行二分,关键是如何判断在这些天是否能通过所有科目的考试,贪心来求,从后向前遍
历,因为越往后这一科目准备的时间就越长,当遇到没有考的科目所需准备所有考试的天数need就加上这一科目需要准备的时间,
当在这一天考试的科目已考完或者不能进行考试时,就可以准备考试了,所以need-1,最后判断所有科目是否都考过和need是否为
0就行了
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <string> #include <vector> #include <queue> #include <stack> #include <set> #include <map> using namespace std; const int MAXN=100005; int a[MAXN],d[MAXN]; bool vis[MAXN]; int n,m; bool pass(int num) { for(int i=1;i<=m;i++) vis[i]=false; int need=0; for(int i=num;i>=1;i--) if(!vis[a[i]]&&a[i]) { need+=d[a[i]]; vis[a[i]]=true; } else if(need>0) need--; for(int i=1;i<=m;i++) if(!vis[i]) return false; if(!need) return true; return false; } int main(void) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d",&d[i]); int l=1,r=n; int mid; int ans=-1; while(l<=r) { mid=(l+r)/2; if(pass(mid)) { r=mid-1; ans=mid; } else l=mid+1; } printf("%d\n",ans); return 0; }
相关文章推荐
- Codeforces 373C Counting Kangaroos is Fun 二分+贪心
- Codeforces 825D Suitable Replacement - 贪心 - 二分答案
- Codeforces 479D Long Jumps(贪心+二分)
- CodeForces - 551C (二分查找答案+贪心)
- Codeforces 831D Office Keys 二分+贪心
- codeforces 732D Exams 二分搜索 贪心
- Codeforces 732D [二分 ][贪心]
- Codeforces 363D - Renting Bikes(贪心二分)
- Codeforces 609D 贪心+二分
- Codeforces_732D_(二分贪心)
- Codeforces 460C Present (贪心 + 二分)
- CodeForces 589F -- F. Gourmet and Banquet (二分 + 贪心)
- CodeForces - 344E Read Time && CodeForces - 830A Office Keys 二分+贪心
- CodeForces - 363D Renting Bikes (二分+贪心)
- CodeForces 551 C. GukiZ hates Boxes(二分+贪心)
- CodeForces - 363D Renting Bikes 二分+贪心
- CodeForces-729C-Road to Cinema(二分查找 贪心 排序)
- 【二分答案 && 贪心】codeforces-847E Packmen
- codeforces 343C Read Time 二分 + 贪心
- CodeForces 201 E.Thoroughly Bureaucratic Organization(贪心+二分+鸽巢原理)