codeforces Trees in a Row

Description

The Queen of England has n trees growing in a row in her garden. At that, the i-th (1 ≤ i ≤ n) tree from the left has height ai meters. Today the Queen decided to update the scenery of her garden. She wants the trees’ heights to meet the condition: for all i(1 ≤ i < n), ai + 1 - ai = k, where k is the number the Queen chose.

Unfortunately, the royal gardener is not a machine and he cannot fulfill the desire of the Queen instantly! In one minute, the gardener can either decrease the height of a tree to any positive integer height or increase the height of a tree to any positive integer height. How should the royal gardener act to fulfill a whim of Her Majesty in the minimum number of minutes?

Input

The first line contains two space-separated integers: n, k (1 ≤ n, k ≤ 1000). The second line contains n space-separated integers a1, a2, …, an (1 ≤ ai ≤ 1000) — the heights of the trees in the row.

Output

In the first line print a single integer p — the minimum number of minutes the gardener needs. In the next p lines print the description of his actions.

If the gardener needs to increase the height of the j-th (1 ≤ j ≤ n) tree from the left by x(x ≥ 1) meters, then print in the corresponding line “+ j x”. If the gardener needs to decrease the height of the j-th (1 ≤ j ≤ n) tree from the left by x(x ≥ 1) meters, print on the corresponding line “- j x”.

If there are multiple ways to make a row of trees beautiful in the minimum number of actions, you are allowed to print any of them.

Sample Input

Input
4 1
1 2 1 5

Output
2
+ 3 2
- 4 1

Input
4 1
1 2 3 4

Output
0

题意:有n棵树,知道这n棵树的高度,现在要使得这n棵树满足这样的关系,第i棵树比第i-1棵树高k米,每棵树都可以增加高度或者是减少高度,求经过多少步可以使得这n棵树满足条件,输出最小的步数,然后输出每步的具体操作。
解法:暴力1000*1000的循环,依次将a[i]作为中心去更新左右两边的树,记录更新的次数,同时记录i,最后只要按照记录的这个i,依次将其他的树更新输出就行

#include <iostream>
#include <cmath>
using namespace std;

int a[1005],b[1005];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0; i<n; i++)
        cin>>a[i];
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            if(a[j]!=a[i]+k*(j-i))
                b[i]++;
            if(a[i]+k*(j-i)<=0)//如果按照此树的高度来,会把一些数的高度变成负的或0;
                b[i]+=1000;
        }
    }
    int min=10000,t=0;
    for(int i=0; i<n; i++)
    {
        if(min>b[i])
        {
            min=b[i];
            t=i;
        }
    }
    cout<<b[t]<<endl;
    for(int i=0; i<n; i++)
    {
        if(a[i]>a[t]-k*(t-i))
        {
            cout<<"-"<<" "<<i+1<<" "<<fabs(a[t]-k*(t-i)-a[i])<<endl;
        }
        if(a[i]<a[t]-k*(t-i))
        {
            cout<<"+"<<" "<<i+1<<" "<<fabs(a[t]-k*(t-i)-a[i])<<endl;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值