• 洛谷T89643 escape


    题目描述

    题目链接:https://www.luogu.org/problem/T89643

    由于 Kiana 实在是太忙了,所以今天的题里面没有 Kiana。 某一天学校里有 n 节课,出题人希望逃掉其中一些课去玩《崩坏 学园 2》。对于第 i 节课来说,如果逃掉的话,在游戏中可以获得 vi 点积分,但是有 pi 的概率被老师发现。 现在出题人希望在逃掉这些课后被发现的概率不超过 P,并在游 戏中获得尽可能高的积分。出题人想知道自己能获得的最高积分是多 少,由于她不会算,所以希望由你告诉她。

    输入格式

    输入文件包括 n+1 行。 第一行包含一个正整数 n 和一个正实数 P,分别表示学校里课的 数目和被发现的概率上界。 接下来 n 行,第 i 行包含一个正整数 vi 和一个正实数 pi,表示逃 掉第i节课在游戏中可以获得vi点积分,但是有pi的概率被老师发现。 以上所有实数保留到小数点后六位。

    输出格式

    输出文件包括一行。 第一行包含一个正整数,表示出题人能获得的最高积分。

    分析:

    由于数组下标只能为整数,所以概率不能用作转移方程的下标(可能有的题乘1e5之类的转换成整数也是可行的,但此处不举(我太菜)),因此可以把概率作为f[i]的值,那i自然就是分数维度,f[i]表示的就是分数为i时的概率;下面来看概率,被发现的概率难以计算,有多种情况,因此我们可以先计算不被发现概率,再用1-即可,下面是AC代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1005;
    int n;
    double P;
    double f[maxn * 10], p[maxn];//f[i]表示当积分为i时,不被发现的概率
    int v[maxn];
    int s;
    int main() {
    	freopen("shuru.txt", "r", stdin);
    	ios::sync_with_stdio(false);
    	cin >> n >> P;
    	for (int i = 1; i <= n; i++) {
    		cin >> v[i] >> p[i];
    		s += v[i];
    	}
    	f[0] = 1;
    	for (int i = 1; i <= n; i++) {
    		for (int j = s; j >= v[i]; j--) {//0,1背包问题滚动数组
    			f[j] = max(f[j], f[j - v[i]] * (1 - p[i]));
    		}
    	}
    	for (int i = s; i >= 0; i--) {
    		if ((P - (1 - f[i])) > 1e-8) {
    			cout << i << endl;
    			return 0;
    		}
    	}
    }
    
  • 相关阅读:
    input 放大镜
    记住密码弹出事件
    thinkphp修改及编写标签库,编辑器的使用
    thinkphp 配合mongodb
    缓存技术
    php面试题目
    pdo 整套类的封装,保存修改查询
    mongodb 的备份恢复导入与导出
    mongodb 分组查询
    smarty 模板的入门使用
  • 原文地址:https://www.cnblogs.com/ACMerLwy/p/11250551.html
Copyright © 2020-2023  润新知