贪心+huffman编码+模拟退火+分治(一)
(一)贪心
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
Input输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。Sample Input
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
Sample Output
5
解题思路:贪心思路:将每个数据用pair储存起来,根据结束时间进行从小到大排序,在循环模拟时,若果下一个的起始时间<上一个的结束时间,
则可以++,并将该结束时间作为下回判断的结束时间;否则循环下一个。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define x first
#define y second
using namespace std;
const int N=;
typedef pair<int,int> PII;
int t;
PII f[N];
int main()
{
int s,e,i,j,n;
while(scanf("%d",&n)&&n)
{
for(i=;i<n;i++)
{
scanf("%d%d",&s,&e);
f[i].x=e,f[i].y=s;
}
sort(f,f+n);
int ans=;
int tem=f[].x;
for(i=;i<n;i++)
{
if(f[i].y>=tem)
{
ans++;
tem=f[i].x;
}
}
cout<<ans<<endl;
}
return ;
}
2.B - 迷瘴
幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满了骷髅。由于此处长年不见天日,导致空气中布满了毒素,一旦吸入体内,便会全身溃烂而死。
幸好yifenfei早有防备,提前备好了解药材料(各种浓度的万能药水)。现在只需按照配置成不同比例的浓度。
现已知yifenfei随身携带有n种浓度的万能药水,体积V都相同,浓度则分别为Pi%。并且知道,针对当时幽谷的瘴气情况,只需选择部分或者全部的万能药水,然后配置出浓度不大于 W%的药水即可解毒。
现在的问题是:如何配置此药,能得到最大体积的当前可用的解药呢?
特别说明:由于幽谷内设备的限制,只允许把一种已有的药全部混入另一种之中(即:不能出现对一种药只取它的一部分这样的操作)。
Input输入数据的第一行是一个整数C,表示测试数据的组数;
每组测试数据包含2行,首先一行给出三个正整数n,V,W(1<=n,V,W<=100);
接着一行是n个整数,表示n种药水的浓度Pi%(1<=Pi<=100)。
Output对于每组测试数据,请输出一个整数和一个浮点数;
其中整数表示解药的最大体积,浮点数表示解药的浓度(四舍五入保留2位小数);
如果不能配出满足要求的的解药,则请输出0 0.00。
Sample Input
3
1 100 10
100
2 100 24
20 30
3 100 24
20 20 30
Sample Output
0 0.00
100 0.20
300 0.23
解题思路:贪心思路就是优先选择浓度低的,对所有解药进行sort排序,再结合前缀和,从后往前进行遍历,找到第一个浓度小于等于目标浓度的体积时
结束,输出;特别注意:double x=((s[i]*1.0/100)*v)/((i+1)*v);
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int c,n,v;
int f[],s[];
int w;
int main()
{
int i,j;
cin>>c;
while(c--)
{
cin>>n>>v>>w;
for(i=;i<n;i++)
cin>>f[i];
double dow=w/100.00;
sort(f,f+n);
s[]=f[];
for(i=;i<n;i++)
{
s[i]=s[i-]+f[i];
}
bool flag=false;
for(i=n-;i>=;i--)
{
double x=((s[i]*1.0/)*v)/((i+)*v);
if(x<dow||fabs(x-dow)<1e-)
{
flag=true;
cout<<(i+)*v<<" ";
printf("%.2f\n",x);
break;
}
}
if(flag==false)
cout<<"0 0.00"<<endl;
}
return ;
}
(二)模拟退火
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
Can you find the minimum value when x is between 0 and 100.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)
Output
Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100.Sample Input
2
100
200
Sample Output
-74.4291
-178.8534
解题思路:该题可用二分的思想来解决。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double find(double x,double y)
{
return *pow(x,)+*pow(x,)+*pow(x,)+*pow(x,)-y*x;
} double check(double y)
{
double l=,r=;
while(r-l>1e-)
{
double mid=(l+r)/;
double rmid=(mid+r)/;
if(find(mid,y)<find(rmid,y))
r=rmid;
else
l=mid;
}
return l;
} int main()
{
int t,i;
double y;
cin>>t;
while(t--)
{
cin>>y;
double key=check(y);
printf("%.4f\n",find(key,y));
}
return ;
}
贪心+huffman编码+模拟退火+分治(一)的更多相关文章
- [老文章搬家] 关于 Huffman 编码
按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...
- Huffman编码
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cstri ...
- 【数据压缩】Huffman编码
1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...
- 优先队列求解Huffman编码 c++
优先队列小析 优先队列的模板: template <class T, class Container = vector<T>,class Compare = less< ...
- Huffman编码实现电文的转码与译码
//first thing:thanks to my teacher---chenrong Dalian Maritime university /* 构造Huffman Tree思路: ( ...
- huffman 编码
huffman压缩是一种压缩算法,其中经典的部分就是根据字符出现的频率建立huffman树,然后根据huffman树的构建结果标示每个字符.huffman编码也称为前缀编码,就是每个字符的表示形式不是 ...
- 基于二叉树和数组实现限制长度的最优Huffman编码
具体介绍详见上篇博客:基于二叉树和双向链表实现限制长度的最优Huffman编码 基于数组和基于链表的实现方式在效率上有明显区别: 编码256个符号,符号权重为1...256,限制长度为16,循环编码1 ...
- uvalive 2088 - Entropy(huffman编码)
题目连接:2088 - Entropy 题目大意:给出一个字符串, 包括A~Z和_, 现在要根据字符出现的频率为他们进行编码,要求编码后字节最小, 然后输出字符均为8字节表示时的总字节数, 以及最小的 ...
- Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序
前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...
随机推荐
- Stylized Image Caption论文笔记
Neural Storyteller (Krios et al. 2015) : NST breaks down the task into two steps, which first genera ...
- C# 发送电子邮件(smtp)
相关享目托管在github: https://github.com/devgis/CSharpCodes
- java环境所遇问题
在javac能运行通过并且生成了.class文件但是java文件在运行时通不过出现上面图片情况,试了一上午发现我的和别人好像不一样,下面展示我的情况, 之前用户变量那里新建了一个classpath,不 ...
- 用Tasker实现收到Android手机短信自动转发到邮箱
发送短信到邮箱的原理与 <用Tasker实现收到Android手机短信自动转发到邮箱>有些类似. 发送短信到邮箱是利用Ifttt这个服务将短信转发到邮箱中.Ifttt服务的可扩展性很强, ...
- CodeForces - 559C
学到了学到了,逆元求组合数还有贼神仙的计数DP 太强了! 难受啊
- 使用SonarQube+Eclipse来分析python代码
背景 最近在项目中推广集成测试的理念以及相关工具,在jenkins中集成sonar去分析项目的java代码的时候,意外的发现,sonarqube上还有对应python的插件,而自己写的测试工具大部分都 ...
- 20191121-8 Scrum立会报告+燃尽图 04
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/10068 一: 组名:组长组 组长:杨天宇 组员:魏新 罗杨美慧 王歆瑶 ...
- CSP201803-4棋局评估
问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先.当同一种棋子占据一行.一列或一条对角 ...
- 关于非旋FHQ Treap的复杂度证明
非旋FHQ Treap复杂度证明(类比快排) a,b都是sort之后的排列(从小到大) 由一个排列a构造一颗BST,由于我们只确定了中序遍历=a,但这显然是不能确定一棵树的形态的. 由一个排列b构造一 ...
- JVM探秘:Java内存区域
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 概述 Java 虚拟机为程序员分担了很多内存管理的工作,不再像 C/C++ 那样容易出 ...