欢迎光临
我们一直在努力

Skibidus and Fanum Tax (easy version)

Skibidus and Fanum Tax (easy version)

CodeForces – 2065C1
题目源地址

在这里插入图片描述

没写出来:

我刚开始想了一下用什么方法,最后还是觉得是模拟题,我是直接两两进行维护的,没有考虑到全局,还是贪心错了,我后面还想是不是方法错了,我想会不会是dfs,但是数据又太大了,肯定超时,而且对于我来说这道题的dfs我不是很会写,我还觉得dp也有可能,其实就是当前的数是否要进行操作,而且他还能进行全局的维护,这个我也觉得不太好写,开一维dp很难判断,写不出来

题目核心:贪心

因为是要非递减序列,从左到右遍历进行维护,这个简单版本是

m

=

1

m=1

m=1的,也就是每个都可以变成

x

a

[

i

]

x-a[i]

xa[i],左边一定要给右边留好,左边要尽可能的小,如果序列只有一个数就不需要维护了,有多个就要开始维护了,第一个选最小的就行,接下来每个数也是从

a

[

i

]

a[i]

a[i]

x

a

[

i

]

x-a[i]

xa[i]中选,但还是要满足

a

[

i

]

<

=

a

[

i

1

]

a[i]<=a[i-1]

a[i]<=a[i1]这个条件,那就把可能存

v

e

c

t

o

r

vector

vector里面,如果是空的,那么就都不满足条件,输出no,有的话就选最小的那个,然后更新

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[200005];
int b[200005];
signed main() {
int t;
cin>>t;
while(t) {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
for(int j=1; j<=m; j++) {
cin>>b[j];
}
int x=b[1];
int f=0;
if(n==1) {
cout<<"YES"<<endl;
continue;
} else {
int qian=min(a[1],xa[1]);
for(int i=2; i<=n; i++) {
vector<int>v;
if(a[i]>=qian)v.push_back(a[i]);
if(xa[i]>=qian)v.push_back(xa[i]);
if(v.empty()) {
f=1;
break;
}
int minn=v[0];
for(int j=0; j<v.size(); j++) {
if(v[j]<minn) {
minn=v[j];
}
}
qian=minn;
}
}
if(f==1) {
cout<<"NO"<<endl;
} else {
cout<<"YES"<<endl;
}
}
return 0;
}

赞(0)
未经允许不得转载:171主机测评 » Skibidus and Fanum Tax (easy version)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址