1.还是比较水,用优先级队列模拟即可
2.个人觉得应该注意的就是当“USB <= LED_V”时,输出的情况应该是“---”,因为题目说,可以小于规定的电流(因为后面会慢慢升,我也不记得为什么了),但是不能超过;我就是在这里WA了一次,一开始觉得如果电源电压小于所需的电压的话应该是“IMPOSSIBLE”才对,结果抱着试一试的心态去改了一下,就过了
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<iomanip>
using namespace std;
struct Node
{
string name;
int interval;
};
struct cmp
{
bool operator()(const Node &n1, const Node &n2)
{
return n1.interval > n2.interval;//小顶堆
}
};
int main()
{
int USB;//电源电压
while(cin >> USB)
{
double LED_V;//LED需要的电压
cin >> LED_V;
double LED_mA;//LED需要的电流
cin >> LED_mA;
int N;//电阻的个数
cin >> N;
if(USB <= LED_V)//电源恰好足够提供
{
for(int i = 0; i < N; i++)
{
string temp;//虽然没有作用,但是还是需要输入
cin >> temp;
int temp2;
cin >> temp2;
}
cout << "---" << endl;
continue;
}
//计算使LED正常工作所需的电阻
double resistance = 0.0;
resistance =(USB - LED_V)/LED_mA*1000;
priority_queue<Node, vector<Node>, cmp> Q;
for(int i = 0; i < N; i++)
{
string name;//电阻名字
cin >> name;
int weight;//电阻阻值
cin >> weight;
//判断并计算差值
if(weight < resistance)//没办法使用它
continue;
else
{
Node temp;
temp.name = name;
temp.interval = (weight - resistance);
Q.push(temp);
}
}
if(Q.empty())//优先级队列为空,说明所有的电阻的阻值都小于规定的要求
{
cout << "IMPOSSIBLE" << endl;
continue;
}
else
{
cout << setiosflags(ios::fixed) << setprecision(2) << resistance << " " << Q.top().name << endl;
}
}
return 0;
}