木棍(stick)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK有很多木棍,具体的,总共有n根,且每根木棍都有一个长度。为了方便起见,我们可以用一个正整数ai表示第i根木棍的长度。

LYK有一把小刀,但这把小刀由于削木棍很不方便,对于一根木棍而言,它只能用这把小刀削掉恰好1的长度。

LYK觉得如果4根木棍头尾相连能恰好拼成长方形,说明这4根木棍是可以捆在一起卖钱的!具体的,如果这4根木棍的长度分别为a,b,c,d,如果满足a=b,c=d,说明恰好可以拼成长方形,且获得的钱为这4根木棍圈成的面积a*c。当然如果不能恰好拼成长方形,则卖不出去。

LYK想将这些木棍尽可能的4个一组捆在一起去卖钱,它想知道最多能获得多少钱。

输入格式(stick.in)

第一行一个数n,表示木棍的个数。

接下来一行n个数,第i个数ai表示第i根木棍的长度。

输出格式(stick.out)

一个数表示答案。

输入样例

12

2 3 3 4 5 5 5 5 7 9 11 13

输出样例

31

数据范围

对于30%的数据n=4。

对于50%的数据n<=20。

对于70%的数据n<=1000。

对于100%的数据1<=n<=100000,1<=ai<=1000000。

从大到小枚举长度,如果是奇数个,就割1

再从大到小枚举长度,拿出两个来相乘

#include<cstdio>
#include<algorithm>
#define N 1000001
using namespace std;
int n,x,maxn,minn=N;
int a[N],b[N];
long long ans;
int main()
{
freopen("stick.in","r",stdin);
freopen("stick.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&x);
a[x]++;
maxn=max(maxn,x);
minn=min(minn,x);
}
for(int i=maxn;i>=minn;i--)
if(a[i] && (a[i]+b[i])&) b[i-]++,a[i]--;
for(int i=maxn;i>=minn;i--) a[i]+=b[i];
int r1,r2,now=maxn;
while(now>=minn)
{
while(now>=minn && a[now]<) now--;
if(now<minn) break;
r1=now; a[now]-=;
while(now>=minn && a[now]<) now--;
if(now<minn) break;
r2=now; a[now]-=;
ans+=1ll*r1*r2;
}
printf("%I64d",ans);
}

寻找最美的你(select)

Time Limit:2000ms   Memory Limit:128MB

题目描述

LYK带着悲伤行走在黑暗里。寂穆的夜空没有星月的点缀,身旁的树木、房屋、万事万物连同你自己,都融于宇宙的虚无缥缈之中。黑暗,压抑、膨胀、严严实实包围整个世界,LYK害怕,彷徨,无奈。突然,眼前出现一扇窗,流漏出点点昏黄的灯光。LYK欣喜地奔去看,原来这里有n个数字,LYK深深地被它们吸引。

这个问题是这样的,如果一个区间[L,R]存在一个数ai,使得这个数是这个区间所有数的约数,那么[L,R]这段区间,是一段好区间。

现在,LYK想知道最长的好区间的长度是多少,并且它想知道最长的好区间具体的位置,如果有多个,从小到大输出它们的左端点。

输入格式(select.in)
第一行一个数n,表示有n个这样的数字。

第二行n个数ai。

输出格式(select.out)

第一行两个数sum,len。其中sum表示有sum个最长的好区间,len表示最长的好区间的长度。

第二行sum个数,从小到大输出,表示所有最长好区间的左端点。

输入样例

5

4 6 9 3 6

输出样例

1 4

2

样例解释:

有一个最长的好区间[2,5]。

数据范围

对于40%的数据n<=100。

对于60%的数据n<=3000。

对于80%的数据n<=30000。ai<=1000。

对于100%的数据1<=n<=300000,1<=ai<=1000000。ai以一定方式随机。

从小到大枚举每个数,看以它为约数向左向右最远能扩展到哪儿

扩展到的地方打上标记,打上标记的数不再枚举

O(n)

