codeforces732D Exams(贪心+二分)

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/define_danmu_primer/article/details/53114508

##题意
不可描述
##思路
二分答案,贪心判断
##代码

/* ********************************
Author			: danmu
Created Time	: 2016年11月10日 星期四 10时19分02秒
File Name		: a.cpp
******************************** */

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <list>
#include <map>
#include <set>

#define rep(i,x,y) for(int i=x;i<=y;++i)
#define _rep(i,x,y) for(int i=x;i>=y;--i)
#define CL(S,x) memset(S,x,sizeof(S))
#define CP (S1,S2) memcpy(S1,S2,sizeof(S2))
#define ALL(x,S) for(x=S.begin();x!=S.end();++x)
#define ULL unsigned long long
#define PI 3.1415926535
#define INF 0x3f3f3f3f
#define LL long long

const int maxn = 1e5;
const int mod = 1e9 + 7;
const double eps = 1e-8;

using namespace std;
int a[maxn+5],b[maxn+5];
bool flag[maxn+5];
int n,m;
bool judge(int x){
	LL tmp=0;
	memset(flag,0,sizeof flag);
	for(int i=x;i>=1;--i){
		if(b[i]&&!flag[b[i]]){
			tmp+=a[b[i]];
			flag[b[i]]=true;
		}
		else if(tmp>0) --tmp;
	}
	for(int i=1;i<=m;++i)
		if(!flag[i])
			return false;
	printf("%d %lld\n",x,tmp);
	if(tmp>0) return false;
	return true;
}
int main(){
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int l,r,mid;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",b+i);
	for(int i=1;i<=m;++i)
		scanf("%d",a+i);
	l=0,r=n+1;
	while(r-l>1){
		mid=(l+r)>>1;
		if(judge(mid))
			r=mid;
		else
			l=mid;
	}
	printf("%d\n",r==n+1?-1:r);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/define_danmu_primer/article/details/53114508