T1 收果子

题目

【题目描述】

有一个果园,有n棵果树依次排成一排,其中已知第 i 棵果树上结了ai个果子。现在要按照果树编号顺序依次收果子,对于一个能装v个果树的果篮,收果子从第1棵果树开始,如果果篮的剩余容积大于等于当前果树所结的果子,那么就可以将此树上的果子全收下来,否则就要拿一个新的篮子来装果子。特别地,如果果篮容积小于某果树的结果数,那么我们认为这样将永远不能收完果子。

现在假若只能用k个果篮,问按照以上方法能使用不超过k个果篮并收完所有果子的果篮最小容积。

【输入格式】

输入有两行,第一行两个正整数,代表 n、k,意义如题。

第二行 n 个正整数ai,代表每棵果树的结果数。

【输出格式】

输出仅一行,一个正整数,即满足条件的果篮最小容积。

【样例输入】

9 3

1 2 3 4 5 6 7 8 9

【样例输出】

17

【数据规模】

对于 30% 的数据,满足 n, k≦100、ai≦100 。

对于 60% 的数据,满足 n, k≦1000、ai≦105

对于 80% 的数据,满足 n, k≦10000、ai≦105

对于 100% 的数据,满足 n, k≦105 、ai≦109

解析

很显然这是一道二分题,记得加long long 就行了。

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#define int long long
using namespace std;
const int N=1e5+;
const int INF=0x3f3f3f3f;
int n,k;
int a[N],ans;
int minn=INF;
int maxn=-INF;
bool check(int v)
{
if(maxn>v||minn>v) return ;
int cnt=,water=v;
for(int i=;i<=n;i++)
{
if(a[i]<=water) water-=a[i];
else if(a[i]>water)
{
cnt++;
water=v-a[i];
}
}
if(cnt<=k) return ;
return ;
}
signed main()
{
int l=,r=,mid;
cin>>n>>k;
for(int i=;i<=n;i++)
{
cin>>a[i];
maxn=max(maxn,a[i]);minn=min(minn,a[i]);
r+=a[i];
}
while(l<=r)
{
mid=(l+r)/;
if(check(mid))
{
r=mid-;
ans=mid;
}
else l=mid+;
}
cout<<ans;
return ;
}

T2 食物

题目

【题目描述】

辉夜从月都弄了很多吃的回到了幻想乡,有n种不同的食物,第i种食物的美味度为ti,一份食物的大小为ui,共有vi份。但是麻烦的事情出现了,她要把这些食物运回永远亭,于是辉夜便弄来了m种运载工具。第i种运载工具可以运输大小总和不超过xi​的食物,运输一次的费用是yi,总共可以运输zi次。

辉夜打算选取一些食物运回永远亭,他们的美味度之和(每份食物的和,即使他们都是同一种食物)至少是p。值得注意的是,一份食物可以被拆成几份分批次运输,达到永远亭后再组装起来。但是如果不把一份食物完整的运过去,是无法得到美味度的。辉夜想知道最少需要花费的运输费用是多少。由于辉夜的预算仅有50000,因此如果费用超过这个数或者无法获得p的美味度,输出“TAT”。

【输入格式】

第一行一个数test,表示有test组数据。

对于每组数据,第一行有三个整数n,m,p。

接下来n行,每行三个整数t,u,v,描述一种食物。

最后m行,每行三个整数x,y,z,描述一种运载工具。

【输出格式】

对于每组数据,输出辉夜想知道的答案。注意存在无解的情况。

【输入样例】

4

1 1 7

14 2 1

1 2 2

1 1 10

10 10 1

5 7 2

5 3 34

1 4 1

9 4 2

5 3 3

1 3 3

5 3 2

3 4 5

6 7 5

5 3 8

1 1 1

1 2 1

1 1 1

【样例输出】

4

14

12

TAT

【数据规模】

test不会很大。

对于前20%的数据,n,m≤20。

对于前50%的数据,n,m≤30,ti,ui​,vi,xi,yi,zi≤10。

对于100%的数据,1≤n,m≤200,0≤p≤50000,1≤ti​,ui,vii​,xi​,yi,zi≤100。

解析

我们把问题拆成两部分:

1、选出美味度和不小于p的食物并且空间最小。

2、选出空间之和不小于第一步的结果并且费用尽可能的少。

第一部分只需用背包即可解决。

