装箱问题
  LcViZvxOG08L 2023年11月02日 38 0


假设有N项物品,大小分别为s
1
、s
2
、…、s
i
、…、s
N
,其中s
i
为满足1≤s
i
≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。

输入格式:
输入第一行给出物品个数N(≤1000);第二行给出N个正整数s
i
(1≤s
i
≤100,表示第i项物品的大小)。

输出格式:
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。

输入样例:

8
60 70 80 90 30 40 10 20

输出样例:

60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5

一道考察数组的基础题,最好边计算便输出,注意添加的物品的值可能会有重复。我的错误代码就是因为这个导致最后一个测试点错误。。。
错误代码:

// #define LOCAL
#include<iostream>
#include<map>
using namespace std;
int a[10005];
int b[10005];
map<int,int> mp;
int main() {
	#ifdef LOCAL
	freopen("7-4 装箱问题.txt","r",stdin);
	#endif
	int n;
	cin>>n;
	int numbox=0;
	for(int i=0; i<n; i++) {
		cin>>a[i];
		for(int j=1;true;j++){
			if(b[j]+a[i]<=100){
				if(j>=numbox)numbox=j;
				b[j]+=a[i];
				mp[a[i]]=j;
				break;
			}
		}
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<' '<<mp[a[i]]<<endl;
	}
	cout<<numbox;
}

正确代码:

//#define LOCAL
#include<iostream>
using namespace std;
int a[10005];
int b[10005];
int main() {
	#ifdef LOCAL
	freopen("7-4 装箱问题.txt","r",stdin);
	#endif
	int n;
	cin>>n;
	int numbox=0;
	for(int i=0; i<n; i++) {
		cin>>a[i];
		cout<<a[i]<<' ';
		for(int j=1;true;j++){
			if(b[j]+a[i]<=100){
				if(j>=numbox)numbox=j;
				b[j]+=a[i];
				cout<<j<<endl; 
				break;
			}
		}
	}
	cout<<numbox;
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  wD98WYW8hiWJ   2023年11月20日   33   0   0 #include
  v0MZS93bOvwU   2023年11月02日   57   0   0 #include
  Fv5flEkOgYS5   2023年11月02日   55   0   0 i++javaide
  xlvdqsD183Uk   2023年11月13日   47   0   0 分隔符输出格式ci
LcViZvxOG08L