试题编号: | 201809-4 |
试题名称: | 再卖菜 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。 输入格式 输入的第一行包含一个整数n,表示商店的数量。 输出格式 输出一行,包含n个正整数,依次表示每个商店第一天的菜价。 样例输入 8 样例输出 2 2 2 1 6 5 16 10 数据规模和约定 对于30%的评测用例,2<=n<=5,第二天每个商店的菜价为不超过10的正整数; |
已知a[n],求b[n],其中a[n]是所给数据,b[n]是要求的菜价
其中有 (b[n-1]+b[n]+b[n+1])/3=a[n](n表示第n天菜价)
所以b[n+1]=3*a[n]-b[n-1]-b[n],或b[n+1]=3*a[n]-b[n-1]-b[n]+1,或b[n+1]=3*a[n]-b[n-1]-b[n]+2
递推关系式就求出来了,每次用b[n-1],b[n],得出b[n+1],所以用dfs暴搜
这里要考虑特殊情况,就是第一天和最后一天是除以2,所以写两种情况就可以了
加上“剪枝” 能大幅度降低复杂度~~~
#include <bits/stdc++.h>
using namespace std;
const int P = 100 + 5;
const int N = 300 + 1;
int n, a[N], b[N], vis[N][P][P];
void dfs(int d){if (d == n + 1) {if (b[n] != (a[n-1] + a[n]) / 2) return;cout << a[1];for (int i = 2; i <= n; i++)cout << " " << a[i];cout << endl;exit(0);} else {for (a[d] = 3 * b[d - 1] - a[d - 1] - a[d - 2];a[d] <= 3 * b[d - 1] + 2 - a[d - 1] - a[d - 2]; a[d]++)if (a[d] > 0 && vis[d][a[d]][a[d - 1]] == 0) {vis[d][a[d]][a[d - 1]] = 1;dfs(d + 1);}}
}
int main(){std::ios::sync_with_stdio(false);std::cin.tie(NULL);cout.tie(NULL);cin >> n;for (int i = 1; i <= n; i++) cin >> b[i];memset(vis, 0, sizeof vis);for(a[1] = 1; a[1] <= 2 * b[1]; a[1]++)for(a[2] = 2 * b[1] - a[1]; a[2] <= 2 * b[1] + 1 - a[1]; a[2]++)if (a[2] > 0) dfs(3);return 0;
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态