10.13 山东多校联测模拟赛小记
149pts,60-65-8-16,rank36/108,被您们吊打。
T1 写的其实假了,小细节没处理好,数组开小了。所以在找到错因后还挺惊讶的,狠狠的嘲讽数据()。
一开始想的 dp,后来发现不太对,可以写二分判断。
为什么不能直接求,因为不能确定挑战的顺序。二分 check 的时候可以倒着贪心的处理。大概是这样。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,ans;
int flagg=0;
int a[N],s[N];
int vis[N];
bool check(int x){
memset(vis,0,sizeof vis);
int cst=0,v=0,flag=0;
for(int i=x;i>=1;i--){
if(s[i]) flag=1;
if(s[i]&&!vis[s[i]]){
if(i<=a[s[i]]) return 0;
cst+=a[s[i]];
vis[s[i]]=1;
}
else if(flag) v++;
}
for(int i=1;i<=m;i++) if(!vis[i]) return 0;
if(cst<=v){flagg=1;return 1;}
return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&s[i]);
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
if(!flagg) puts("-1");
else printf("%d",ans);
}
本文作者:Moyyer_suiy
本文链接:https://www.cnblogs.com/Moyyer-suiy/p/17763218.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步