题面

题意:你带着K元要去n个城市,这n个城市是环形的,你可以选择任意一个起点,然后顺时针走,对于每个城市,到达时可以获得a元,但是从这里离开又需要花费b元,问你能否找到一个起点(输出花钱最少的那个),使得你能够走完一圈,不能输出-1

题解:首先对于环形问题,先把数组复制一次,现在从每个起点开始,满足条件的点就肯定可以进队,其实我们要求的一个i满足,从i到n+i的所有前缀和最小值一定要大于K,因为对于1个i只会进队一次出队一次,所以尺取一下

(我们一路判断的就是,带着K元能不能加上这段区间>=0,不能的话起点就要顺延,同时终点也顺延,每次只改变头首2个元素)

 #include<bits/stdc++.h>
#define N 2000010
using namespace std;
int T,ans,n,m,cnt,b[N],a[N],c[N];
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=n;i++) scanf("%d",&b[i]);
for (int i=;i<=n;i++)
{
c[i]=a[i]-b[i];
c[i+n]=c[i];
}
int l=,r=;
long long ans=;
while (l<=n && r-l+<=n)
{
ans+=c[r];
r++;
while (ans+m<)
{
ans-=c[l];
l++;
}
}
if (l>n) printf("-1\n");else printf("%d\n",l);
}
return ;
}

比赛时,队友为了实现类似想法,却苦于没听过尺取(我也没听过),和不是很能确定a[i]和b[i]是否能统一的问题,大力码的2种。

 #include<bits/stdc++.h>
using namespace std;
#define mem(a,i) memset(a,i,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define lowbit(x) (x&-x)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e6+;
ll a[maxn*];
ll b[maxn*];
int n;
ll sum;
int main() {
int caseCnt;
scanf("%d",&caseCnt);
while(caseCnt--) {
scanf("%d%lld",&n,&sum);
rep(i,,n-) scanf("%lld",&a[i]);
rep(i,n,*n-) a[i]=a[i-n];
rep(i,,n-) scanf("%lld",&b[i]);
rep(i,n,*n-) b[i]=b[i-n];
int l=;
while(l<n) {
if(sum+a[l]>=) {
break;
}
l++;
}
if(l==n) puts("-1");
else {
int r=l+;
ll res=sum+a[l];
ll temp=res;
bool ok=false;
while(r<*n) {
if(r-l==n) temp=res-b[r-];
else temp=min(res-b[r-],res-b[r-]+a[r]);
if(temp<) break;
if(r-l==n) {
ok=true;
break;
}
res=res-b[r-]+a[r];
r++;
}
if(ok) {
printf("%d\n",l+);
continue;
}
int ans;
while(l<n) {
while(l<r&&temp<) {
temp=temp-a[l]+b[l];
res=res-a[l]+b[l];
l++;
}
res=res-b[r-]+a[r];
if(l==r) {
while(l<n) {
if(sum+a[l]>=) {
break;
}
l++;
}
if(l==n) break;
r=l;
res=sum+a[l];
}
r=r+;
while(r<*n) {
if(r-l==n) temp=res-b[r-];
else temp=min(res-b[r-],res-b[r-]+a[r]);
if(temp<) break;
if(r-l==n) {
ans=l+;
ok=true;
break;
}
res=res-b[r-]+a[r];
r++;
}
if(ok) break;
}
if(!ok) puts("-1");
else {
printf("%d\n",ans);
}
}
}
return ;
}
 #include <cstring>
#include <cstdio>
#include<assert.h>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include<iostream>
#include<queue>
#include<functional>
#include <vector>
#include<set>
#include<string>
#include<map>
#include<unordered_set>
using namespace std;
long long a[], b[];
int main() {
long long i, j, k, n, m, l, r, res, t, c, ans;
scanf("%lld", &t);
while (t--)
{
scanf("%lld%lld", &n, &c);
for (i = ; i < n; i++) {
scanf("%lld", &a[i]);
a[n + i] = a[i];
}
for (i = ; i < n; i++) {
scanf("%lld", &b[i]);
b[n + i] = b[i];
}
l = ;
while (l < n&&c + a[l] < )
l++;
if (l == n)
{
printf("-1\n");
continue;
}
r = l; res = c + a[l];
bool ok = false;
while (l < n)
{
bool flag = false;
long long need = b[r];
if (a[r + ] < && r + != (n + l)) {
need -= a[r + ];
flag = true;
}
while (r < (n + l) && res >= need)
{
r++;
res = res - need;
if(!flag)
res = res + a[r];
flag = false;
if (r == (n + l - )) {
need = b[r];
flag = false;
}
else {
need = max(b[r], b[r] - a[r+]);
if (a[r+] < )
flag = true;
}
}
if (r == (l + n))
{
ok = true;
ans = l;
break;
}
res = res - need;
r++;
while (l < r&&res + b[l] - a[l] < ) {
res = res + b[l] - a[l];
l++;
}
if (!flag)
res += a[r];
if (l == r)
{
while (l < n&&c + a[l] < )
l++;
if (l == n)
{
break;
}
else
{
r = l;
res = c + a[l];
}
}
else
{
res = res + b[l] - a[l];
l++;
}
}
if (ok)
{
printf("%lld\n", ans + );
}
else
printf("-1\n");
}
}

