首页 > 其他分享 >E - Kth Takoyaki Set

E - Kth Takoyaki Set

时间:2023-04-15 09:55:24浏览次数:35  
标签:Takoyaki Set int long Kth 答案

E - Kth Takoyaki Set

题目来源:E - Kth Takoyaki Set (atcoder.jp)

题目大致意思:

给你几个数,把他们各种排列的和(每个数字可以多次使用,不一定每个数字都要选)的第k小的ans是多少

思路:

第一想法是背包吧,但是很明显这个作为val的范围第一很大,第二无法确定正确的范围,总之很难写

于是我就想了第二种方法,假设当前可能有n种答案作为当前答案,其中最小的为k,那么下一个答案肯定是已有答案中加上当前最小值k

于是就有了广搜的超时代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<long long>s;//我的第1想法是背包,放弃了,第二想法是广搜
priority_queue<int,vector<int>, greater<int> >q;
signed main(){
	ios::sync_with_stdio(false);
	int n,k;
	cin >> n >> k;
	for(int i=1;i<=n;i++){
		long long p;
		cin >> p;
		q.push(p);
	}
	while(!q.empty()&&s.size()<k){
		int v=q.top();
		q.pop();
		if(s.size()!=0&&v==s[s.size()-1]){
			continue;
		}
		s.push_back(v);
		if(s.size()==k){
			break;
		}
		for(int i=0;i<s.size();i++){
			if(s.size()>=k){
				break;
			}
			q.push(v+s[i]);
		}
	}
	cout<<s[k-1];
	
}

这个代码很容易理解,那么剪肢时间就来了

#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<long long>s;//我的第1想法是背包,放弃了,第二想法是广搜
priority_queue<int,vector<int>, greater<int> >q;
long long val[15];
signed main(){
	ios::sync_with_stdio(false);
	int n,k;
	cin >> n >> k;
	for(int i=1;i<=n;i++){
		long long p;
		cin >> p;
		q.push(p);
		val[i]=p;
	}
	while(!q.empty()&&s.size()<k){
		int v=q.top();
		q.pop();
		if(s.size()!=0&&v==s[s.size()-1]){
			continue;
		}
		s.push_back(v);
		if(s.size()==k){
			break;
		}
//		for(int i=0;i<n;i++){//这里有问题,因为前几个不一定就是1-n 
////			q.push(v+s[i]);
//		}
		//改为 
		for(int i=1;i<=n;i++){
			q.push(v+val[i]);
		}
	}
	cout<<s[k-1];
	
}

思路就是,将原来最小值k加所有已经有的答案作为下一次答案改为了将最小值k加最先给你的那10个数作为下一次答案

为什么,可以想到,在所有已有的答案中,必然有一些是有重复选择的,比如说答案n可能是由a1+a1+a2组成的,而这个肯定比a1、a2大,我们只需要判断a1即可,由此剪了很多很多的时间复杂度

标签:Takoyaki,Set,int,long,Kth,答案
From: https://www.cnblogs.com/linghusama/p/17320566.html

相关文章

  • 0007容器之unordered_multiset
    #include<list>#include<iostream>#include<ve......
  • B. Two Sets
    B.TwoSetshttps://codeforces.com/problemset/problem/468/B 思路对于每个元素,计算其集合归属性, 但是要注意的是,x,a-x如果都存在,并不意味着他们只能出现在A集合中特殊情况下,也可以出现的B集合b-x---x---a-x---b-(a-x) 所以,x,a-x存在或者x,b-x,只能......
  • 【js】setTimeout、Promise、Async/Await 的区别
    三者在事件循环中的是不同的,事件循环中分为宏任务队列和微任务队列 其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行;promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行;async函数表示函数里面可能会有异步方法,a......
  • MFC-SetCursorPos把光标移到屏幕的指定位置
     BOOLbb=SetCursorPos(10,10);//把光标移到屏幕的指定位置//参数1:intx坐标//返回值:如果成功,返回非零值;如果失败,返回值是零    ......
  • JSTL遍历数组,List,Set,Map等集合
    <%int[]ages={1,2,3,4,5};//普通数组,JSTL直接使用JSP赋值表达式来取List<String>names=newLinkedList<String>();//Listnames.add("Biao");names.add("彪");names.add("雷");request.setAttribu......
  • JUnit_setup()和teardown()
    简单的可以这样理解它们,setup主要实现测试前的初始化工作,而teardown则主要实现测试完成后的垃圾回收等工作。 需要注意的是Junit3中每个测试方法执行时都会执行它们,而不是一个类中执行一次,查了查资料,JUnit4版本采用注解的方式可以实现一个类只执行一次,下面看看测试代码: JUnit3.8.......
  • AppSettings.json 配置与获取
    1.第一步在我们的AppSettings.json文件中配置好需要的参数    2.创建一个AppSettingHelp类引用:usingMicrosoft.Extensions.Configuration;usingMicrosoft.Extensions.Configuration.Json;  3.然后我们就可以在Startup中进行调用  stringUrlName=AppSetti......
  • Vulnhub Joy Walkthrough
    Recon这台靶机对枚举的要求较高,如果枚举不出有用的信息可能无法进一步展开,我们首先进行普通的扫描。┌──(kali㉿kali)-[~/Labs/Joy/80]└─$sudonmap-sS-sV-p-192.168.80.136StartingNmap7.93(https://nmap.org)at2023-04-1022:42EDTNmapscanreportfor......
  • Visual Stadio 编译提示 The BaseOutputPath/OutputPath property is not set for pr
    完整的错误信息是:TheBaseOutputPath/OutputPathpropertyisnotsetforproject'xx.csproj'.PleasechecktomakesurethatyouhavespecifiedavalidcombinationofConfigurationandPlatformforthisproject.Configuration='Debug'Plat......
  • windows程序利用setup project项目进行打包安装
    编译好的C++项目可以通过visualstudio的setupproject项目进行打包安装1、利用dumpbin/dependents*.exe命令查看生成的运行文件所依赖的库dll,然后将相应库拷贝到即将打包的文件夹中,需使用x64NativeToolsCommandPromptforVS20192、下载扩展MicrosoftVisualStudio......