二分练习题(C. Earning on Bets)

news2024/11/29 6:25:45

二分练习题(C. Earning on Bets)

原题链接:点击此处
在这里插入图片描述

Earning on Bets

题面翻译

有人提议让您玩一个游戏。在这个游戏中,有 n n n 种可能的结果,对于每一种结果,您都必须下注一定整数的硬币。如果 i i i 的结果是赢,您将获得与您在该结果上的投注额相等的硬币,再乘以 k i k_i ki。请注意, n n n 个结果中有且只有一个结果是赢的。

你的任务是决定如何分配硬币,以便在出现任何获胜结果时都能获胜。更正式地说,你对所有结果下注的硬币总数必须严格地小于每个可能获胜的结果所得到的硬币数量。

题目描述

You have been offered to play a game. In this game, there are $ n $ possible outcomes, and for each of them, you must bet a certain integer amount of coins. In the event that the $ i $ -th outcome turns out to be winning, you will receive back the amount of coins equal to your bet on that outcome, multiplied by $ k_i $ . Note that exactly one of the $ n $ outcomes will be winning.

Your task is to determine how to distribute the coins in such a way that you will come out ahead in the event of any winning outcome. More formally, the total amount of coins you bet on all outcomes must be strictly less than the number of coins received back for each possible winning outcome.

输入格式

Each test consists of multiple test cases. The first line contains a single integer $ t $ ( $ 1 \le t \le 10^4 $ ) — the number of test cases. The description of the test cases follows.

The first line of each test case contains a single integer $ n $ ( $ 1 \le n \le 50 $ ) — the number of outcomes.

The second line of each test case contains $ n $ integers $ k_1,k_2,\ldots,k_n $ ( $ 2 \le k_i \le 20 $ ) — the multiplier for the amount of coins if the $ i $ -th outcome turns out to be winning.

It is guaranteed that the sum of $ n $ over all test cases does not exceed $ 2 \cdot 10^5 $ .

输出格式

For each test case, output $ -1 $ if there is no way to distribute the coins as required. Otherwise, output $ n $ integers $ x_1, x_2,\ldots, x_n $ ( $ 1 \le x_i \le 10^{9} $ ) — your bets on the outcomes.

It can be shown that if a solution exists, there is always a solution that satisfies these constraints.

If there are multiple suitable solutions, output any of them.

样例 #1

样例输入 #1

6
3
3 2 7
2
3 3
5
5 5 5 5 5
6
7 9 3 17 9 13
3
6 3 2
5
9 4 6 8 3

样例输出 #1

27 41 12 
1 1 
-1
1989 1547 4641 819 1547 1071 
-1
8 18 12 9 24

提示

In the first test case, the coins can be distributed as follows: $ 27 $ coins on the first outcome, $ 41 $ coins on the second outcome, $ 12 $ coins on the third outcome. Then the total amount of coins bet on all outcomes is $ 27 + 41 + 12 = 80 $ coins. If the first outcome turns out to be winning, you will receive back $ 3 \cdot 27 = 81 $ coins, if the second outcome turns out to be winning, you will receive back $ 2 \cdot 41 = 82 $ coins, if the third outcome turns out to be winning, you will receive back $ 7 \cdot 12 = 84 $ coins. All these values are strictly greater than $ 80 $ .

In the second test case, one way is to bet one coin on each of the outcomes.

题目意思

 给出一个序列k,让你自己再构造出来一个序列a,序列a的总和s,确保 k i ∗ a i > = s k_i*a_i>=s kiai>=s。答案可能有很多个,只需输出一个即可。数据范围可以参考上文的范围。

思路

 个人感觉,这一题的难度就在于如何找到序列a的总和s,总和s一旦找出来,问题就很轻松的解决了,一开始将数据范围看错了,误以为总和s最大为 2 e 5 2e5 2e5了,就将s当成200000来算,结果一直过不去,后来才发不止那么简单。重新思考一下,我们可以利用二分的思想,我们可以二分出来一个最小的s值且这个s的值符合序列a的要求。问题在于我们如何将s二分出来呢?
我们可以发现 k i ∗ a i > = s k_i*a_i>=s kiai>=s,转换一下 a i > = s / k i + 1 a_i>=s/k_i+1 ai>=s/ki+1,利用这个思想我们就可以写出来check函数里面的内容了。

//check函数内容如下
bool check (int x) {
	int sum=x;
	for (int i=1;i<=n;i++) {
		sum-=x/a[i];
	}
	return sum>=n;
}

 check函数一旦写出来,我们就找到了s的值,这样我们就可以进行代码实现操作了。将 a i a_i ai的值赋值为 s / k i + 1 s/k_i+1 s/ki+1,每一个 a i a_i ai都这样写,最后一个看情况而定,途中判断是否能赋值完成,如果完不成就输出-1

