Robberies

本文探讨了一个有趣的问题:如何在限定被抓风险下,通过抢银行获取最大金额。利用动态规划算法,我们计算在不同风险承受度下,抢劫者能获得的最大金钱总额。文章详细解释了算法思路,并提供了完整的代码实现。

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

题目链接:
https://vjudge.net/contest/279341#problem/B
题目描述:
可怜的POIUYTREWQ最近想买下dota2的商品,但是手头缺钱。他想起了之前看过的一部大片,觉得抢银行也许是个不错的选择。他认为,坏人被抓是因为没有预先规划。于是他在之前的几个月对各大银行进行了一次评估; 评估内容包括安全性和可盗窃金额: 他想知道在在某个风险系数下可以偷窃的最大金额
Input
第一行给出了一个整数T, 表示有T组测试数据. 对于每一组数据,第一行给出了一个浮点数P, 表示POIUYTREWQ允许被抓的最大概率, 和一个整数N,表示他计划去抢劫的N个银行. 接下来N行, 每行给出一个整数数Mj和浮点数Pj.
抢劫银行 j 可获得 Mj 百万美金, 被抓的概率是 Pj .
Output
对于每组数据,每行输出一个整数,表示POIUYTREWQ在被抓概率小于P的情况下,可抢到的最多的金钱。

Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
你可以认为每家银行都是独立的。