第二部分我们不妨将状态和答案互换,以费用为状态,以空间为答案,因为答案不超过50000,所以这样是可行的。

Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=;
const int M=;
int n,m,p;
int q,sum,ans;
int t[N],u[N],v[N];
int f[M],W[N*],V[N*];
int read() //快读
{
int num=;char ch=getchar();
while(ch<'' || ch>'') ch=getchar();
while(ch>='' && ch<='') num=(num<<)+(num<<)+ch-'',ch=getchar();
return num;
}
int main()
{
int T=read();
while(T--)
{
//求出最小空间
sum=;
memset(V,,sizeof(V));
memset(W,,sizeof(W));
memset(f,,sizeof(f));
n=read();m=read();p=read();
for(register int i=;i<=n;i++)
{
t[i]=read();u[i]=read();v[i]=read();
int j;
for(j=;j<=v[i];j<<=)
{
V[++sum]=t[i]*j;
W[sum]=u[i]*j;
v[i]-=j;
}
if(v[i])
{
V[++sum]=t[i]*v[i];
W[sum]=u[i]*v[i];
}
}
for(register int i=;i<=sum;i++)
for(register int j=M-;j>=W[i];j--) f[j]=max(f[j],f[j-W[i]]+V[i]);
q=-;
for(register int i=;i<M;i++) if(f[i]>=p){q=i;break;}//求出满足美味度不小于p的最小价值
if(q<)//不成立的情况
{
cout<<"TAT"<<endl;
for(register int i=;i<=m;i++) q=read(),q=read(),q=read();
continue;
}
//求出尽可能小的费用
memset(V,,sizeof(V));
memset(W,,sizeof(W));
memset(f,,sizeof(f));
sum=;
for(register int i=;i<=m;i++)
{
t[i]=read();u[i]=read();v[i]=read();
int j;
//二进制拆分
for(register int j=;j<=v[i];j<<=)
{
V[++sum]=t[i]*j;
W[sum]=u[i]*j;
v[i]-=j;
}
if(v[i])
{
V[++sum]=t[i]*v[i];
W[sum]=v[i]*u[i];
}
}
for(register int i=;i<=sum;i++)
for(register int j=;j>=W[i];j--) f[j]=max(f[j],f[j-W[i]]+V[i]);
ans=-;
for(register int i=;i<=;i++) if(f[i]>=q){ans=i;break;}//求出最小花费
if(ans<){cout<<"TAT"<<endl;continue;}
cout<<ans<<endl;
}
return ;
}

T3 到天堂的路

题目

【题目描述】

到天堂的道路是一个笛卡尔坐标系上一个nxm的长方形通道(顶点在(0,0)和(n,m)),小w从最左边任意一点进入,从右边任意一点走到天堂。

最左最右的距离为n,上下边界距离为m。

其中长方形内有k个Star,每个Star都有一个整点坐标,Star的大小可以忽略不计。

每个Star以及长方形上下两个边缘(宇宙的边界)都有引力,所以为了成功到达heaven小w离他们越远越好。

请问小w走到终点的路径上,距离所有星星以及边界的最小距离最大值可以为多少?

【输入格式】

一行三个整数n,m,k。

接下来k行,每行两个整数xi,yi,表示一个点的坐标。

【输出格式】

一行一个整数表示答案,绝对误差不能超过10-6

【输入样例】

10 5 2

1 1

2 3

【输出样例】

1.11803399

【数据规模】

对于20%的数据,k≤10。

对于50%的数据,k≤400。

对于80%的数据,k≤1000。

对于100%的数据,k≤6000,n,m≤106

解析

最小距离的最大值,考虑从将几个点,从下界连到上界,这条路径中的最长边的一半,即我们想要的答案。

一条路径的最长边,即最大值。

所有路径中的最长边的最小值,即最小距离。

所以求出最长边的最小值即可。

我们要找到所有路径中的所有最长边(相对于该条路径而言),然后在这些最长边中找到一个最小值,最小值除以二即为答案。

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=+;
int water[N];
int n,m,k,x[N],y[N];
double dis[N],ans;
double calc(int x,int y,int l,int r)
{
return sqrt((double)(x-l)*(x-l)+(double)(y-r)*(y-r));
}
int main()
{
cin>>n>>m>>k;
for(int i=;i<=k;i++) cin>>x[i]>>y[i];
for(int i=;i<=k;i++) dis[i]=m-y[i];
dis[k+]=m;
dis[]=2e9;
while()
{
int mi=;
for(int i=;i<=k+;i++)
if(!water[i] && dis[i]<dis[mi]) mi=i;
ans=max(ans,dis[mi]);
if(mi==k+)
{
cout<<ans/;
return ;
}
for(int i=;i<=k;i++) dis[i]=min(dis[i],calc(x[i],y[i],x[mi],y[mi]));
dis[k+]=min(dis[k+],y[mi]);
water[mi]=;
}
return ;
}

