【Codeforces Gym】100162 H Temperature

这篇博客讨论了在Codeforces Gym 100162 H Temperature问题中,学生们如何根据已完成实验的同学的温度平均值来填写未完成的报告,并通过随机修正值来模拟这一过程。博主探讨了数据范围和解决方案,特别是利用状态压缩来解决至少有多少学生完成了实验的问题。

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

大意:

有n个学生在做测量温度的实验,但是有些同学还没做完就上交了实验报告。温度的测量值精确到整数。对于第i个同学,如果他做完了实验,那么他的报告中温度值就是他实际的测量值,否则他会这么做:
(1) 在做完实验的同学中找一些人参考(至少能找到一个人参考)。
(2) 求这些人的温度平均值并下取整的到温度t。
(3) 随机修改这个值为 t + random(-xi, xi),random(-xi, xi) 是[-xi~xi]中随机取的一个整数,包含两端的值。
现在知道每个同学提交的温度值ti和随机系数xi,老师想知道至少有多少人做完了实验。
数据范围:n <= 20, 1 <= ti<= 10^6, 0 <= xi <= 10^6。

Solution

n=20,考虑状压
假如有一个集合,集合中的元素表示这个人是做完实验的。
那么 从这个集合中去掉一个元素的集合 能拓展到的人 在原集合中都能拓展到。
那么只需要考虑恰好同时参考了这个集合的所有人的情况转移即可。

#include<stdio.h>
#include<cstring>
#include<algorithm>

int n,cas,f[1050000],r[25],t[25];

int main()
{
    while (~scanf("%d",&n))
    {
        for (int i=1;i<=n;i++) scanf("%d%d",t+i,r+i);
        int lim=1<<n,ans=23333333;
        memset(f,0,sizeof(f));
        for (int i=1,tt=0,adv=0;i<lim;i++,tt=0,adv=0)
        {
            for (int j=1,pj=1;pj<=i;j++,pj<<=1) if (i&pj) f[i]|=f[i^pj]|pj,adv+=t[j],tt++;
            adv=tt?adv/tt:233333333;
            for (int j=1;j<=n;j++) if (t[j]-r[j]<=adv && adv<=t[j]+r[j]) f[i]|=(1<<j-1);
            if (f[i]==lim-1) ans=std::min(ans,tt);
        }
        printf("Case %d: %d\n",++cas,ans);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值