//利用map<PII,int>来存住大小和位置,以解决相同大小的情况
	int pos=l,pp=l;//定义两个变量,pos是总值一直不变,pp一直变换,如果途中小于0,就输出-1
	int k=0;int f=1;
	for (int i=1;i<=n;i++) {
		if (i==n) {
			int t=pos/a[i]+1;
			if (t<=pp)
			mp[{a[i],i}]=pp;
			else f=0;
			continue;
		}//特判最后一个
		mp[{a[i],i}]=(pos/a[i])+1;
		pp-=mp[{a[i],i}];
		if (pp<=0) {
			f=0;
		}
	}
	if (f==0) {
		cout<<"-1"<<'\n';
	}
	else {
		for (int i=1;i<=n;i++) {
			cout<<mp[{a[i],i}]<<' ';//输出即可
		}
		cout<<'\n';
	}

 下面附上AC代码(仅供参考)

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
#define fi first
#define se second
#define PII pair<int,int> 
#define lowbit(x) (x&(-x))
#define ALL(x) x.begin(),x.end() 
using namespace std;
const int N=1e6+5;
int a[N],b[N];
int n;
bool check (int x) {
	int sum=x;
	for (int i=1;i<=n;i++) {
		sum-=x/a[i];
	}
	return sum>=n;
}

void solve()
{
	cin>>n;
	map<PII,int>mp;
	for (int i=1;i<=n;i++) {
		cin>>a[i];
	}
	
	int l=n-1,r=n*(int)1e9+1;
	while (l<r) {
		int mid=l+r>>1;
		if (check(mid)) r=mid;
		else l=mid+1;
	}
	int pos=l,pp=l;
	int k=0;int f=1;
	for (int i=1;i<=n;i++) {
		if (i==n) {
			int t=pos/a[i]+1;
			if (t<=pp)
			mp[{a[i],i}]=pp;
			else f=0;
			continue;
		}
		mp[{a[i],i}]=(pos/a[i])+1;
		pp-=mp[{a[i],i}];
		if (pp<=0) {
			f=0;
		}
	}
	if (f==0) {
		cout<<"-1"<<'\n';
	}
	else {
		for (int i=1;i<=n;i++) {
			cout<<mp[{a[i],i}]<<' ';
		}
		cout<<'\n';
	}
	return ;
}
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int T=1;
	cin >> T;
	while(T--) solve();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1848014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

永辉超市:胖东来爆改,成色几何?

单日业绩暴涨14倍。来&#xff0c;看看&#xff0c;这是被胖东来爆改后重新开业后的门店&#xff0c; 不出意外的流量爆炸。胖东来爆改&#xff0c;真是解决实体商超困境的灵丹妙药吗&#xff1f; 今天我们聊聊——永辉超市 最近两年实体商超日子都不好过&#xff0c;去年13家…

36 - shell之sed

sed grep就是查找文本当中的内容&#xff0c;扩展正则表达式。 一、sed 1.1、sed的定义 sed是一种流编辑器&#xff0c;一次处理一行内容。 如果只是展示&#xff0c;会放在缓冲区&#xff08;模式空间&#xff09;&#xff0c;展示结束&#xff0c;会从模式空间把结果删除…

约束求解器方案设计

1.约束求解介绍 给定一个几何对象&#xff08;点、直线段、圆、圆弧、平面等&#xff09;的集合G和一个关于集合G中几何对象之间约束&#xff08;点的位置、直线段的长度、圆弧对应的圆心角角度、垂直、相切等&#xff09; 的集合C&#xff0c;则在二元组(G&#xff0c;C)中根…

探索全球奇趣,开启你的海外盲盒app开发之旅!

在追求个性化和独特体验的今天&#xff0c;你是否渴望拥有一款能够带你穿越国界、领略世界各地新奇好物的App&#xff1f;为了满足广大用户对于未知的好奇与探索欲望&#xff0c;我们精心打造了一款海外盲盒App&#xff0c;带你踏上一段充满惊喜的全球购物之旅。 一、产品介绍…

DVWA 靶场 Authorisation Bypass 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

山东济南比较出名的起名大师的老师,中国最厉害的改名大师颜廷利:短命的小草,年年自损;长寿的大树,万古长青。。。(升命学说)

在中国第一起名大师的老师颜廷利教授的《升命学说》中&#xff0c;通过“净化论”、“和合法则”、“唯悟主义”以及“镜正理念”的阐述&#xff0c;我们得以窥见生命的不同维度。他以自然界中短命的小草与长寿的大树为例&#xff0c;揭示了生命形态的对比与哲理。 小草&#…

106、从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 提示: 1 < inorder.length < 3000postorder.length inorder.length-3000 < inorder[i]…

远程医疗软件到底哪个好用?

随着科技进步的不断推进&#xff0c;远程医疗已经成为现代医疗体系的一个重要支柱。远程医疗软件&#xff0c;通过网络通信技术的运用&#xff0c;打破了地理限制&#xff0c;实现了医疗资源的有效整合与共享&#xff0c;为民众提供了前所未有的便捷高效的医疗服务体验。那么&a…

期末考后怎样发成绩?

