记录编号 81718 评测结果 AAAAAAAAAA
题目名称 量取牛奶 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.306 s
提交时间 2013-11-17 11:44:53 内存使用 0.56 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<set>
#include<vector>
#include<cstring>
#include<deque>
#include<cstring>
#include<map>
#include<algorithm>
#include<iomanip>
using namespace std;
const int SIZEQ=20001;
const int SIZEP=101;
const int INF=0x3fffffff;
const int W=3;
int f[SIZEQ]={0};
bool flag[SIZEQ]={0};
int Q,P;
int V[SIZEP]={0};
int next1[SIZEQ]={0};
int next2[SIZEQ]={0};
vector<pair<int,int> > gset;
bool better(int x,int y,int k){//x更新成y是否更好
	deque<int> a;
	deque<int> b;
	while(x){
		a.push_back(next2[x]);
		x-=next1[x];
	}
	b.push_back(k);
	while(y){
		b.push_back(next2[y]);
		y-=next1[y];
	}
	int i;
	for(i=0;i<a.size();i++){
		if(a[i]<b[i]) return false;
		if(a[i]>b[i]) return true;
	}
	return false;
}
void init(void){
	int i,j;
	scanf("%d%d",&Q,&P);
	for(i=1;i<=P;i++) scanf("%d",&V[i]);
	sort(V+1,V+1+P);
	for(i=1;i<=P;i++){
		for(j=V[i];j<=Q;j+=V[i]){
			gset.push_back(make_pair(j,V[i]));
		}
	}
}
void output(void){
	deque<int> ans;
	int x=Q;
	cout<<f[Q]<<" ";
	while(x){
		ans.push_back(next2[x]);
		x-=next1[x];
	}
	for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
	cout<<endl;
}
void DP(void){
	int i,j;
	int v;
	for(i=1;i<=Q;i++) f[i]=INF;
	for(i=gset.size()-1;i>=0;i--){
		v=gset[i].first;
		for(j=Q;j>=v;j--){
			if(f[j]>f[j-v]+1){
				f[j]=f[j-v]+1;
				next1[j]=gset[i].first;
				next2[j]=gset[i].second;
			}
			else{
				if(f[j]==f[j-v]+1&&better(j,j-v,gset[i].second)){
					f[j]=f[j-v]+1;
					next1[j]=gset[i].first;
					next2[j]=gset[i].second;
				}
			}
		}
	}
}
int main(){
	freopen("milk4.in","r",stdin);
	freopen("milk4.out","w",stdout);
	init();
	DP();
	output();
	return 0;
}