Sample Input
3
0.04 3
1 0.02
2 0.03
3 0.05
0.06 3
2 0.03
2 0.03
3 0.05
0.10 3
1 0.03
2 0.02
3 0.05
Sample Output
2
4
6
思路:
题目中给定价值和被抓几率,但是被抓几率不可以用乘积来组合计算,举个例子,
比如第一个银行3%被抓几率,第二个5%被抓几率,那么乘起来会变成0.15%,抢的
越多,被抓几率却越小了,显然不对,因此要转换成不被抓几率,上述例子则变为
第一家97%不被抓,第二家95%不被抓,乘起来就是92.15%,抢的越多,不被抓的
几率越来越小即被抓几率越来越大,这样才是符合常理的
//不被抓几率的最优(大)值,这根答案有什么关系?逆序枚举每一种情况,若此
情况下的dp值即不被抓几率大于等于题目中所给的不被抓几率,那就输出,逆序着
从大到小枚举保证了找到的一个解是最优解。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN =1e4+3;
double dp[MAXN],b[MAXN];
int a[MAXN];
int cmp(double x)
{
	if(fabs(x)<1e-8) return 0;
	else
	return x<0?-1:1;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(dp,0,sizeof(dp));
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		double p;
		int n,w=0;
		cin>>p>>n;
		p=1-p;//不被抓的概率 
		for(int i=0;i<n;i++)
		{
			cin>>a[i]>>b[i];
			w+=a[i];//总的钱 
			b[i]=1-b[i]; //不被抓的概率 
		}
		dp[0]=1;//没偷逃跑概率就是1
		for(int i=0;i<n;i++)
		{
			for(int j=w;j>=a[i];j--)
			{
				dp[j]=max(dp[j],dp[j-a[i]]*b[i]);//把概率当价值,投的所有前 当背包体积;
			}
		}
		for(int i=w;i>=0;i--)
		{
			if(cmp(dp[i]-p)>=0)
			{
				cout<<i<<endl;
				break;
			}
		}
	}
}
<think>我们正在解决一个具体的问题:在Tech.Tablesaw中创建折线图时横坐标无法正常显示。根据引用[1],我们知道Tablesaw使用Plot.ly进行可视化,并且使用构建器模式配置图表。引用[1]中给出了一个散点图的例子,并设置为折线模式,从而形成折线图。但是横坐标没有显示,这可能是配置问题。常见的横坐标不显示的原因:1.数据列类型不正确:横坐标列可能被识别为非数值或非时间类型,导致无法正确显示。2.图表配置问题:可能没有正确设置横坐标轴,或者横坐标轴被隐藏。在Tablesaw中,折线图通常使用`LinePlot`类创建。但引用[1]中提到使用`ScatterTrace`并设置`mode`为`LINE`来创建折线图,这也是一种方法。因此,我们需要检查:-横坐标列的数据类型是否正确(例如,如果是时间序列,是否使用`DateColumn`?如果是数值,是否使用`NumberColumn`?)-是否在创建图表时正确指定了横坐标和纵坐标的列?根据引用[1]的示例,在指定数据列时,使用`robberies.numberColumn("Record")`和`robberies.numberColumn("Robberies")`,这里横坐标是"Record",纵坐标是"Robberies"。如果我们自己的代码中横坐标列不是数值列,比如是字符串(类别)或日期,但被当作数值列处理,或者相反,这可能导致显示问题。另外,我们也可以考虑使用`Plot.show()`来显示图表,并检查是否有错误信息。针对横坐标不显示的解决方案:1.确保数据列类型正确:-如果横坐标是日期,应使用`DateColumn`,并在创建图表时使用`dateColumn`方法。-如果横坐标是数值,使用`NumberColumn`。-如果横坐标是字符串(类别),使用`CategoryColumn`。2.在创建图表时,明确指定横坐标和纵坐标的列。3.检查是否设置了横坐标轴的标题和显示属性(虽然默认是显示的)。4.尝试使用`LinePlot`的专用方法(如果使用折线图的话)或使用`Plot`的工具方法。以下是一个示例代码,展示如何创建一个正确的折线图(假设我们有一个包含日期和数值的表格):```javaTabletable=Table.read().csv("data.csv");DateColumndate=table.dateColumn("Date");NumberColumnvalue=table.numberColumn("Value");//使用LinePlotPlot.show(LinePlot.create("Title",table,"Date","Value"));//或者使用ScatterTrace来模拟折线图(如引用[1]的方式)ScatterTracetrace=ScatterTrace.builder(date,value).mode(ScatterTrace.Mode.LINE).build();Figurefigure=newFigure(trace);Plot.show(figure);```如果横坐标是日期类型,使用`DateColumn`非常重要。如果横坐标是其他类型,比如字符串,那么可能需要使用类别轴,这时可以考虑使用`CategoryColumn`,或者使用`ScatterTrace`并设置横坐标为字符串数组。如果按照以上步骤仍然无法显示横坐标,请检查:-图表是否被正确渲染?是否有其他错误?-横坐标轴是否被其他元素遮挡?尝试调整图表大小或布局。如果问题仍然存在,我们可以尝试显式设置横坐标轴的配置:在Plot.ly中,可以通过`Layout`设置坐标轴。Tablesaw封装了Plot.ly,因此我们可以使用`Layout`对象。例如:```javaScatterTracetrace=ScatterTrace.builder(date,value).mode(ScatterTrace.Mode.LINE).build();Layoutlayout=Layout.builder().xAxis(Axis.builder().title("Date").build()).yAxis(Axis.builder().title("Value").build()).build();Figurefigure=newFigure(layout,trace);Plot.show(figure);```这样显式设置横坐标轴标题和显示属性,可能会解决横坐标不显示的问题。总结步骤:1.确认横坐标列的数据类型,并使用正确的列类型(日期、数值或类别)。2.检查创建图表时传入的列名是否正确。3.尝试显式设置坐标轴(包括标题等)以确保坐标轴显示。4.使用`LinePlot`的专用方法或使用`ScatterTrace`构建折线图。如果问题仍然存在,请提供更多代码细节,以便进一步排查。相关问题:1.如何在Tablesaw中创建柱状图?2.Tablesaw支持哪些类型的图表?3.如何将Tablesaw图表导出为图片?4.如何设置Tablesaw图表的标题和坐标轴标签?</think> ### Tech.Tablesaw 折线图横坐标不显示的解决方案 在 Tablesaw 中使用 Plot.ly 创建折线图时,横坐标不显示通常是由数据绑定或图表配置问题导致的。以下是完整的排查和解决方案: #### 🔍 原因分析 & 解决方案 1. **数据类型不匹配** - **问题**:横坐标列包含非数值/非日期数据(如字符串),导致无法渲染坐标轴 - **解决**:确保横坐标列是 `DateColumn` 或 `NumberColumn` ```java // 检查列类型 System.out.println(robberies.column("Record").type()); // 应输出 DATE 或 NUMBER ``` 2. **数据绑定错误** - **问题**:未正确绑定横坐标列或使用 `numberColumn()` 读取类别数据 - **解决**: ```java // 正确绑定日期列(示例) DateColumn record = robberies.dateColumn("Record"); NumberColumn values = robberies.numberColumn("Robberies"); ScatterTrace trace = ScatterTrace.builder(record, values) // ⚠️ 用DateColumn作横坐标 .mode(ScatterTrace.Mode.LINE) .build(); ``` 3. **坐标轴配置缺失** - **问题**:Plot.ly 默认可能隐藏无标签的坐标轴 - **解决**:显式设置坐标轴标题 ```java Layout layout = Layout.builder() .title("抢劫案件趋势") .xAxis(Axis.builder().title("日期").build()) // 强制显示横坐标 .yAxis(Axis.builder().title("案件数量").build()) .build(); Plot.show(new Figure(layout, trace)); ``` 4. **空值/异常数据处理** - **问题**:横坐标数据含空值或格式错误 - **解决**:清理数据 ```java // 删除无效记录 robberies = robberies.dropRowsWithMissingValues("Record"); ``` #### 🛠️ 完整修复示例 ```java // 1. 准备数据 Table robberies = Table.read().csv("data.csv"); // 2. 验证列类型 DateColumn dates = robberies.dateColumn("Record"); if(dates.isEmpty()){ throw new IllegalStateException("横坐标列必须包含有效日期数据"); } // 3. 创建折线图 ScatterTrace trace = ScatterTrace.builder( dates, // 横坐标必须用DateColumn robberies.numberColumn("Robberies") ) .mode(ScatterTrace.Mode.LINE) .name("案件趋势") .build(); // 4. 强制显示坐标轴 Layout layout = Layout.builder() .xAxis(Axis.builder().title("日期").visible(true).build()) .build(); // 5. 渲染图表 Plot.show(new Figure(layout, trace)); ``` #### ⚡ 调试技巧 1. 临时改用散点图验证数据: ```java Plot.show(ScatterPlot.create("调试", robberies, "Record", "Robberies")); ``` 2. 检查数据范围: ```java System.out.println("横坐标范围: " + dates.min() + " 至 " + dates.max()); ``` 3. 使用简单数据测试: ```java // 生成测试数据 DateColumn testX = DateColumn.create("testDate"); testX.append(LocalDate.now()); NumberColumn testY = DoubleColumn.create("testY", new double[]{10}); ``` > 💡 **技术提示**:Tablesaw 0.43+ 已优化坐标轴渲染逻辑,建议升级版本解决历史兼容性问题[^1]。 📌 **关键注意**:当横坐标为日期时: - 确保日期格式统一(使用 `DateColumn` 自动转换) - 避免跨度过大(如 100 年以上)导致 Plot.ly 自动缩放隐藏刻度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值