列表

详情


NC16518. 下棋

描述

    有一个1*n的棋盘,上面有若干个棋子,一个格子上可能有多个棋子。
    你每次操作是先选择一个棋子,然后选择以下两个操作中的一个:
    (1) 若该棋子不在 (1,1),让这个棋子往左走一格,即从 (1,x) 走到 (1,x-1); 
    (2) 若该棋子不在 (1,n),且这个棋子曾经到达过(1,1),让这个棋子往右走一格,即从 (1,x) 走到 (1,x+1)。
    给定一开始每个格子上有几个棋子,再给定目标局面每个格子上需要几个棋子,求最少需要多少次操作。

输入描述

第一行一个正整数n表示棋盘大小。
第二行n个非负整数a_1, a_2, …, a_n 表示一开始 (1,i) 上有几个棋子。
第三行n个非负整数b_1, b_2, …, b_n 表示目标局面里 (1,i) 上有几个棋子。
保证 1 ≤ n ≤ 100,000,

输出描述

输出一个非负整数,表示最少需要几次操作。

示例1

输入:

5
0 0 1 1 0
1 0 0 0 1

输出:

9

说明:

先把(1,3)上的棋子走到(1,1),花费了2次操作。
然后把(1,4)上的棋子走到(1,1),再往右走到(1,5),花费了3+4=7次操作。
所以一共花了9次操作。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 84ms, 内存消耗: 2408K, 提交时间: 2020-03-29 15:45:19

#include<vector>
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	int n;
	cin>>n;
	vector<int> a(n),b(n);
	for(int &e:a)
	cin>>e;
	for(int &e:b)
	cin>>e;
	ll ans=0,sum=0;
	for(int i=n-1;i>=1;--i)
	{
		sum+=b[i]-a[i];
		if(sum>0)
		{
			ans+=sum*i;
			sum=0;
		}
		else
		{
			ans-=sum;
		}
	}
	cout<<ans<<endl;
	return 0;
 } 

上一题