题解 P5250 【【深基17.例5】木材仓库】

· · 题解

又是储存数据的题目,我们来用vector储存数据。由题可知,共有两种处理数据的方式,我们来逐一分析。(下面均设一组数据的两个数分别为x,y)

x = 1:放入木材
先要判断长度是否有重复,若无重复,再存入数据。

if(x == 1)
{
    bool ok = 0;
    for(int i = 0;i < s.size();i++)
    {
        if(s[i] == y)//重复情况 
        {
            cout<<"Already Exist"<<endl;
            ok = 1;
            break;
        }
    }   
    if(!ok) s.push_back(y);//没有重复,就存入该长度 
}

x = 2:取出木材
首先判断库中有无木材,若有,我们需要取一个最优的答案,满足最接近y且长度较短的木材。那么如何实现?
循环库中的所有木材,不停地找出与y最相近的一根木材,若有多个最优解,我们就保存最短的那根就行。最后取出该跟木材(记得取出,别忘了!)

if(s.size() == 0) cout<<"Empty"<<endl;//没有库存 
else
{
    int w = 0x7f7f7f7f,num,t;
    for(int i = 0;i < s.size();i++)
    {
        if(abs(y - s[i]) < w) w = abs(y - s[i]),num = s[i],t = i;//最接近的答案 
        if(abs(y - s[i]) == w && s[i] < num) num = s[i],t = i;//较短的木材 
    }
    s.erase(s.begin() + t);//取出最优解的木材 
    cout<<num<<endl;
}

完整代码如下:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector <int> s;//vector来储存 
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x,y;
        cin>>x>>y;
        if(x == 1)
        {
            bool ok = 0;
            for(int i = 0;i < s.size();i++)
            {
                if(s[i] == y)//重复情况 
                {
                    cout<<"Already Exist"<<endl;
                    ok = 1;
                    break;
                }
            }
            if(!ok) s.push_back(y);//没有重复,就存入该长度 
        }
        else
        {
            if(s.size() == 0) cout<<"Empty"<<endl;//没有库存 
            else
            {
                int w = 0x7f7f7f7f,num,t;
                for(int i = 0;i < s.size();i++)
                {
                    if(abs(y - s[i]) < w) w = abs(y - s[i]),num = s[i],t = i;//最接近的答案 
                    if(abs(y - s[i]) == w && s[i] < num) num = s[i],t = i;//较短的木材 
                }
                s.erase(s.begin() + t);//取出最优解的木材 
                cout<<num<<endl;
            }
        }
    }
    return 0;
}