732D Exams
来源:互联网 发布:5g网络手机 编辑:程序博客网 时间:2024/05/02 01:11
题目链接:
http://codeforces.com/problemset/problem/732/D
题解:
题目大意:
给出两个数组,一个大小为n,一个大小为m,前者num1[i]表示的是在哪天可以考试(如果上面为0,则这天复习,如果为1,则表示你可以选择咸鱼,复习,考试),后面的数组表示第几门考试如果想要通过需要的复习的最少时间。问你最小需要几天才能将所有考试通过。
一开始的思想是暴力(自己感觉要两个for),但是时间是1e5(n^2),会直接超时,所以,优化一下,用二分。然后的问题就是要怎么解决二分的区间是不是满足了条件,这里的话,我们可以这么处理,从后面往前面进行搜索,如果这天有考试,并且这场考试我们还没有标记过,就把sum+=time,如果这天的考试已经标记过了或者是0的时候,就直接sum–。这样,到全部完成的时候,如果sum>0,就表示我们的所选定的区间不够大, 所以要将区间扩大,不然就缩小,最后一定会找到一个刚好的。
自己的二分算法比较烂,边界处理有点问题,一直wa在一个案例上,最后看了网上大神的代码才过的题目。(还是要好好学习!!!)
代码:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm> using namespace std;#define met(a,b) memset(a,b,sizeof(a))#define inf 0x3f3f3f3fconst int maxn = 1e5+10;int day[maxn],need[maxn];bool pass_text[maxn];int n,m;int check(int mid){ int cnt=m; int sum=0; met(pass_text,false); for(int i=mid;i>=1&&cnt>0;i--) { if(day[i]==0||pass_text[day[i]]) { if(sum>0) sum--; } else { if(sum+need[day[i]]>=i) return false; pass_text[day[i]]=true; sum+=need[day[i]]; cnt--; } } if(cnt>0) return false; return true;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&day[i]); for(int i=1;i<=m;i++) scanf("%d",&need[i]); int left=1,right=n,mid=0; while(left<=right) { mid=(left+right)>>1; if(check(mid)) right=mid-1; else left=mid+1; } if(left>n) printf("-1\n"); else printf("%d\n",left);}
0 0
- codeforces 732D Exams
- Codeforces 732D-Exams
- Codeforces 732D. Exams
- CodeForces 732D Exams
- codeforces 732D Exams
- 732D Exams
- CodeForces 732D Exams
- CodeForces 732D Exams
- CodeForces 732D Exams
- codeforces-732D-Exams(二分)
- 【37.50%】【codeforces 732D】Exams
- CodeForces 732D - Exams(二分)
- codeforces 732D Exams(贪心+二分)
- codeforces 732D Exams 二分搜索 贪心
- Codeforces 732D Exams【二分+贪心】
- CodeForces 732D Exams 二分+贪心
- codeforces - 732D Exams 【二分 + 贪心】
- CodeForces 732 D.Exams(二分+贪心)
- GC java垃圾回收机制
- linux之定时任务,sed+awk
- 生成式模型(generative) vs 判别式模型(discriminative)
- Java操作PDF报表-iText的使用
- 人工智能—状态空间法(state space)[三]
- 732D Exams
- Android使用高德地图生成发布版安全码SHA1
- 《MyEclipse2015破解过程》
- 2.1
- 【Java】五种常见排序之----------------------插入排序
- C# Application.DoEvents
- 完全覆盖 II 之状态压缩
- 关于android RTP驱动的问题
- Crunch字典生成器的使用