SDUT 2022 Spring Team Contest——9(补题)

Problem D: Down the Pyramid

Down the Pyramid - Gym 102021D - Virtual Judge (vjudge.net)

 

 

概述:给你一个序列,根据这个序列,写出它下一层金字塔的可能出现的序列数目。

 

核心:一个点确定之后能推出另一个点的准确值。如果我们确定了下一层金字塔左端第一个数,那么后面所有数都能够得到一个确定值。

 

 

int n;
    cin >> n;
    for(int i=0;i<n;i++)
        cin >> q[i];
    for(int i=1;i<=n;i++)
        a[i]=q[i-1]-a[i-1];
    
    for(int i=0;i<=n;i++)cout << a[i] << " ";  
//样例(1)展示:

//  12 5 7 7 8 4
//  0 12 -7 14 -7 15 -11 

 

由题意值a数组是非负整数,此时的题目就变成了求:如何将a数组转化成全部是非负整数并计算出数量

通过观察我们发现:

奇数项的a[i]变化是递增

偶数项的a[i]变化是递减

所以我们只需要关心递减的项里面的最小值就可以

PS:if(min(a[i])=2) ans=3    (2,1,0)三种情况

如果怎么调整都会存在负数

说明情况为0

代码如下:

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
#define int long long
#define SugarT ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

using namespace std;

const int N=1e6+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double eps = 1e-6;

int q[N],a[N];

void solve()
{
    
    int n;
    cin >> n;
    for(int i=0;i<n;i++)
        cin >> q[i];
    for(int i=1;i<=n;i++)
        a[i]=q[i-1]-a[i-1];
    
    for(int i=0;i<=n;i++)cout << a[i] << " ";
    int k=1;
    for(int i=0;i<=n;i++)
        k=min(k,a[i]);
    for(int i=0;i<=n;i++)
    {
        if(i%2==0)
            a[i]-=k;
        else
            a[i]+=k;
    }
    //for(int i=0;i<=n;i++)cout << a[i] << " ";
    
    int ans=1e18;
    for(int i=0;i<=n;i++)
    {
        if(i%2==1)
            ans=min(ans,a[i]);
    }
    
    if(ans<0)ans=-1;
    cout << ++ans << endl;
    
}

signed main()
{
    SugarT
    int T=1;
        //cin >> T;
    while(T--)
        solve();
    
    return 0;
        
}

 

posted @ 2022-05-03 22:59  MrSugarT  阅读(43)  评论(0编辑  收藏  举报