8613 锁

本文详细介绍了Oyy设计的实验室门锁系统,包括其工作原理、输入输出格式及一种高效的解密算法。通过案例分析,揭示了如何在限定时间内计算出正确的解锁密码Key,旨在选拔出真正的ACM队成员。

8613 锁
该题有题解

时间限制:500MS 内存限制:1000K
提交次数:194 通过次数:34

题型: 编程题 语言: G++;GCC
Description
我们学校终于有自己的实验室啦!
老师让队员们布置一下实验室。Oyy接了个任务,由于实验室是我们共同的基地,所以打算把实验室的门锁改掉。改成让我们队员都能开,别人一律不能开:)
Oyy很快弄了一个神奇的锁,这个锁是这样的。先把校园卡靠近琐的感应器,锁就会自动生成N个正整数(2<=N<=100000)。这N个数组成一个环。譬如5个数字显示为如图1形式:
这里写图片描述

在显示出这些数字后1分钟内,输入答案密码就可以解锁。解锁密码Key的计算方法如下:
在这个环内选两个数,这两个数之和再加上这两个数在环内最短距离就是一个伪Key。最大的伪Key就是真正的解锁密码Key。
例如图2,选择26和15,从26逆时针走4步到15。则伪Key是26+15+4=45
这里写图片描述

但图3中,选择26,33,从26顺时针走3步到33。得到的伪Key是26+33+3=62。而且没有其他的伪Key比62大。所以Key为62。
这里写图片描述

Oyy很满意这个设计。因为他觉得除了我们的acm队员外,其他人是不能在1分钟内求出Key并输入的。你想成为acm队的一员吗?那得先“入门”:)

输入格式
输入包括多个Case,每个Case包含两行。第一行包括一个正整数N。表示环内数的个数。第二行包括n个正整数。所有正整数小于5000。最后以N为0为结束。

输出格式
每个Case包含1行输出。就是解锁Key。

输入样例
2
1 2
12
13 28 33 5 6 19 21 15 12 19 8 26
0

输出样例
4
62

来源 Oyy

作者 admin

DP题,朴素DP好找
dp[i]表示第二个数取a[i]时的最优解,因为是环,且最大距离为n/2,所以在给的数列后面再加上n/2个数(eg,4——1 2 3 4 补充为1 2 3 4 1 2)
{dp[i]=max( a[i] + a[k] + (i-k) ) , k < i 且 i-k <= n/2}
这样复杂度是O(n^2)题目范围是10^5,会超时。
但也可以这样dp[i]=a[i]+i+max(a[k]-k);
这样我们可以用单调队列优化。
我们用一个队列维护a[k]-k,单调递减。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define INF 1<<28
#define ll long long
#define REP(i,t,n) for(int i=(t);i<(n);i++)
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define sd(n) scanf("%d",&(n))
#define pd(n) printf("%d\n",(n))
#define pld(n) printf("%I64d\n",(n))
int dp[200005];
int q[200005];
int a[200005];
int g[200005];
int main()
{
    int n;
    while(sd(n)&&n)
    {
        REP(i,1,n+1){sd(a[i]);g[i]=a[i]+i;}
        REP(i,n+1,n+n/2+1){a[i]=a[i-n];g[i]=a[i]+i;}
        q[1]=1;
        int head=1,tail=1;
        for(int i=2;i<=n+n/2;i++)
        {
            while(i-q[head]>n/2)head++;
            /*因为q是递减队列,所以找到符合条件i-k<=n的排头,如果用链表的话就是把头一个个删掉*/
            dp[i]=g[i]+a[q[head]]-q[head];
            /*要选最大的就是队头*/
            while(a[i]-i>=a[q[tail]]-q[tail]&&tail>=head)tail--;
            /*找位置插入*/
            q[++tail]=i;
        }
        int ans=0;
        for(int i=2;i<=n+n/2;i++)
            ans=max(ans,dp[i]);
        pd(ans);
    }
}
下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值