7.31总结

1,添加好友与请求处理

添加好友的思路:
1.假设A添加B
A给服务端发送要添加B的消息,服务端接受后,先把A添加B的信息存入数据库,再去个人信息表查看B是否在线

a.如果B在线
则把要添加B的消息由服务端转发给B,在B处的循环线程也一直监听是否有人发送好友请求,如果有,显示在界面上,再同不同意,同意的话,在自己的好友列表上显示A好友,然后把B同意A的消息发送给服务端,再由服务端转发给客户端的A,此时A接收到B同意的消息,那么就把B显示在好友列表上

b.如果B不在线
则直接存入数据库(A添加B),之后等b上线后,要做一件事情就是判断是否有人添加他,判断方法为去数据库查,有的话就显示有消息,点开消息再看谁加你,同意就可以发送给服务端请求,服务端再给A发消息说他同意了,就显示在请求列表里面让看A同不同意

 

2.两道算法题

第一题太简单了就不说了

第二题是背包问题:

感觉有点难以理解,我先看了二维的把二维的好好看看一维的更容易理解

dp[i][j]表示【0,i】物品任取放容量为j;

不放物品i,dp【i-1】【j】

放i:dp【i-1】【j-weight[i]】+value[i];其放物i的最大值应这个背包容量减去物品i的容量所能放的max值价值,加上物品i的价值

dp[i][j]=(dp【i-1】【j-weight[i]】+value[i]  , dp【i-1】【j】)

可以这么理解:放了物品i,还剩下j - weight[i]的容量可以放其他物品,剩下空间能得到的最大值是dp[i-1][j-weight[i]],大的前提下是放物品i。这里分两步,dp[i-1][j-weight[i]]表示不放物品i的最大价值,后面还要加上放入物品i的价值value[i],总的来说就是放入物品i。注意这里的区间是0-i之间的物品,不放i,但是i-1放了,所以是dp[i-1][j],如果放了i的物品就要加上物品i的价值。

不放物品 i 可以理解为,物品 i 的重量大于了背包的容量,那么背包中肯定不能放这个物品,所以将这个这个物品减掉并不会对最终的结果产生影响,那么剩下可以选的物品就变成了 [0,i-1]

理解了二维后一维也不是很难理解了,但由于我比较菜所以最后还是靠记模版了;

#include<stdio.h>
#include<stdlib.h>
#include <iostream>

using namespace std;



int e[11000];//背包问题,一维背包
int s[11000];//时间 
int v[11000];//价值 
int main()
{
	int t, m;
	cin >> t >> m;
	for (int i = 1; i <= m; i++)//装入时间和价值
	{
		cin >> s[i] >> v[i];
	}
	for (int i = 1; i <= m; i++)
	{
		for (int j = t; j >= s[i]; j--)//套公式
		{
			e[j] = max(e[j], e[j - s[i]] + v[i]);//原本(e[i][j]=max(e[i-1][j]//不选i,e[i-1][j-w[i]]+v[i]//选i)  
		}                              
	}
	cout << e[t];
	return 0;
     
}

 

思路:
mid为当前假定的每头牛间隔的最小值
先在第一个牛棚放一头牛
在间隔大于等于mid的时候再放一头牛
当越过最后一个牛棚的时候
判断此时放的牛的数量num和真正的牛的数量C作比较
如果num>=C的话,说明在mid的间隔下能放得下这么多牛,返回true
此时二分区间应当向右边缩(因为我们要寻找满足条件的间隔的最大值)
否则的话将区间向左边缩
当L==R时,此时的值即为答案了,再判断一次后,R指向答案,L指向答案加1


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;



bool Check(vector<int> a, int mid, int C) {
	int num = 1, base = a[0];
	for (int i = 1; i < (int)a.size(); i++) {
		if (a[i] - base >= mid) {
			base = a[i];
			num++;
		}
	}
	return num >= C;
}

int Search_L(vector<int>& a) {//寻找二分答案的下界
	int minn = a[1] - a[0];
	for (int i = 1; i < (int)a.size(); i++) {
		minn = min(minn, a[i] - a[i - 1]);
	}
	return minn;
}


void in(vector<int>& a) {
	for (int i = 0; i < (int)a.size(); i++) {
		cin >> a[i];
	}
}
int main() {
	int N, c;
	cin >> N >> c;
	vector<int> a(N);//创建动态数组a
	in(a);//通过函数将牛棚的位置输入进去
	
	sort(a.begin(), a.end());
	int len = Search_L(a), R = a[N - 1] - a[0], mid;//二分答案的上界与下界还有mid
	
	//二分模板
	while (len <= R) {
		mid = len + (R - len) / 2;
		if (Check(a, mid, c)) 
		{ 
              len = mid + 1;
		}
		else {
              R = mid - 1;
		}
			
	}
	printf("%d", R);
}

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值