POJ 1017 Packets 悼念死去的模拟


此页面通过工具从 csdn 导出,格式可能有问题。

题目链接

题目很水,纯模拟

麻烦的地方在于,会面临多次用小件填充大件剩余。

最开始觉得不同大小时决策不一样,所以各自写各自的,结果越写越凌乱,果断wa了。

最悲催的是拿到数据后依然无从下爪(代码真的太乱了!)


于是开始重理思路,把该有的地方封装起来再调试,果然明朗许多。

唉教训啊教训


#include <cstdio>
#include <iostream>
using namespace std;
int n=6,t;
int a[8];
int push(int t,int i, int num){             // 把num个a[i]放进容量为t的箱子里,返回箱子容量
	if ( num > a[i]) num = a[i];
	t -= i*i * num;
	a[i] -= num;
	return t;
}
int main(){
	for(;;){
		int ts = 0;
		for ( int i(1);i<=n;i++){
			cin >> a[i];
			ts+=a[i];
		}
		if (!ts) break;
	int s =a[6]+a[5]+a[4];

	// a5
	if (a[5]*11 &gt;= a[1]) a[1] = 0;
	else a[1] -= a[5]*11;

	// a4
	for ( int i(1);i&lt;=a[4];i++){
		t = push(20,2,5);
		if (t) t = push(t,1,t);
	}

	// a3
	s += a[3] / 4;		// 整装3
	a[3] %= 4;
	if (a[3]){									//	剩下的空间分情况装2
		t = 36 - a[3]*9;
		if ( a[3] == 1 ) t = push(t,2,5);
		if ( a[3] == 2 ) t = push(t,2,3);
		if ( a[3] == 3 ) t = push(t,2,1);
		if (t) t = push(t,1,t);						//	剩下的空间都装1
		s++;
	}

	// a2
	s += a[2] / 9;
	a[2] %= 9;
	if (a[2]){
		t = 36 - a[2] * 4;
		t = push(t,1,t);
		s++;
	}

	// a1
	s += a[1] / 36;
	a[1] %= 36;
	if (a[1]) s++;

	cout &lt;&lt; s &lt;&lt; endl;
}
return 0;

}



Avatar
huiren
Code Artisan

问渠那得清如许,为有源头活水来

相关

下一页
上一页
comments powered by Disqus