木板

Fence Repair

匿名 (未验证) 提交于 2019-12-03 00:09:02
农夫约翰为了修理栅栏,要将一块很长的木板分割为N块,准备切成的木板的长度为L1,L2......Ln。未切割前木板的长度等于切割后木板的总和,每次切断木板时,需要的开销为这块木板的长度,,例如长度为21的木板要切成长度为8、5、8的三块木板,长为21的木板切成长为13和8时,开销为21,再将长度13的木板切成长度为5和8时开销为13,于是总的开销为34。代码如下: #include <iostream> #include<algorithm> #include<math.h> using namespace std; typedef long long ll; int main() { int MAX_N=3; int N,L[MAX_N];//要求分割为N块,输入数组的长度 cout<<"N="; cin>>N; cout<<"L={"; for(int i=0;i<MAX_N;i++) { cin>>L[i]; // cout<<",\n"<<endl; } cout<<"}"; ll ans=0; //直到计算到木板为1块为止 while(N>1) { //求出最短的板mii1和次短板mii2 int mii1=0,mii2=1;//初始化 if(L[mii1]>L[mii2]) swap(mii1,mii2);//比较最短和最长的,然后交换位置保证最小 for(int i

2019 年 10 月训练赛(10.30)

旧街凉风 提交于 2019-12-03 00:03:53
2019 年 10 月训练赛 题目名称 相似围栏 路径异或 路径乘积 程序文件名 fence pathxor waymul 输入文件名 fence.in pathxor.in waymul.in 输出文件名 fence.out pathxor.out waymul.out 每个测试点时限 1 sec 1 sec 4 sec 测试点数目 10 10 10 每个测试点分值 10 10 10 内存限制 256m 256m 512m 题目类型 传统型 传统型 传统型 1. 相似围栏 (fence.pas/c/cpp) 【问题描述】 何老板购置了一套别墅, 该别墅门口有一片花园, 何老板用 n 块高度不同的木板排成一 排, 搭建了围栏。 一天何老板叫了外卖, 正好是刘郃德骑车送递, 刘被拦在围栏之外, 他发现何老板家的 围栏看起来很好看, 很有高级感。 于是刘郃德也买了 n 块高度不同的木板, 打算参照何老板 的方案, 搭建相似的围栏。 所谓“相似” 是指, 刘郃德的相邻两块木板的高度关系与何老板 对应位置的两块木板的高度关系相同。 比如何老板围栏的第 i 块木板的高度大于第 i+1 块, 那么刘郃德围栏的第 i 块木板的高度也必须大于第 i+1 块。 同时, 刘郃德想要相邻两块木板高度差的绝对值之和尽量大。 请你帮他找出最优方案。 【输入格式】 第一行, 一个整数 n 第二行, n 个整数

【洛谷 2329】栅栏

