Codeforces Gym 101522E Expected Score【模拟】

本文解析了一道来自CodeForces的模拟题,通过详细分析题目的背景、操作流程及期望值计算,提供了清晰的解题思路。文章讨论了四种不同情况下的得分策略,并给出了实现代码,帮助读者理解如何最大化最后一轮操作的得分期望。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:https://codeforces.com/gym/101522/problem/E
在这里插入图片描述
在这里插入图片描述
★这题就是一道模拟,难度不大,但是我题目看不懂,很难受awa~


翻译:

有2*n个盒子,标号为1到n,每个标号标记盒子2次。盒子的标号是不可见的(除非操作的时候取出),现在有r轮操作,每次从2n个箱子里任意取2个盒子,如果盒子标号相同,那么这轮得分即为标号;否则为0 。已经进行了r-1次操作,现在想让这最后一次操作的得分最大,求这个最大的期望


思路:

可以分4种情况讨论:
①:保守的情况,在这r-1次操作中的最大得分 可能就是最大期望,记为tmp
②:如果想比保守的情况大,那当然在 tmp+1 到n里面找,如果这里面已经有出现过两次的标记,那肯定是比①大的
③:然后就是只出现过一次的标记,(也是在tmp+1到n里面找,下面也一样,原因不用说吧 ),cnt为没有开过的箱子的数目,那匹配成功的概率是 1.0/cnt (表格里面的 i 不严谨,大家心里明白就好

tmpi
1-(1.0/cnt)1.0/cnt

④:如果有很大的数一次都没出现,那么只能 摸鱼 了,高中数学中排列组合: 概率= 2.0/(cnt*(cnt-1)

tmpii+1
1-tot2.0/(cnt*(cnt-1)2.0/(cnt*(cnt-1)
有些变量不清楚意思的话 详见代码~

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
const int maxn=2e5+5;
const int sz=1<<6;
const int mod=1e9+7;
const int inf=2e9+7;
typedef long long LL;
int n,m;
int num[maxn];
bool vis[maxn];
template<class T>
inline void read(T &x)
{
    char c; x=1;
    while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
    T res=c-'0';
    while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
    x*=res;
}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        memset(num,0,sizeof num);
        memset(vis,0,sizeof vis);
        LL cnt=2*n;
        int tmp=0;
        while(--m){
            int p1,p2,n1,n2;
            scanf("%d%d%d%d",&p1,&p2,&n1,&n2);
            if(!vis[p1]){
                vis[p1]=1;
                num[n1]++;
                cnt--;
            }
            if(!vis[p2]){
                vis[p2]=1;
                num[n2]++;
                cnt--;
            }
            if(n1==n2) tmp=max(tmp,n1);
        }
        double ans=0,sum=0,tt=cnt*(cnt-1)*1.0/2,tot=0;
        for(int i=tmp+1;i<=n;i++){
            if(num[i]==2){
                ans=max(tmp,i);
            }
        }
        for(int i=tmp+1;i<=n;i++){
            if(num[i]==1){
                 ans=max(ans,i*1.0/cnt+tmp*1.0*(1-1.0/cnt));
            }
        }
        for(int i=tmp+1;i<=n;i++){
            if(num[i]==0&&i!=tmp){
                tot+=1.0/tt;
                sum+=i*1.0/tt;
            }
        }
        sum+=(1-tot)*tmp;
       printf("%.6lf\n",max(ans,sum));
    }
    return 0;
}

1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值