清北第四套题

                                   他

【问题描述】

一张长度为的纸带,我们可以从左至右编号为(纸带最左端标号为)。现在有次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带的长度是多少。

【输入格式】

第一行两个数字如题意所述。

接下来一行个整数代表每次折叠的位置。

【输出格式】

一行一个整数代表答案。

【样例输入】

5 2

3 5

【样例输出】

2

【样例解释】

树上有只鸟。

【数据规模与约定】

对于60%的数据,N,M<=3000。     

对于100%的数据,N<=10^18,M<=3000。

 

 

题解:每次折叠时,更新纸带的左右端点,以及这次折叠之后折叠位置的编号。

 

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 3100
#define ll long long 
using namespace std;
int m;
ll n,l(0),r;
ll a[N];
int main()
{
    freopen("he.in","r",stdin);
    freopen("he.out","w",stdout);
    cin>>n>>m;
    r=n;
    for (int i=1;i<=m;i++) 
       cin>>a[i];
    for (int i=1;i<=m;i++)
      {
           if (a[i]*2>=l+r) r=a[i];//更新端点 
             else l=a[i];
           for (int j=i+1;j<=m;j++)//更新位置 
             {
                if (a[j]<l) a[j]=l*2-a[j];
              if (a[j]>r) a[j]=r*2-a[j];    
           }
      }
    cout<<r-l<<endl;
    
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}
参考自hwh大神
原文地址:https://www.cnblogs.com/sjymj/p/6037768.html