试题编号: | 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的正整数; |
#include<bits/stdc++.h>
using namespace std;
int price[305];
int cp[305];
bool f[305][305][305];
int t;
void DFS(int n,int x,int y){//分别是搜到第n天,求得得第n-1天菜价,求得的第n天菜价)
if(f[n][x][y]) return;//剪枝
f[n][x][y]=1;
if(n==t-1){
if((3*price[n]-x)/2==price[t]||(3*price[n]-x+1)/2==price[t]||(3*price[n]-x+2)/2==price[t]){
for(int i=1;i<=n;i++){
cout<<cp[i]<<" ";
}
for(int i=0;i<3;i++){
if((3*price[n]-x+i)/2==price[t]){
cout<<3*price[n]-x-y+i;
exit(0);
}
}
}
return;
}
for(int i=0;i<3;i++){
cp[n+1]=3*price[n]-x-y+i;
if(cp[n+1]>=1)
DFS(n+1,y,cp[n+1]);
}
}
int main(){
cin>>t;
for(int i=1;i<=t;i++){
cin>>price[i];
}
for(int i=1;i<=2*price[1];i++){
cp[1]=i;
cp[2]=2*price[1]-i;//余数为0
DFS(2,i,cp[2]);
cp[1]=i;
cp[2]=2*price[1]-i+1;//余数为1
DFS(2,i,cp[2]);
}
return 0;
}