他
【问题描述】
一张长度为????的纸带,我们可以从左至右编号为0 − ????(纸带最左端 标号为0)。 现在有????次操作, 每次将纸带沿着某个位置进行折叠, 问所有操作之后纸带的长度是多少。
【输入格式】
第一行两个数字????, ????如题意所述。
接下来一行????个整数代表每次折叠的位置。
【输出格式】
一行一个整数代表答案。
【样例输入】
5 2
3 5
【样例输出】
2
【样例解释】
树上有只鸟。
【数据规模与约定】
对于60%的数据,????, ???? ≤ 3000。
对于100%的数据,???? ≤ 10^18, ???? ≤ 3000。
题解:
数据很水,我们模拟即可,我们模拟折点的变化,因为我们发现折的时候,非折点的点是对最终答案没有影响的,所以只需对折点进行更改即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll num[3333];
int main()
{
freopen("he.in", "r", stdin);
freopen("he.out", "w", stdout);
ll n;
int m;
cin >> n >> m;
for (int i = 1; i <= m; i++)
scanf("%lld", &num[i]);
for (int i = 1; i < m; i++)
for (int j = i + 1; j <= m; j++)
if (num[i] > num[j]) num[j] = 2*num[i]-num[j];
ll t = num[1];
n = max(t, n-t);
for (int i = 2; i <= m; i++)
{
t = num[i] - num[i-1];
n = max(t, n-t);
}
cout << n;
fclose(stdin);
fclose(stdout);
return 0;
}