2018亚洲区预选赛北京赛站网络赛 D.80 Days 尺取的更多相关文章

  1. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 D 80 Days (线段树查询最小值)

    题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...

  2. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛D-80 Days--------树状数组

    题意就是说1-N个城市为一个环,最开始你手里有C块钱,问从1->N这些城市中,选择任意一个,然后按照顺序绕环一圈,进入每个城市会有a[i]元钱,出来每个城市会有b[i]个城市,问是否能保证经过每 ...

  3. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...

  4. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 80 Days(尺取)题解

    题意:n个城市,初始能量c,进入i城市获得a[i]能量,可能负数,去i+1个城市失去b[i]能量,问你能不能完整走一圈. 思路:也就是走的路上能量不能小于0,尺取维护l,r指针,l代表出发点,r代表当 ...

  5. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛

    题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...

  6. hihoCoder #1831 : 80 Days-RMQ (ACM/ICPC 2018亚洲区预选赛北京赛站网络赛)

    水道题目,比赛时线段树写挫了,忘了RMQ这个东西了(捞) #1831 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an int ...

  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】

    任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...

  8. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B Tomb Raider 【二进制枚举】

    任意门:http://hihocoder.com/problemset/problem/1829 Tomb Raider 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 L ...

  9. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II(优先队列广搜)

    #include<bits/stdc++.h> using namespace std; ; ; char G[maxN][maxN]; ]; int n, m, sx, sy, ex, ...

随机推荐

  1. mysqlslap对mysql进行压力测试

    mysqlslap是从5.1.4版开始的一个MySQL官方提供的压力测试工具.通过模拟多个并发客户端访问MySQL来执行压力测试,并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别. mysq ...

  2. ★Java语法(四)——————————运算符

    使用除法“/”  ,要特别注意数据类型的问题.若被除数和除数都是整形,且被除数不能被除数整除时,这时输出的结果为整数,(即整形数/整形数=整形数),这是因为整形变量无法保存小数点后面的数据所致,要特别 ...

  3. python3:语法变动 及新特性

    python3.0 对python2.x 升级后重大语法变动,幸好留下2.7.6及后续2版本,保持一些语法兼容. 原始地址:http://hi.baidu.com/jxq61/item/3a24883 ...

  4. uni-app判断各大平台的语法

    uni-app是一款强大的前端框架,它除了pc端其他都可以实现,打包原生app.手机h5页面,微信小程序, 但是有一个问题就是本生的app和微信小程序是有一定的区别的,因为app有标题栏,返回键,而微 ...

  5. day37-2元类,单例模式

    目录 元类 造类的第一种形式 class做了什么事 控制元类产生的类 控制元类产生的对象 实例化类 加上元类后类的属性查找顺序 元类控制模版 单例模式 1. 使用类方法的特性 2. 使用装饰器 3. ...

  6. Golang实现常用排序算法

    主函数package main import ( "fmt" "math/rand" "sort" "time") co ...

  7. java中为什么不允许类多重继承,却允许接口多重继承

    首先看下面这一段代码:(底下有热心网友更正,jdk1.8之后情况确实有点变化,等改天有空继续更) interface a{ void b();}interface a1 extends a{ void ...

  8. 复习MySQL④查询功能、连接方式、联合查询

    用select语句查询: select〈目标列组〉 from〈数据源〉 [where〈元组选择条件〉] [group by〈分列组〉[having 〈组选择条件〉]] [order by〈排序列1〉〈 ...

  9. 【C#】【分享】 XXX分钟学会C#

    原文地址 https://www.cnblogs.com/younShieh/p/10945264.html     前几天在刷即刻的时候发现了一个GitHub上的项目,该项目名为"lear ...

  10. C语言开发框架、printf(day02)

    C语言里包含以.c作为扩展名的文件,这种 文件叫源文件.C语言程序的绝大部分内容 应该记录在源文件里. C语言里还包括以.h作为扩展名的文件,这种 文件叫头文件. C语言程序里可以直接使用数字和加减乘 ...