第一条题解!!!
2026-10-11 14:08:42
发布于:上海
7阅读
0回复
0点赞
原题链接:A94811.abc245C - Choose Elements
因为我的脑子在大多数情况下是一坨浆糊,所以想到的解法也会较朴素
题目的要求就是说要求X中的第i项元素必须从A的第i项和B的第i项中选出,所以当X的第i项无法从A和B中选出使得:
Ai或Bi减去X的第i-1项(也就是A的第i-1项或B的第i-1项)的绝对值大于K时,就直接输出No
不难看出当前的选择是否合法只取决于上一项的Ai-1,Bi-1,所以直接上代码
#include<bits/stdc++.h>//万能头~
using namespace std;
int N,cnt;//cnt判断第i次选择是否能至少选出一个合法的Xi
long long K,A[200010],B[200010],dp[200010][3];//dp[i][j]表示第i次选择,j=1,表示选A[i],j=2,表示选B[i]
int main(){
cin>>N>>K;
for(int i=1;i<=N;i++){
cin>>A[i];
}
for(int i=1;i<=N;i++){
cin>>B[i];
}
dp[1][1]=A[1],dp[1][2]=B[1];//初始化,第1次选择没有限制
for(int i=2;i<=N;i++){
cnt=0;//初始化
if(dp[i-1][1]){//判断上一次X是否可以选择A的元素
if(abs(dp[i-1][1]-A[i])<=K||abs(dp[i-1][2]-A[i])<=K){
dp[i][1]=A[i];
cnt++;//合法方案加1
}
}
if(dp[i-1][2]){//判断上一次X是否可以选择B的元素
//(不知道是Acgo数据太水还是原网站就这样)删去这两个判断也能过,而且就算当一次选不出来A时,我直接让以后都不选A也能过
if(abs(dp[i-1][1]-B[i])<=K||abs(dp[i-1][2]-B[i])<=K){
dp[i][2]=B[i];
cnt++;//合法方案加1
}
}
if(cnt==0){//当第i次选择无法选择任何合法方案
cout<<"No";//直接判无法达成
return 0;//不要忘写,不然同时还会输出Yes
}
}
cout<<"Yes";
return 0;//IOI赛制不写容易爆0,申述也没用的,老老实实写吧
}
看到这能给个赞嘛,虽然解法很诡异
这里空空如也







有帮助,赞一个