c++题解:对号入箱
芝士本蒟蒻の第一篇题解,有误多多见谅~
题目描述
输入N和一组整数(以0结束),
N
N
N表示编号
1
,
2
,
…
,
N
1,2,…,N
1,2,…,N的箱子,一组整数表示零件的重量(单位为
G
G
G)。现要求将一批零件,分别装入编号为
1
,
2
,
…
,
N
1,2,…,N
1,2,…,N的
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
Ai∗50~
A
i
∗
50
+
49
Ai*50+49
Ai∗50+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;
}
在最后祝观看这篇题解的姥爷们做题一遍过!!!(欸嘿
看我这么诚恳的份上,给个赞行不行(哭)