有K个节点的转发队列,每个节点的转发能力为m,缓存能力为n,输入大于m+n时剩余包被丢弃。此队列中某些节点因故障需要直接跳过转发,但不会有两个连续故障的节点。
现分两轮操作,第一轮发送a个数据进行转发;第二轮转发每个节点的缓存数据。
求两轮最后可能收到的最少数据包个数(第二轮的缓存被忽略)。
思路类似于打家劫舍;有两点需要注意:
1 不可能有连续两个节点是坏的,就是不能偷两家;
2 两次转发可以看出一次,即节点的发送量等于输出量+缓存量。
可以推知:如定义dp[i] 为当前节点的最小输出量,则dp[i] = min( min(dp[i-2],out[i]),dp[i-i])。
out[I] 为当前节点的发送量。上述公式中,前部分代表选择当前点,后部分代表不选当前点。
仅代表自身的思路,如有问题,欢迎指正,万分感谢。
#include<iostream>
#include<vector>
using namespace std;
int main() {
int num;
while(cin>>num)
{
vector<int> out;
while (num--) {
int a = 0, b = 0;
char m = ',';
cin >> a>>m>>b;
out.push_back(a + b);
}
int pre;
cin >> pre;
int cur = out[0];
for (int i = 1; i < out.size(); i++) {
int temp = pre;
pre = cur;
cur = min(cur, min(temp, out[i]));
}
cout << cur << endl;
}
return 0;
}