C++对号入箱 题解

c++题解:对号入箱

芝士本蒟蒻の第一篇题解,有误多多见谅~

题目描述

输入N和一组整数(以0结束), N N N表示编号 1 , 2 , … , N 1,2,…,N 12N的箱子,一组整数表示零件的重量(单位为 G G G)。现要求将一批零件,分别装入编号为 1 , 2 , … , N 1,2,…,N 12N N N N只箱子中去,装入的方法是: 0 G 0G 0G< 零件重量< 100 G 100G 100G 装入1号箱
100 G 100G 100G<=零件重量< 150 G 150G 150G 装入2号箱
150 G 150G 150G<=零件重量< 200 G 200G 200G 装入3号箱
…………
以此类推。装完之后,要求找出哪只箱子中的零件个数最多,若有相同的最多则要求全部列出(仅列出箱子的号数即可),若因零件太重无箱子可装,也应输出这类零件的个数。

输入格式

第一行一个整数 N ( 0 < N < = 20 ) N( 0 < N <= 20) N(0<N<=20)第二行为若干个空格隔开的整数 A i Ai Ai,以 0 0 0 结束
( 0 < A i < 32768 ) ( 0 < Ai < 32768 ) 0<Ai<32768

输出格式

有若干行,为零件个数最多的所有箱子编号(每行一个编号)
最后一行为零件太重无箱子可装的零件个数(如果有)

解题方案

输入n与重量之后,可以判断应该装入哪个箱子,若要求比第n个箱子大,自动定为others就行了。 可以使用函数以及数组来解题

我们先设一个数组 a a a,表示各个箱子,数组的前缀就代表箱子的编号,也就是下文的"第几个箱子"

首先寻找这些数字的规律, A 1 A1 A1 0 0 0~ 100 100 100 A 1 A1 A1以后就都是 A i ∗ 50 Ai*50 Ai50~ A i ∗ 50 + 49 Ai*50+49 Ai50+49.了
那么我们就可以写出判断这个数字应该放在第几个箱子里面了。

思考一下,可以得出以下代码片段:

int find_box(int x){
	if(x>0 && x<100) return 1; 
	for(int i=2;i<=n;i++){
		int left=i*50;
		int right=left+49;
		if(x>=left && x<=right) return i;
	}
}

然后我们来考虑Other这种情况:
可以为 a a a数组添加一个位置,用来放置装不下的,用n+1来表述前缀就可以了
那么添加过的代码如下:

int find_box(int x){
	if(x>0 && x<100) return 1; 
	for(int i=2;i<=n;i++){
		int left=i*50;
		int right=left+49;
		if(x>=left && x<=right) return i;
	}
	return n+1;
}

接下来就是寻找装的最多的箱子了, 因为可能有多个箱子内装的物品一样多,
那么我们就去遍历寻找这些箱子里面装的东西的最大值,
然后在输出这个部分把内容最多的挨个输出即可解决问题;
那么代码如下:

int find_max(){
	int ans=a[1];
	for(int i=2;i<n+1;i++)//遍历寻找最大值
		ans=max(ans,a[i]);
	return ans;
}
void print(int zd){
	for(int i=1;i<=n;i++)
		if(a[i]==zd) cout<<"No."<<i<<endl;//输出内存最多的箱子
	if(a[n+1]>0) //判断是否有多余的
		cout<<"Others:"<<a[n+1];//输出装不下的
}

看主函数部分:
因为输入格式中,这些数字以 0 0 0结束,
那么我们可以使用wile(1)无限循环,
当输入0时结束循环
然后a[find_box(输入的数)]++
最后输出即可~
全部代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,x,a[100];
int find_box(int x){
	if(x>0 && x<100) return 1; 
	for(int i=2;i<=n;i++){
		int left=i*50;
		int right=left+49;
		if(x>=left && x<=right) return i;
	}
	return n+1;
}
int find_max(){
	int ans=a[1];
	for(int i=2;i<n+1;i++)
		ans=max(ans,a[i]);
	return ans;
}
void print(int zd){
	for(int i=1;i<=n;i++)
		if(a[i]==zd) cout<<"No."<<i<<endl;
	if(a[n+1]>0) cout<<"Others:"<<a[n+1];
}
int main(){
	cin>>n;
	while(1){
		cin>>x;
		if(x==0) break;
		a[find_box(x)]++;
	}
	int zd=find_max();
	print(zd);
	return 0;
}

在最后祝观看这篇题解的姥爷们做题一遍过!!!(欸嘿
看我这么诚恳的份上,给个赞行不行(哭)

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值