CodeForces 257D

Description

Vasya has found a piece of paper with an array written on it. The array consists of n integers a1, a2, ..., an. Vasya noticed that the following condition holds for the array ai ≤ ai + 1 ≤ 2·ai for any positive integer i (i < n).

Vasya wants to add either a "+" or a "-" before each number of array. Thus, Vasya will get an expression consisting of n summands. The value of the resulting expression is the sum of all its elements. The task is to add signs "+" and "-" before each number so that the value of expression s meets the limits 0 ≤ s ≤ a1. Print a sequence of signs "+" and "-", satisfying the given limits. It is guaranteed that the solution for the problem exists.

Input

The first line contains integer n (1 ≤ n ≤ 105) — the size of the array. The second line contains space-separated integers a1, a2, ..., an(0 ≤ ai ≤ 109) — the original array.

It is guaranteed that the condition ai ≤ ai + 1 ≤ 2·ai fulfills for any positive integer i (i < n).

Output

In a single line print the sequence of n characters "+" and "-", where the i-th character is the sign that is placed in front of number ai. The value of the resulting expression s must fit into the limits 0 ≤ s ≤ a1. If there are multiple solutions, you are allowed to print any of them.

Sample Input

Input
4
1 2 3 5
Output
+++-
Input
3
3 3 5
Output
++-

题意:给你一系列数字,确定每个数字的正负使它们的和小于a1。

思路,从最后一个开始递推,使每个数字加上它以后所有数字的和的绝对值小于它本身,即保证abs(dp[i])<=a[i],

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;

int main(){
	freopen("input.txt","r",stdin);
	int n;
	cin>>n;
	int a[n+1],dp[n+1];
	char str1[n+1];
	char str2[n+1];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	dp[n-1]=a[n-1];
	str1[n-1]='+';
	str2[n-1]='-';
	for(int i=n-2;i>=0;i--){
		if(dp[i+1]+a[i]<=a[i]){
			str1[i]='+';
			str2[i]='-';
			dp[i]=a[i]+dp[i+1];
		}else{
			str1[i]='-';
			str2[i]='+';
			dp[i]=dp[i+1]-a[i];
		}
	}
    if(dp[0]>=0){
    	for(int i=0;i<n;i++)
    	  printf("%c",str1[i]);
	}else{
		for(int i=0;i<n;i++)
		  printf("%c",str2[i]);
	}
	return 0;
}

下面这个与上一个区别主要是定义为a/str[10000+6],却超时挂在了test8上,搞不懂为什么,n最大值为10000没问题啊。。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;

int main(){
	freopen("input.txt","r",stdin);
	int n;
	cin>>n;
	int a[n+1],dp[n+1];
	char str1[n+1];
	char str2[n+1];
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	dp[n]=a[n];
	str1[n-1]='+';
	str2[n-1]='-';
	for(int i=n-1;i>=1;i--){
		if(dp[i+1]+a[i]<=a[i]){
			str1[i-1]='+';
			str2[i-1]='-';
			dp[i]=dp[i+1]+a[i];
		}
		else{
			str1[i-1]='-';
			str2[i-1]='+';
			dp[i]=dp[i+1]-a[i];
		}
	}
	if(dp[1]>=0){
        for(int i=0;i<n;i++){
         	printf("%c",str1[i]);
	    }
    }else{
        for(int i=0;i<n;i++){
            printf("%c",str2[i]);
	    }    	
	}
	return 0;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值