Codeforces Round #807 (Div. 2)
Friday, July 15, 2022 at 21:35UTC+8
这,是最后一次写了,以后如果没有特别nb,不会再写了。
话不多说,看题。
我就懒得翻译了,做的时候也没用翻译。qwq。
甚水之题,不宜多说。排序后从中截断,使前后两段每个位置一一对应比较即可。这显然已经是最优的状态。
#include<bits/stdc++.h>
using namespace std;
int h[5000],n,x;
void solve(){
for(int i=1;i<=n*2-1;i++){
for(int j=1;j<=n*2-1;j++){
if(h[j]>h[j+1]){
swap(h[j],h[j+1]);
}
}
}
for(int i=1;i<=n;i++){
if(h[i+n]-h[i]<x){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
return;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>x;
for(int i=1;i<=2*n;i++)cin>>h[i];
solve();
}
return 0;
}
来看B
看看样例提示就明白了
就是说,要把数组里前面的元素全部搬到最后去,一次只能搬1。显然,无论如何,只要你不去把本来一步就能搬到最后的分成几步来搬之类的,最优的方案就是把你要搬的值加起来,搬一次减少1,所以最少的步数就是这些值的和。
那么还要注意的是,如果要搬的话,i和j中间不能有0。所以我们必须把0给他填起来才行。因此
一些小伙伴可能看起来比较吃力,翻译成人话就是:数组前面的所有元素加起来,然后如果说在已经出现了不为0的数之后又有0,那么这些0就是需要用一步去填起来的。因此答案就是元素之和+需要填上的0的个数。
其实这题老简单了(latex里面居然打不了&&)我只是zb一下
#include<bits/stdc++.h>
using namespace std;
long long t,n,a[200005];
void solve(){
long long sum=0,f=-1;
for(int i=1;i<=n-1;i++){
if(a[i]!=0&&sum==0)f=0;
if(a[i]==0&&f>-1)f++;
sum+=a[i];
}
long long ans=sum+f;
if(sum==0)cout<<"0"<<endl;
else cout<<ans<<endl;
return;
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
solve();
}
return 0;
}
需要注意一下的就是,不开long long是会见祖宗的。另外,cout里面直接进行的加减,范围只有int(应该是吧?那不然为什么我之前交的时候WA了第三组数据)所以我们long long ans=sum+f再将ans输出。
我就只做了两道题。
rating:839
-END-