#include<cstdio>
#include<algorithm>
#define N 300001
using namespace std;
int n,a[N],minn;
int ans[N],len;
bool v[N];
struct node
{
int num,id;
bool operator < (node p)const
{
return num<p.num;
}
}e[N];
int main()
{
freopen("select.in","r",stdin);
freopen("select.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]),e[i].id=i,e[i].num=a[i];
sort(e+,e+n+);
for(int i=;i<=n;i++)
{
if(v[e[i].id]) continue;
v[e[i].id]=true;
minn=e[i].num;
int j,k;
for(j=e[i].id-;j;j--) if(a[j]%minn) break; else v[j]=true;
for(k=e[i].id+;k<=n;k++) if(a[k]%minn) break; else v[k]=true;
j++; k--;
if(k-j+>len) len=k-j+,ans[]=,ans[]=j;
else if(k-j+==len) ans[++ans[]]=j;
}
sort(ans+,ans+ans[]+);
printf("%d %d\n",ans[],len);
for(int i=;i<=ans[];i++) printf("%d ",ans[i]);
}

数字(number) 

Time Limit:2000ms   Memory Limit:128MB

题目描述

LYK定义了一个新的计算。

具体地,一开始它有两个数字a和b。

每一步,它可以将b增加1,或者将a乘上b。

也就是说(a,b)经过一次操作后可以变成(a,b+1)或者(a*b,b)。再经过一次操作可以变成(a,b+2)或者(a*(b+1),b+1)或者(a*b,b+1)或者(a*b*b,b)。接下来都类似……它认为只有在这个括号左侧的数字才是有意义的,并且它想执行的操作数不会很多。

具体的,如果LYK能通过不超过p步,使得这个括号内左侧的数字变成x,那么x就是一个有意义的数字!

但zhw觉得这个题目太难了,会为难大家,于是他将这个问题中初始的a定义为了1,把b定义为了0。

LYK想知道在一段区间[L,R]中,存在多少有意义的数字。

输入格式(number.in)

第一行3个数分别表示L,R,p。

输出格式(number.out)

一个数表示答案。

输入样例1

1 100 10

输出样例1

46

输入样例2

233 233333333 50

输出样例2

332969

数据范围

对于30%的数据L,R<=10。

对于另外20%的数据p<=20。

对于70%的数据1<=L<=R<=1000,1<=p<=50。

对于90%的数据1<=L<=R<=1000000,1<=p<=50。

对于100%的数据1<=L<=R<=500000000,1<=p<=50。

首先,如果一个数可能有意义,那么他分解质因数的结果全都<=p

所以先预处理所有可能有意义的数,大概一百万个

dp[j]+i 表示 左边到j,右边到i ,所需的最少操作次数

显然,只有dp[j]+i<=p,j这个数才有意义

如果k是j的约数,那么dp[j]可以由dp[k]加1更新

而j的范围到500000000,显然数组开不下

所以将所有有意义的数映射,即j不再表示有意义的数是j,表示第j个有意义的数

#include<cstdio>
#include<algorithm>
#define N 3000001
using namespace std;
int l,r,p;
int prime[],sum_prime;
int b[N],cnt;
int dp[N];
bool v[N];
void dfs(int x,int num)
{
if(x==sum_prime+)
{
b[++cnt]=num;
return;
}
dfs(x+,num);
while()
{
if(1ll*num*prime[x]>r) return;
num*=prime[x];
dfs(x+,num);
}
}
int main()
{
// freopen("number.in","r",stdin);
// freopen("number.out","w",stdout);
scanf("%d%d%d",&l,&r,&p);
bool f=true;
for(int i=;i<=p;i++)
{
f=true;
for(int j=;j*j<=i;j++)
if(i%j==) { f=false; break; }
if(f) prime[++sum_prime]=i;
}
dfs(,);
sort(b+,b+cnt+);
for(int i=;i<=cnt;i++) dp[i]=;
for(int i=;i<=p;i++)
{
int k=;
for(int j=;j<=cnt;j++)
if(b[j]%i==)
{
if(dp[k]+<dp[j]) dp[j]=dp[k]+;
k++;
if(dp[j]+i<=p) v[j]=true;
}
}
v[]=true;
int ans=;
for(int i=;i<=cnt;i++)
if(b[i]>=l && v[i]) ans++;
printf("%d",ans);
}

2017 济南综合班 Day 2的更多相关文章

  1. 2017 济南综合班 Day 7

     a 两个指针L.R R开始指向恰好[R,n]有不超过k个逆序对的地方 随着L的右移,R指针只会右移 逆序对有2部分 1.L左侧与其他位置形成的逆序对 2.R右侧与其他位置形成的逆序对 用树状数组分别 ...

  2. 2017 济南综合班 Day 6

    循环移动 (cyclic.cpp/c/pas) (1s/256M) 问题描述 给出一个字符串S与N个操作.每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K ...

  3. 2017 济南综合班 Day 5

    毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分 ...

  4. 2017 济南综合班 Day 4

    T1 外星人 二维前缀和 #include<cstdio> #define N 1001 using namespace std; bool v[N][N]; int sum[N][N]; ...

  5. 2017 济南综合班 Day 3

    T1  黑化 题意: 求一个字符串是否可能包含另一个字符串 字符串中的?可以匹配任意字母 可能输出 God bless You! 一定不可能 输出 Game Over! 计算fail数组时,fail数 ...

  6. 2017 济南综合班 Day 1

    送分题(songfen) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK喜欢干一些有挑战的事,比如说求区间最大子段和.它知道这个题目有O(n)的做法.于 ...

  7. 2017 济南精英班 Day1

    不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in",&q ...

  8. JavaScript脚本语言基础(四)

    导读: JavaScript和DOM DOM文档对象常用方法和属性 DOW文档对象运用 JSON数据交换格式 正则表达式 1.JavaScript和DOM [返回] 文档对象模型(Document O ...

  9. JeeSite(2):导入数据,进入系统

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50954485 未经博主同意不得转载. 博主地址是:http://blog.csd ...

随机推荐

  1. node.js应用--转载

    最近,在向大学生们介绍 HTML5 的时候,我想要对他们进行问卷调查,并向他们显示实时更新的投票结果.鉴于此目的,我决定快速构建一个用于此目的的问卷调查应用程序.我想要一个简单的架构,不需要太多不同的 ...

  2. Pipeline组Alpha版本发布说明

    Pipeline组Alpha版本发布说明 项目名称 Pipeline 项目版本 Alpha版本 负责人 北京航空航天大学计算机学院 ILoveSE 联系方式 http://www.cnblogs.co ...

  3. 基于TensorFlow解决手写数字识别的Softmax方法、多层卷积网络方法和前馈神经网络方法

    一.基于TensorFlow的softmax回归模型解决手写字母识别问题 详细步骤如下: 1.加载MNIST数据: input_data.read_data_sets('MNIST_data',one ...

  4. C与C++,面向过程与面向对象

    C与C++在电梯处理上的不同 (注:个人理解) 对比区别: C语言程序制定具体流程,按流程逐步进行. C++程序将过程结构化,需要使用时利用接口访问与调用不同功能的类结构结构. 电梯类代码 电梯类定义 ...

  5. ACM 第九天

    动态规划1 动态规划问题是面试题中的热门话题,如果要求一个问题的最优解(通常是最大值或者最小值),而且该问题能够分解成若干个子问题,并且小问题之间也存在重叠的子问题,则考虑采用动态规划. 1.LLS ...

  6. iOS- 移动端Socket UDP协议广播机制的实现

    1.前言    什么是UDP协议广播机制?      举一个例, 例如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):“谁是张三”   如果它是张三,它就会回应你,在网络中也是一样的. ...

  7. ubuntu下修改MySQL的配置文件my.cnf

    先sudo su转换成root,再用cd转到/etc/MySQL目录下,用chmod修改权限(chmod 755 my.cnf),但这样还不能修改,再用vi命令(vi my.cnf),通过上下方向键将 ...

  8. PAT L1-048 矩阵A乘以B

    https://pintia.cn/problem-sets/994805046380707840/problems/994805082313310208 给定两个矩阵A和B,要求你计算它们的乘积矩阵 ...

  9. Redis源码剖析

    Redis源码剖析和注释(一)---链表结构 Redis源码剖析和注释(二)--- 简单动态字符串 Redis源码剖析和注释(三)--- Redis 字典结构 Redis源码剖析和注释(四)--- 跳 ...

  10. 新浪云部署java web程序 注意事项

    在新浪云新手指南里有部署java的示例,但是对一个新手来说难免会有一些地方犯错,折腾了好长时间才把自己的java web部署到了新浪云.这里主要写一些我遇到的问题与第一次使用新浪云的朋友分享一下. 首 ...