泉五培训Day4的更多相关文章

  1. 泉五培训Day5

    T1 陪审团 题目 [题目描述] 陪审团制度历来是司法研究中的一个热议话题,由于陪审团的成员组成会对案件最终的结果产生巨大的影响,诉讼双方往往围绕陪审团由哪些人组成这一议题激烈争夺.小 W提出了一个甲 ...

  2. 泉五培训Day3

    T1 家庭作业 题目 [问题描述] 小P为了能高效完成作业,规定每项作业花一个单位时间. 他的学习日从0时刻开始,有100000个单位时间.在任一时刻,他都可以选择编号1~N的N项作业中的任意一项作业 ...

  3. 泉五培训Day2

    T1 旅游 题目 [题目描述] 幻想乡有n个景点(从1开始标号),有m条双向的道路连在景点之间,每条道路有一个人气值d,表示这条道路的拥挤程度.小G不会经过那些人气值大于x的道路,她想知道有多少对景点 ...

  4. 泉五培训Day1

    T1 树学 题目 [问题描述] 给定一颗 n 个点的树,树边带权,试求一个排列 P,最大化下式 其中,calc(a, b)表示树上由a到b经过的最大边权. [输入格式] 第一行一个整数 n,表示点数下 ...

  5. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  6. 常州培训 day4 解题报告

    第一题:(简单的模拟题) 给出一个N位二进制数,有‘+’, ‘-’, ‘*’, ‘/’ 操作,分别表示加1,减1,乘2,除以2,给出M个操作,求出M个操作后的二进制数.N,M<=5000000; ...

  7. 正睿暑期培训day4考试

    链接 A 求出来到每座山的距离后,就可以计算出每只猫等待的时间与出发时间的关系. 如果出发时间为\(x\),求出来只猫的等待时间.这里用\(b_i\)表示第i只猫的等待时间.然后我们将这些时间排序.问 ...

  8. 长乐培训Day4

    T1 矩阵 题目 [题目描述] 从前有个 n×m 的矩阵,初始时每个位置均为 0.你需要依次执行 q 个操作,每个操作会指定一行或一列,然后将该行或该列的所有元素全部赋为一个相同的值. 输出操作完成后 ...

  9. 8月清北学堂培训 Day4

    今天上午是赵和旭老师的讲授~ 概率与期望 dp 概率 某个事件 A 发生的可能性的大小,称之为事件 A 的概率,记作 P ( A ) . 假设某事的所有可能结果有 n 种,每种结果都是等概率,事件 A ...

随机推荐

  1. express中connect-flash中间件的使用

    在学习node的时候,flash是困扰我最久的一个中间件,之前一直都没有很好的理解,这里做一个总结. 参考自:http://yunkus.com/connect-flash-usage/ 什么是fla ...

  2. 【LDAP】LDAP介绍

    原文:http://ldapman.org/articles/intro_to_ldap.html原文作者:Michael Donnelly 什么是LDAP? LDAP的英文全称是Lightweigh ...

  3. c#实体转化

    经常会遇到把一个实体转化成另一个实体这样的情况,实体的属性一个一个手写去转化不反对,但不是啥好的方法:可以使用反射写一个通用的实体转化类,针对任何实体转化,不用再去自己手写. public stati ...

  4. 基于springmvc开发注解式ip拦截器

    一.注解类 @Documented @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) ...

  5. SEO搜索引擎

    搜索引擎 搜索引擎(Search Engine)是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.搜索引擎 ...

  6. CRM的划分

          CRM提供完整的客户生命周期管理解决方案,帮助您管理各项与客户有关的事件,包括市场.销售以及客户支持等方面,优化事件处理流程,从而赢得更多客户,并提高客户满意度.   按企业经营类型划分 ...

  7. python if else while for

    1 getpass模块 设置密码不显示明文 用户名和密码输入程序: import getpass username = input("username:") password = ...

  8. 解析xml文件,修改Jenkins的配置

    最近因为服务器移动,在Jenkins中配置的一些地址之类的,都要改变,如图,我因为使用插件Sidebar Links增加一个链接地址,现在地址变了,所以在Jenkins中配置就需要改动link url ...

  9. Flashing Fluorescents(状压DP)

    Flashing Fluorescents 时间限制: 1 Sec  内存限制: 128 MB提交: 56  解决: 19[提交] [状态] [讨论版] [命题人:admin] 题目描述 You ha ...

  10. 20145238-荆玉茗 《Java程序设计》第10周学习总结

    20145238 <Java程序设计>第10周学习总结 网络编程 ·网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...