六月ゝ 毕业季﹏ 提交于 2019-12-01 16:57:07
题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材。于是农夫约翰到木材店购买木材。可是木材店老板说他这里只剩下少部分大规格的木板了。不过约翰可以购买这些木板,然后切割成他所需要的规格。而且约翰有一把神奇的锯子,用它来锯木板,不会产生任何损失,也就是说长度为10的木板可以切成长度为8和2的两个木板。 你的任务:给你约翰所需要的木板的规格,还有木材店老板能够给出的木材的规格,求约翰最多能够得到多少他所需要的木板。 输入格式 第一行为整数m(m<= 50)表示木材店老板可以提供多少块木材给约翰。紧跟着m行为老板提供的每一块木板的长度。 接下来一行(即第m+2行)为整数n(n <= 1000),表示约翰需要多少木材。 接下来n行表示他所需要的每一块木板的长度。木 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> using namespace std; const int N=1050; int a[N],b[N],c[N],n,mid,m,w,tot,sum[N],ans; bool check(int h,int last){ bool ff=false;

Fence Repair

て烟熏妆下的殇ゞ 提交于 2019-11-30 04:26:28
农夫约翰为了修理栅栏,要将一块很长的木板分割为N块,准备切成的木板的长度为L1,L2......Ln。未切割前木板的长度等于切割后木板的总和,每次切断木板时,需要的开销为这块木板的长度,,例如长度为21的木板要切成长度为8、5、8的三块木板,长为21的木板切成长为13和8时,开销为21,再将长度13的木板切成长度为5和8时开销为13,于是总的开销为34。代码如下: #include <iostream> #include<algorithm> #include<math.h> using namespace std; typedef long long ll; int main() { int MAX_N=3; int N,L[MAX_N];//要求分割为N块,输入数组的长度 cout<<"N="; cin>>N; cout<<"L={"; for(int i=0;i<MAX_N;i++) { cin>>L[i]; // cout<<",\n"<<endl; } cout<<"}"; ll ans=0; //直到计算到木板为1块为止 while(N>1) { //求出最短的板mii1和次短板mii2 int mii1=0,mii2=1;//初始化 if(L[mii1]>L[mii2]) swap(mii1,mii2);//比较最短和最长的,然后交换位置保证最小 for(int i

11-盛水最多的容器

谁说胖子不能爱 提交于 2019-11-29 13:52:49
题目:给定一个数组,代表木板的高度。选两个木板,求两个木板的最大盛水量。 def max_area(arrys): l,r = 0,len(arrys)-1 res = 0 while l<r: contain = min(arrys[l],arrys[r])*(r-l) if contain>res: res = contain if arrys[l]<arrys[r]: l+=1 else: r-=1 return res   注:使用前后两个指针向中间移动的策略,获取最大的蓄水量。指针移动策略为短的一侧木板移动。 来源: https://www.cnblogs.com/kingshine007/p/11518908.html

CF985C

五迷三道 提交于 2019-11-28 01:27:36
CF985C 题意: 你要组成N个木桶,组成每个木桶需要K个木块,(第二行给你N*K个木块),使得任意两个木桶之间的差值不超过L的情况,使得所有木桶可以装的水的和最大,输出这个最大和,如果无法满足要求输出0。 解法: 因为众所周知的木板原理,我们考虑贪心,对木板的长度进行排序。 易知,让长度相差小的木板组合比较优。 首先考虑没答案的情况,假设最短的木板为a[0],那么所有木桶中能装水的最小值就确定了为a[0]。所以其他木桶的最短板不能超过a[0]+L,如果范围在a[0]~(a[0]+L)的木板少于N块肯定不行 排序upper_bound求一下即可,假设有pos块。 如满足要求,考虑范围在a[0]~(a[0]+L)木块,我们尽量的使短的木板组合在一起,那么就是[0,k)个组成第一个桶(如果剩余木板还够N-1个),前[K,2 k)个组成第二个桶(如果剩余木板还够N-2个)...前[i K,(i+1)*k)个组成第i个桶(如果剩余木板还够N-i个)。如果选取了i个之后,剩余不够再这样组合了,我们直接从这些木块中选取最后的 N-i 块即可。 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define LL long long #define N

Poj 3253 - Fence Repair 最小堆

本秂侑毒 提交于 2019-11-26 17:41:09
题目大意:FJ需要修补牧场的围栏,他需要 N 块长度为 Li 的木头(N planks of woods)。开始时,FJ只有一块无限长的木板,因此他需要把无限长的木板锯成 N 块长度 为 Li 的木板, Farmer Don提供FJ锯子,但必须要收费的,收费的标准是对应每次据出木块的长度,比如说测试数据中 5 8 8,一开始,FJ需要在无限长的木板上锯下长度 21 的木板(5+8+8=21),第二次锯下长度为 5 的木板,第三次锯下长度为 8 的木板,至此就可以将长度分别为 5 8 8 的木板找出 题目可以转化为Huffman树构造问题 : 给定 N planks of woods, 1.   在 N planks 中每次找出两块长度最短的木板,然后把它们合并,加入到集合A中, 2.  在集合中找出两块长度最短的木板,合并加入到集合A中,重复过程,直到集合A中只剩下一个元素 显然,通过每次选取两块长度最短的木板,合并,最终必定可以合并出长度为 Sum(Li)的木板,并且可以保证总的耗费最少 AC  16MS  440K 1 #include <stdio.h> 2 #include <memory.h> 3 4 const int maxn = 20004 ; 5 const int INF = 0x3F3F3F3F ; 6 7 int nNum; 8 __int64 heap

Count Color--线段树

萝らか妹 提交于 2019-11-25 23:30:30
题目链接: https://vjudge.net/problem/POJ-2777 题目大意 有一个长度为L的木板,T种颜色,O次操作,每次操作时,‘C’表示涂色,‘P’表示询问区间内有几种不同的颜色。涂色时l,r代表的是l区域到r区域。初始木板颜色为1。 分析 线段树更新以及查询。更新不说了,查询时标记一下该颜色,最后统计1--T内有几种被标记的就ok了。注意,0也会被标记,但是不能算在ans里面。 代码 #include<iostream> #include<cstdio> #include<string.h> using namespace std; const int N = 100010; int L,T,O,ans; bool vis[N]; struct node{ int l,r,val; }tr[N<<2]; void pushdown(int m) { if(tr[m].val) { tr[m<<1].val = tr[m].val; tr[m<<1|1].val = tr[m].val; tr[m].val = 0; } } void build(int m,int l,int r) { tr[m].l = l; tr[m].r = r; tr[m].val = 1; if(l == r) return ; int mid = (l + r) >> 1;