每日一题(牛客) — 2020 - 04 - 01

这道题我做过类似的,但是还是不太会做,真是太菜了

(个人感觉牛客的每日一题挺好,我好多不会的,hhh)


题目链接


其实这题也不会,看的别的大佬的思路写的,树形DP,感觉很好(最小割的话还是不会的,过段时间去学习下)

题目要求找度数为1的点(除了s), 然后要求我们让他不能到达s,那么我们就切除当前点与到s路径上边权最小的点即可,但是我就想为什么需要 f[] += min() 呢,想到一个特殊情况


441
121
231
241

这种情况我们切除 1 - 2 就可以,所以我们需要 += 去判断最小值。
然后dfs去搜索,标记好他的当前节点和父节点即可,然后求出f[s] 的最小值。


代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 100010, M = 200010, INF = 0x3f3f3f3f;

int h[N], e[M], ne[M], d[N], w[M], f[N], idx;

int n, m, s;

void add(int x, int y, int z){
    e[idx] = y, w[idx] = z, ne[idx] = h[x], h[x] = idx ++;
}

void dfs(int u, int p){
    if (d[u] == 1 && u != s){
        f[u] = INF;
        return ;
    }
    for (int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        if (j != p){
            dfs(j, u);
            f[u] += min(f[j], w[i]);
        }
    }
}

int main(){
    
    scanf("%d%d%d",&n,&m,&s);
    
    memset(h, -1, sizeof h);
    
    for (int i = 0; i < m; i++){
        int x, y, z;
        scanf("%d%d%d",&x,&y,&z);
        add(x, y, z), add(y, x, z);
        d[x]++, d[y]++;
    }
    
    dfs(s,0);
    
    printf("%d\n",f[s]);
    
    return 0;
}

好的,这是一个统计留存率的问题,留存率的定义是指在某个时间段内,用户继续使用产品的比例。对于这个问题,我们需要计算新登录用户在第二天仍然登录的比例。具体步骤如下: 1. 找到所有新登录用户 新登录用户的定义是第一次登录牛客网的用户,因此我们需要找到第一次登录的记录,可以按日期升序排序,然后按用户分组,取每个用户的第一条记录即可。 2. 计算次日留存率 对于每个新登录用户,找到其第二天的登录记录,如果存在,则认为该用户次日成功留存,否则认为该用户次日未留存。最后将留存用户数除以总登录用户数即可得到留存率。 下面是具体的 SQL 语句实现: ``` SELECT COUNT(DISTINCT t1.user_id) AS login_users, COUNT(DISTINCT t2.user_id) AS retained_users, COUNT(DISTINCT t2.user_id) / COUNT(DISTINCT t1.user_id) AS retention_rate FROM login_records t1 LEFT JOIN login_records t2 ON t1.user_id = t2.user_id AND DATEDIFF(t2.date, t1.date) = 1 WHERE t1.date = (SELECT MIN(date) FROM login_records WHERE user_id = t1.user_id) ``` 解释一下这个 SQL 语句。首先,我们使用左连接将每个新登录用户的记录和其第二天的记录连接起来,连接条件是用户相同且日期相差1天。然后,我们使用 WHERE 子句过滤出每个用户的第一条记录,并计算总登录用户数、留存用户数和留存率。其中,COUNT(DISTINCT t1.user_id) 表示总登录用户数,COUNT(DISTINCT t2.user_id) 表示留存用户数,COUNT(DISTINCT t2.user_id) / COUNT(DISTINCT t1.user_id) 表示留存率。 注意,这里使用了子查询来找到每个用户的第一条记录,具体做法是在 WHERE 子句中使用了一个标量子查询,该子查询返回每个用户的最早登录日期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值