Problem - D - Codeforces Round 935
思路
最后停在第 位上那么一定会支付 ,在 之后的位置由于可以执行任意次交换位置的操作,那么每个位置所给的硬币为 。
又因为要排在前 位,那么在 之前的位置都是可行的,图解:
最后将前后最小花费相加即可。
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int fast_io=[](){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
return 0;
}();
ll a[200022],b[200022];
ll t,n,m,sum,m_sum;
int main(){
cin >> t;
while(t--){
cin >> n >> m;
for(ll i=1;i<=n;++i)
cin >> a[i];
for(ll i=1;i<=n;++i)
cin >> b[i];
sum=a[m],m_sum=a[m];
for(ll i=m-1;i>0;--i){
m_sum=m_sum-a[i+1]+a[i]+b[i+1];
sum=min(sum,m_sum);
}
for(ll i=m+1;i<=n;++i)
sum+=min(a[i],b[i]);
cout << sum << endl;
}
return 0;
}
翻译题意
题目描述
这些人排成了一个 人的队列,从编号 的人开始,向 D 询问生命的意义。不幸的是,A 正在忙于为这个问题编写传奇故事,所以他来得稍晚一些,站在 号人的后面。A 对这种情况非常不满意,所以他决定贿赂一些他前面的人。
对于队列中的第 个人,A 知道两个值: 和 。如果此刻 A 站在位置 ,那么他可以选择任何一个位置 ,并与位置 的人交换位置。在这种情况下,A 必须支付 个硬币给他。对于每个 ,,A 必须支付 个硬币给位置 的人。A 可以执行任意次数的这个动作。
A 很节俭,所以他希望尽可能少花费硬币,但他又不想等太久,所以他认为自己应该排在前 个人中。
帮助 A 确定他需要花费的最少硬币数量,以便不用等待太久。
输入格式
每个测试包含多组输入数据。第一行包含一个整数 — 测试用例的数量。接下来是测试用例的描述。
每个测试用例的第一行包含两个整数 和 — 队列中除 A 外的人数和 A允许的最大最终位置。
第二行包含 个整数 𝑎1,𝑎2,…,𝑎𝑛,由空格分隔 ()。
第三行包含 个整数 𝑏1,𝑏2,…,𝑏𝑛,由空格分隔 ()。
保证所有测试用例中 的值之和不超过 。
输出格式
对于每个测试用例,输出一个整数 - A需要花费的最少硬币数量。
输入数据 1
4
4 2
7 3 6 9
4 3 8 5
6 2
6 9 7 1 8 3
5 8 8 1 4 1
7 7
7 2 9 2 6 5 9
9 1 10 7 1 4 9
2 1
2 3
1 1
输出数据 1
14
22
9
3