聊天室项目添加功能
实现了消息的撤回,发送时间小于两分钟的消息可以撤回。
实现逻辑:
每条消息都有发送的时间,在进行消息的撤回时,获取当前消息,通过当前消息和发送时间来判断消息能否执行撤回功能,若能,客户端发送消息给服务器,服务器接收通知后删除数据库聊天消息对应的数据,并将撤回的消费发送给对方,若对方在线且正好处于与撤回的用户的界面,实时删除聊天列表
946Div3 E
Charlie是一名物理学家,他喜欢用简单而明确的方式规划自己的生活。
接下来的m个月里,从零开始,Charlie每个月都会努力工作并赚取x英镑。对于第i个月(1≤i≤m),将有一个单独的机会支付ci英镑来获得幸福hi。
不允许借贷。在第i个月赚取的钱只能在以后的j个月(j>i)中花费。
由于物理学家不擅长编程,帮助Charlie找到可以获得的最大幸福总和。
输入 输入的第一行包含一个整数t(1≤t≤1000)——测试用例的数量。
每个测试用例的第一行包含两个整数m和x(1≤m≤50,1≤x≤108)——总月数和每月工资。
接下来的m行中,第i行包含两个整数ci和hi(0≤ci≤108,1≤hi≤103)——第i个月提供的花费和幸福。请注意,某些幸福可能是免费的(对于某些i,ci=0)。
保证所有测试用例中∑ihi的总和不超过105。
输出 对于每个测试用例,输出一个整数,即Charlie可以获得的最大幸福总和。
0
10
200
15
1
9
9
在第一个测试用例中,查理只在月底拿到工资,所以负担不起任何东西。
在第二个测试用例中,查理在第一个月获得了免费的幸福。
在第三个测试用例中,查理在第二个月购买幸福是最佳选择。即使最后还剩下钱,查理也无法回到过去,获得第一个月的幸福。
这题考察的是dp
当时写的时候,dp的含义是前M个月能得到的最大幸福度,后面才发现,除了dp求最大幸福度时,还要考虑剩余金币,不一定按照月份去递推满足最大幸福度
后面看了题解的递推dp含义是dp[j]表示,达到幸福度为 j 所需的最小价值
递推公式是dp[j] = min(dp[j], dp[j - hi[i]] + ci[i]),
最后倒叙找到能完成的最大价值
#include <stdio.h>
long long min(long long x, long long y) {
if (x < y)
return x;
else
return y;
}
long long t, m, x;
long long ci[51], hi[51], dp[510000] = { 0 }, money[51] = { 0 };
int main() {
scanf("%lld", &t);
while (t--) {
for (int i = 300010; i >= 1; i--) {
dp[i] = 1e10;
}
long long yy = 0;
dp[0] = 0;
scanf("%lld %lld", &m, &x);
for (int i = 1; i <= m; i++) {
scanf("%lld %lld", &ci[i], &hi[i]);
yy += hi[i];
}
for (int i = 1; i <= m; i++) {
for (int j = yy; j >= hi[i]; j--) {
if (dp[j-hi[i]] +ci[i] <= (i - 1) * x)
{
dp[j] = min(dp[j], dp[j - hi[i]] + ci[i]);
}
}
}
long long ma = 0;
for (int i = yy; i >=0; i--)
{
if (dp[i] <= (m - 1) * x)
{
ma = i;
break;
}
}
printf("%lld\n", ma);
}
return 0;
}
需要注意的是,在递推的第二重循环下要从大到小,如果从小到大就属于完全背包了,这题的每个月只能使用一次,所以需要倒叙