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

二分练习题(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序UI组件库合集

文章目录 前言参考地址推荐组件库1.官方WeUI&#xff08;建议使用☆☆☆☆&#xff09;2.ColorUI&#xff08;广告很多&#xff0c;不建议使用&#xff09;3.vantUI又名&#xff1a;ZanUI&#xff08;操作简单&#xff0c;建议使用☆☆☆☆&#xff09;4.MinUI&#xff08;比较…

摊牌了,我不装了~各种Amazon Bedrock小样儿、试用装,今天免费!

探索世界顶级的大模型、智能体、文生图、对话机器人……新手&#xff1f;还是专家&#xff1f;加入我们&#xff0c;解锁精彩内容&#xff1a; l 初体验&#xff1a;在 Amazon Bedrock Playground 直接调用强大的大模型&#xff0c;点亮生成式AI技能树。 l 文生图&#xff1a…

(vue3)基于vite+vue3+element-plus项目创建

(vue3)基于vitevue3element-plus项目创建 vue.js官方中文文档&#xff1a;https://cn.vuejs.org/guide/quick-start.html vite官方中文文档&#xff1a;https://cn.vitejs.dev/guide/ element-plus官网&#xff1a;https://element-plus.org/zh-CN/guide/installation.html 第…

python学习笔记-10

面向对象编程-下 1.私有化属性 语法&#xff1a;两个下划线开头&#xff0c;声明该属性为私有&#xff0c;不能在类的外部被使用或直接访问。 使用私有化属性的场景&#xff1a; 1.把特定的一个属性隐藏起来&#xff0c;不让类的外部进行直接调用。 2.不让属性的值随意改变。…

微服务开发与实战Day08 - Elasticsearch

一、初始Elasticsearch 高性能分布式搜索引擎 1. 认识和安装 1.1 认识 Lucene是一个Java语言的搜索引擎类库&#xff0c;是Apache公司的顶级项目&#xff0c;由DougCutting于1999年研发。官网地址&#xff1a;Apache Lucene - Welcome to Apache Lucene Lucene的优势&…

RabbitMQ(七)Shovel插件对比Federation插件

文章目录 Shovel和Federation的主要区别&#xff08;重点&#xff09;一、启用Shovel插件二、配置Shovel三、测试1、测试计划2、测试效果发布消息源节点目标节点 Shovel和Federation的主要区别&#xff08;重点&#xff09; • Shovel更简洁一些 • Federation更倾向于跨集群使…

基于JSP技术的个性化影片推荐系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPServlet 工具&#xff1a;MyEclipse、Tomcat、MySQL 系统展示 首页 …

Golang——channel

channel是Go在语言层面提供的协程间的通信方式。通过channel我们可以实现多个协程之间的通信&#xff0c;并对协程进行并发控制。 使用注意&#xff1a; 管道没有缓冲区时&#xff0c;从管道中读取数据会阻塞&#xff0c;直到有协程向管道中写入数据。类似地&#xff0c;向管道…

内网安全[3]-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线

1.环境 隧道技术: 隧道技术是一类网络协议&#xff0c;它是一种数据包封装技术&#xff0c;它将原始IP包&#xff08;其报头包含原始发送者和最终目的地&#xff09;封装在另外一个数据包&#xff08;称为封装的IP包&#xff09;的数据净荷中进行传输&#xff0c;使用隧道的原…

V4和V6双栈处理

现进行双栈 对R1 对R2 对R3 对R4 路由地址配完&#xff0c;起协议 然后起ripng&#xff0c;在R2&#xff0c;R3&#xff0c;R4上都宣告一下 然后在PC1和PC2上都手动配置一下就可以了

第1章 MySQL数据库概述

1.1 基本概念 数据库是什么&#xff1f; 存储数据的地方 DB&#xff1a;数据库&#xff08;Database&#xff09; 为什么要用数据库&#xff1f; 因为应用程序产生的数据是在内存中的&#xff0c;如果程序退出或者是断电了&#xff0c;则数据就会消失。使用数据库是为了…

CVPR上新 | 从新视角合成、视频编解码器、人体姿态估计,到文本布局分析,微软亚洲研究院精选论文

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 本周&#xff0…

DLS平台:美联储松绑预期升温,金价飙升至2365美元

摘要 美联储鹰派官员古尔斯比对降息态度有所松动&#xff0c;导致金价一度升至2365美元。市场对美联储未来的货币政策预期有所改变&#xff0c;黄金作为避险资产的吸引力增强。本文将详细分析美联储官员态度变化对金价的影响、当前市场对黄金的预期及其未来走势。 美联储官员态…

Spring Boot中的各种事件

spring boot 各种事件贯穿整个启动的生命周期&#xff0c;读懂了这些事件也差不多理解了springboot的启动流程。 SpringApplicationRunListener中的事件 接口org.springframework.boot.SpringApplicationRunListener定义了spring启动过程中各个事件被触发的顶层方法 public …

JavaScript的学习之强制类型转换

目录 一、什么是强制类型转换 二、其他类型转化为String类型 方式一&#xff1a;调用被转化数据类型的toString()方法 方式二&#xff1a;调用String函数&#xff0c;并将我们要转换的数据添加进去为参数 三、其他类型转化为Number类型 方式一&#xff1a;使用Number()函数…

Python有哪些就业方向?就业市场广阔!

Python是一种跨平台的计算机程序设计语言&#xff0c;是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python语言在人工智能的发展下&#xff0c;越来越多计算机企业开始广泛使用&#xff0c;同时Python的就业方向也逐渐广阔。 YesPMP为学习Python的技术人员…

【环境变量问题:计算机删除环境变量的恢复方法;此环境变量太大。此对话框允许将值设置为最长2047个字符】

不小心误删了win10系统环境变量可以试试下文方法恢复。 本方法针对修改环境变量未重启的用户可以使用&#xff0c;如果修改环境变量&#xff0c;然后还重启了&#xff0c;只能说重新来。 方法一&#xff1a;使用命令提示符恢复 被修改的系统Path只是同步到了注册表中&#x…

QListWidget、QMenu、Action、customContextMenuRequested

QListWidget的初始化、清空、Append添加、Insert添加、删除item QListWidget的事件的使用 QToolBox的使用&#xff0c;每个Page可以添加其他控件 QToolBar使用代码添加QMenu,QMenu添加3个Action QToolButton绑定Action 布局 其中 QSplitter比较特殊&#xff0c; 允许在水平或垂…

策略模式:applicationContext.getBeansOfType()方法

applicationContext.getBeansOfType() 一般用来获取某个接口的所有实例Bean 方法定义如下&#xff1a; 入参一般是接口&#xff0c;即interface。响应是个Map结构&#xff0c;key bean在容器中的名称&#xff0c;value bean实列 开发步骤&#xff1a; 1.定义接口 2.定义…

NGINX_十八 nginx 访问控制

十八 nginx 访问控制 1 nginx 访问控制模块 &#xff08;1&#xff09;基于IP的访问控制&#xff1a;http_access_module &#xff08;2&#xff09;基于用户的信任登录&#xff1a;http_auth_basic_module 2 基于IP的访问控制 2.1 配置语法 Syntax&#xff1a;allow addr…