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
4 1 2 3 5
+++-
3 3 3 5
++-
题意:给你一系列数字,确定每个数字的正负使它们的和小于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;
}