B. Increase/Decrease/Copy
题目大意:
开始给你一个n,然后给你一个长度为n的a数组,和长度为n + 1的b数组。
你每一步可以进行三种类型的操作
1. 随意选择a数组中的一个元素然后将其的值增加1。
2. 随意选择a数组中的一个元素然后将其的值减少1。
3. 随意选择a数组中的一个元素然后将其复制一份放到最后。
问你最少进行多少步可以使得a数组完全变成b数组
题目做法:
除了最后一个n+1位置处的元素由第三种操作产生,其他位置上的元素怎么样变成b数组花费的步骤代价都是恒定的。
所以主要就是minimize a数组放到n+1位置上的元素变成b数组n+1位置上的值所花费的步骤。
AC代码 :
#include<bits/stdc++.h>
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define pb push_back
#define int long long
using namespace std;
const int modi=1e9+7;
const int maxn=1e5+10;
void solve(){
int n,res=0,maxnval=modi;
cin>>n;
int a[n];
int b[n+1];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n+1;i++){
cin>>b[i];
}
for(int i=0;i<n+1;i++){
if(i!=n){
res+=abs(a[i]-b[i]);
if((b[n]>=a[i]&&b[n]<=b[i])||(b[n]>=b[i]&&b[n]<=a[i])){
maxnval=0;
}
maxnval=min({maxnval,abs(a[i]-b[n]),abs(b[i]-b[n])});
}
}
cout<<maxnval+res+1<<'\n';
}
signed main(){
fast int casen;
cin>>casen;
while(casen--) solve();
}
/*
1
4
4 2 1 2
2 1 5 2 3
*/
事后ps :
看懂样例就能做的题
P1868 饥饿的奶牛
原题链接:Problem - B - Codeforces饥饿的奶牛 - 洛谷Problem - B - Codeforces
题目大意:
有 𝑁 个区间,每个区间 𝑥,𝑦
x,y 表示提供的 𝑥 ∼ 𝑦 共 𝑦 − 𝑥 + 1 堆优质牧草。你可以选择任意区间但不能有重复的部分。
选得越多越好,输出可选出的最大堆数
题目做法:
AC代码 :
事后ps :