hdu 4546 输入n个数 问这n个数相加组成的第K小的数是什么
比赛难度
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 534 Accepted Submission(s): 162
假设题目的数量一共是n道,这些题目的难度被评级为一个不超过1000的非负整数,并且一场比赛至少需要一个题,而这场比赛的难度,就是所有题目的难度之和,同时,我们认为一场比赛与本场题目的顺序无关,而且题目也不会重复。
显而易见,很容易得到如下信息:
假设比赛只用1个题目,有n种方案;
假设比赛使用2个题目,有(n-1)*n/2种方案;
假设比赛使用3个题目,有(n-2)*(n-1)*n/6种方案;
............
假设比赛使用全部的n个题目,此时方案只有1种。
经过简单估算,小明发现总方案数几乎是一个天文数字!
为了简化问题,现在小明只想知道在所有的方案里面第m小的方案,它的比赛难度是多少呢?
每组测试数据第一行为两个整数n, m(0 < n, m <= 10000),表示现在有n个题目,现在要求第m小的方案的比赛难度。接下来第二行有n个数字,分别表示这n个题目的难度值。
思路 :
用一个结构体
struct haha
{
int sum;//当前的大小
int nextsum;//如果加上下一个值总的sum大小
int nextid;//下一个值对应的id
bool operator<(const struct haha &b)const
{return b.nextsum < nextsum;}//按照nextsum,较小的优先出队 这样每次优先队列pop出的值都会保证是最小的 因为pop出的结构体对应的sum加上下一个数值(即nextsum)是最小的
}temp,q;
在pop后 是否加上a[ith]都要考虑进去
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,a[11111],k;
struct haha
{
int sum;
int nextsum;
int nextid;
bool operator<(const struct haha &b)const
{return b.nextsum < nextsum;}
}temp,q;
void solve()
{
sort(a,a+n);
priority_queue<struct haha>que;
q.sum=0;q.nextsum=a[0];q.nextid=0;
que.push(q);
int cnt=0;
a[n]=0;
while(cnt<m)
{
temp=que.top();
que.pop();
if(temp.nextid>=n) continue;
q.sum=temp.sum;q.nextsum=temp.sum+a[temp.nextid+1];q.nextid=temp.nextid+1;
que.push(q);
q.sum=temp.nextsum;q.nextsum=temp.nextsum+a[temp.nextid+1];q.nextid=temp.nextid+1;
que.push(q);
cnt++;
}
for(int i = 0; !que.empty(); i ++) {a[i] = que.top().sum; que.pop();}
sort(a,a+m);
printf("Case #%d: %d\n",k,a[m-1]);
}
int main()
{
int cas,i,j;
scanf("%d",&cas);
while(cas--)
{
k++;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++) scanf("%d",&a[i]);
solve();
}
return 0;
}
hdu 4546 输入n个数 问这n个数相加组成的第K小的数是什么相关推荐
- 【代码源 Div1 - 108】#464. 数数(主席树,区间比k小的数的个数)HDU4417
problem solution 主席树查询区间比k小的数的个数 建树之后直接在目标区间的主席树内将 H 作为挡板递归计数. #include<bits/stdc++.h> using n ...
- hdu 3949(线性基模版) 异或和中第k小的数
传送门 给定 n(n \le 10000)n(n≤10000) 个数 a_1, a_2, \ldots, a_na1,a2,-,an,以及 Q(Q\le 10000)Q(Q≤1000 ...
- 最小的k个数(第k小的数)
1. 利用快排的思想,由于每次只选择左右部分中的一部分,因此时间复杂度为O(n). # -*- coding:utf-8 -*- class Solution:# (O(n)复杂度)def GetLe ...
- java快排,找第K小的数,找前K个数
import java.util.Random;public class Main {//时间复杂度,即步骤数public static int sum =0;public static void m ...
- 从2个有序数组中找第k小那个数
系列文章目录 提示:AC==accepted,即LeetCode上提交代码通过,我刷题的代码用的是java,但是C++一个道理,算法思想一样,而且c++和java非常类似,python需要自己写,但是 ...
- c语言while输入n求n个奇数,任意输入n个整数,输出这n个数中的奇数个数和偶数个数.用while语句...
C语言 输入n并输入n个数,输出这n个数中的所有奇数的乘积 #includevoidmain(){inti,n,arr[100],mul=1;printf("请输入n值:");sc ...
- ACMNO.41C语言-数字调序 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数
题目描述 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图. 写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 输入 输入数据的个数n n个整数 移动的位置m ...
- c语言代码,输入两个数,输出第一个数到第二个数之间所有的数
用C语言实现,输入两个数,输出第一个数到第二个数之间包含的所有数 #include <stdio.h> int num(int x, int y); int main() {int a1, ...
- C语言 输入一个字符串,统计字符个数,并按照倒序输出该字符串。
题目:C语言 输入一个字符串,统计字符个数,并按照倒序输出该字符串. #include<stdio.h>void main() {char str[10];scanf("%s&q ...
最新文章
- ios 贝塞尔曲线 颜色填充_IOS 贝塞尔曲线(UIBezierPath)属性、方法整理
- [云炬创业基础笔记]成长资源培养与控制
- html自动get,HTML Get
- 阿里云云计算ACP考试知识点(标红为重点)
- 孙叫兽进阶之路之敏捷开发
- 设计模式 - 单例模式(Singleton Pattern)
- prerenderspaplugin 打包完成后如何让百度收录_网站优化技术第一篇(如何快速提升网站的收录量?)...
- 字典的增删改查 daty 5
- C++11新特性——auto和decltype
- LintCode—删除链表中的元素(452)
- 人工智能技术与现代应用
- 喝咖啡的好处和坏处及注意事项
- 80后 程序猿 单恋10年,是一种怎样的体验?
- TextRank算法学习笔记
- 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)
- 三款正射图合并软件性能对比
- Linux管道命令(pipe)
- python自带的程序编辑器有哪些菜单_python自带的编辑器是
- 聚划算的下沉市场生意
- 软件安装和点亮流水灯
热门文章
- 微信打不开怎么回事?分享解决办法
- iOS设备播放mkv格式视频无声音解决
- 国内快速下载keil的pack文件包
- DM642接CMOS摄像头驱动(OV7725)终于搞定了
- 杭电计算机学院毕业要求,杭州电子科技大学关于攻读博士学位研究生培养工作的规定...
- 解决ssh: connect to host github.com port 22: Connection refused
- 预见2019,链塔专家寄语(三) | 链塔新春特别活动
- 汉仪尚巍手书_汉仪尚巍手书字体下载|
- Qt 实现自定义Ui控件例子,以自定义的Slider为例(QWidget)
- xml 转 txt (亲测有效)