【题目】数据包转发统计

有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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值