老师们&#xff0c;下周可就是期末考啦&#xff0c;又到了头疼发成绩的时候了。每当这个时候&#xff0c;家长们总是急切地咨询孩子的考试表现&#xff0c;向老师们询问成绩。这种场景几乎成了每学期结束时的常态。 别担心&#xff0c;我来安利一个超棒的工具——“易查分小程序…

跨境多账号需知:指纹浏览器需要用独立IP吗?

指纹浏览器也成为反检测浏览器&#xff0c;旨在安全管理多个账户。在跨境多账号中&#xff0c;多个账号容易引发网站怀疑并最终导致大量账户被暂停&#xff0c;使用反检测浏览器的主要目的是通过创建新的浏览器指纹来隐藏用户的真实浏览器指纹。 但浏览器指纹并不是网站关注的唯…

拒绝吸烟,远离慢阻肺——朗格力复合营养素助力守护肺部健康

#肺科营养#朗格力#班古营养#复合营养素#肺部营养#肺部健康# 你知道吗?慢阻肺这一疾病在我国的患者数量已突破亿级大关,尤其在40岁以上的成年人中,平均每7个人中就有1位可能受其困扰。然而,很多人对慢阻肺的严重性认识不足,常常将其视为一种普通的咳嗽或喘息,忽视了它潜在的危…

为什么伦敦金新手不能用一小时图及以下的时间周期?

刚进入伦敦金市场的投资者&#xff0c;一般不建议使用较低的时间周期&#xff0c;如1小时图或以下。不仅如此&#xff0c;新手或者兼职投资者会被要求使用较高的时间周期交易&#xff0c;如4小时图或日线图&#xff0c;这有什么道理呢&#xff1f;下面我们就来讨论一下。 新手的…

C++初学者指南第一步---11.字符串(基础)

C初学者指南第一步—11.字符串&#xff08;基础&#xff09; 文章目录 C初学者指南第一步---11.字符串&#xff08;基础&#xff09;1. std::string2. char std::string的元素类型3. std::string字符串操作4. 字面量4.1 C风格字符串字面量4.2 "std::string 字面量"s…

河南大学24计算机考研数据,有三个学院招收计算机相关专业,都是考的408!

河南大学&#xff08;Henan University&#xff09;&#xff0c;简称“河大”&#xff0c;是河南省人民政府与中华人民共和国教育部共建高校&#xff0c;国家“双一流”建设高校&#xff0c;入选国家“111计划”、中西部高校基础能力建设工程、卓越医生教育培养计划、卓越法律人…

DBeaver通过jdbc方式连接ES(免证书)

前言 之前其实已经分享过DBeaver连接ES,为什么重新分享一篇,用过的肯定知道,之前那种方式需要ES服务的服务器上装证书,免费证书只能用一个月。这次分享的就是解决这个时间限制问题,但是需要用一个自己开发的jar,而且暂未上到maven的中心库。 一、先看效果 证书方式 自研…

【R语言】地理探测器模拟及分析(Geographical detector)

地理探测器模拟及分析 1. 写在前面2. R语言实现2.1 数据导入2.2 确定数据离散化的最优方法与最优分类2.3 分异及因子探测器&#xff08;factor detector&#xff09;2.4 生态探测器&#xff08;ecological detector&#xff09;2.5 交互因子探测器&#xff08;interaction dete…

labelme 标注岩石薄片数据集流程

labelme 数据标注使用流程 1.打开anaconda环境2.打开labelme工具3.打开数据集文件夹4.开始标注5. 标注完成6. 修改labels.txt文件7. 将标注结果可视化8. 完成json转图片9. 全部命令总结 1.打开anaconda环境 2.打开labelme工具 输入下列两条命令&#xff0c;打开labelme工具 &a…

Type-C诱骗芯片LDR6500

随着科技的飞速发展&#xff0c;电子设备的智能化和便携化已成为趋势。在这个过程中&#xff0c;Type-C接口因其高速传输、正反可插以及强大的扩展能力&#xff0c;逐渐成为主流接口标准。然而&#xff0c;Type-C接口的广泛应用也带来了一系列挑战&#xff0c;其中之一便是如何…

云邮件推送服务如何配置?有哪些优势特点?

云邮件推送的性能怎么优化&#xff1f;如何选择邮件推送服务&#xff1f; 云邮件推送服务是一种基于云计算的邮件发送解决方案&#xff0c;能够帮助企业和个人高效地发送大规模邮件。AokSend将详细介绍如何配置云邮件推送服务&#xff0c;以便你能够充分利用其优势。 云邮件推…

[保姆级教程]uniapp自定义导航栏

文章目录 导文隐藏默认导航栏&#xff1a;全局隐藏当前页面隐藏 添加自定义导航栏视图&#xff1a;手写导航栏组件导航栏 导文 在 UniApp 中&#xff0c;自定义导航栏通常涉及到隐藏默认的导航栏&#xff0c;并在页面顶部添加自定义的视图组件来模拟导航栏的功能。 隐藏默认导航…