构造题.
相邻元素乘积小于0,和不为0 等价于 要求相邻元素异号并且绝对值不相等,同时要求所有元素之和为0。
所以可以想到答案中可以存在一个循环节,循环节内部满足上述条件并且首尾的绝对值不相等,因为要求相邻元素异号,所以循环节的长度要是偶数,长度为2的是构造不出来的,所以构造一个长度为4的循环节,并依次构造出长度为5,6的一个数组,再加上样例中给的长度为3的,就可以构造出所有长度大于2的符合要求的数组了,7 = 3+4,8 = 4+4, 9 = 4+5, 10 = 4+6、...以此类推。
#include <bits/stdc++.h>
using namespace std;
map<int, vector<int>> mp;
int main()
{
int n;
cin >> n;
if(n <= 2) {
puts("No Answer");return 0;
}
mp[3] = {1, -3, 2};
mp[4] = {2, -1, 2, -3};
mp[5] = {2, -3, 2, -3, 2};
mp[6] = {1, -2, 1, -2, 3, -1};
vector<int> ans;
while(n > 2 && mp.count(n) == 0) {
for(int t: mp[4])
ans.push_back(t);
n -= 4;
}
if(mp.count(n)) {
for(int t: mp[n])
ans.push_back(t);
}
for(int i = 0 ; i < ans.size() ; i ++) {
cout << ans[i] << " \n"[i+1 == ans.size()];
}
}
n = int(input())
mp = {}
mp[3] = [1, -3, 2]
mp[4] = [2, -1, 2, -3]
mp[5] = [2, -3, 2, -3, 2]
mp[6] = [1, -2, 1, -2, 3, -1]
ans = []
while n > 2 and n not in mp:
n -= 4
ans += mp[4]
if n in mp:
ans += mp[n]
if n == 2:
ans = ["No Answer"]
print(" ".join(map(str, ans)))
在一个小镇上,有一个富有的商人,他名叫米小游。他一直很自豪地说自己是一个数学家,但是他很长一段时间都没有找到一些有趣的问题来解决。终于有一天,他遇到了一个叫做朱莉的年轻女子。她向他提出了这个问题:
“我想找一个数组,它满足所有元素的绝对值不大于 3 ,任意相邻的两个元素的乘积小于 0 ,且它们的和不为 0 ,并且所有元素之和等于 0 。你能帮我找到这样一个数组吗?”
米小游开始思考这个问题。他试图通过手算一些例子来找出一个通用的方法。但是,他发现这个问题实际上非常困难,他不知道该如何开始解决它,你能帮米小游解决这个问题吗?
一个正整数 n 。 2≤n≤105
如果无解,请输出一个字符串 No Answer 。
否则输出 n 个整数。有多解输出任意即可。
输入
2
输出
No Answer
输入
3
输出
-1 2 -1
样例解释
输出 2 -3 1 等合法解也是可以的。