题意:环形跑道上有n n<=100000 个加油站  编号为1-n  第i个加油站可以加油pi加仑   从加油站i开到下一站需要qi加仑   你可以选择一个加油站作为起点 初始油箱为空   如果可以走完一圈  那么输出最小的起始站点  否则输出-1

如果   对每个加油站作为起始点进行枚举的话  那么复杂度为 n^2

其中有一个重要的思路可以优化:

比如从第一个点最为起始点   如果能走一圈 那么就成了  第一个也为最小起始点

如果 走到t点   t到t+1走不了     那么 第2个点到 第t个点作为起始点 都是一定不可行的!!

接下来就将t+1作为起始点再次尝试遍历

#include<bits/stdc++.h>
using namespace std;
#define N 100001 int vis[N];
int p[N],q[N];//p为加油 q为油耗
int n; int go(int start)
{
int oil=p[start]-q[start];
if(oil<) return start;
for(int i=(start+)%n; i!=start;i=(i+)%n )
{
oil+=p[i]-q[i];
if(oil<)return i;
}
return N;
} int solve(void)
{
int start=;
memset(vis,,sizeof vis);
vis[]=;
for(;;)
{
int e=go(start);
if(e==N)return start;
start=e+;
if(vis[start])return -;
vis[start]=;
}
} int main()
{
int cas;cin>>cas;
for(int kase=;kase<=cas;kase++)
{
cin>>n;
for(int i=;i<n;i++)scanf("%d",&p[i]);
for(int i=;i<n;i++)scanf("%d",&q[i]); int ans=solve();
printf("Case %d: ",kase);
if(ans==-)printf("Not possible\n");
else printf("Possible from station %d\n",ans+);
}
return ;
}

LRJ的代码更快更巧妙!去掉了vis数组

// UVa11093 Just Finish it up
// Rujia Liu
#include<cstdio> const int maxn = + ;
int n, p[maxn], q[maxn]; // returns s if success
// otherwise, return the station you failed to reach
// if you failed to reach the start, return -1
int go(int s) {
int fuel = p[s] - q[s];
for(int i = (s+)%n; i != s; i = (i+)%n) {
if(fuel < ) return i;
fuel += p[i] - q[i];
}
if(fuel < ) return -; // this means sum(p) < sum(q), so this case is impossible
return s; // success
} int solve() {
int start = ;
for(;;) {
int finish = go(start);
if(finish < start) return -; // wrapped around, or go(start) returns -1
if(finish == start) return start;
start = finish;
}
} int main() {
int T;
scanf("%d", &T);
for(int kase = ; kase <= T; kase++) {
scanf("%d", &n);
for(int i = ; i < n; i++) scanf("%d", &p[i]);
for(int i = ; i < n; i++) scanf("%d", &q[i]);
int ans = solve();
printf("Case %d: ", kase);
if(ans < ) printf("Not possible\n");
else printf("Possible from station %d\n", ans+);
}
return ;
}

8-13 Just Finish it up uva11093的更多相关文章

  1. Java 8 Features – The ULTIMATE Guide--reference

    Now, it is time to gather all the major Java 8 features under one reference post for your reading pl ...

  2. 同一环境下新建Standby RAC库

    需求:在同一个环境下新建Standby RAC库,即和Primary RAC在相同的磁盘组. 说明:生产环境一般不建议这样配置DG,因为存储层面是相同磁盘组,灾备的实际意义不大.我这里是用作读写分离. ...

  3. Android中的线程池

    在Android中,主线程不能执行耗时的操作,否则可能会导致ANR.那么,耗时操作应该在其它线程中执行.线程的创建和销毁都会有性能开销,创建过多的线程也会由于互相抢占系统资源而导致阻塞的现象.这个时候 ...

  4. 创建 HelloWorld 项目

    在 Eclipse 的导航栏中点击 File →New →Android Application Project ,此时会弹出创建 Android 项目的对话框.其中 Application Name ...

  5. 在SQL Server里如何进行数据页级别的恢复

    在SQL Server里如何进行页级别的恢复 关键词:数据页修复 在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作.假设在SQL Server里你 ...

  6. OCP 11g 第四章练习

    练习 4-1 配置Oracle Net 在本练习中, 将使用图形化工具和命令行工具来建立一个完整的Oracle Net 环境. 由此, 读者可看出在Windows 和 Linux 系统中的区别. 1. ...

  7. ArcGIS Desktop10.4安装教程

    准备内容 安装环境:win10*64位专业版 安装文件:ArcGIS_Desktop_1041_150996.iso 破解文件:10.4.1crackOnly 请都以管理员身份运行安装程序 安装步骤 ...

  8. HeadFirst 13 (包装器, 过滤器) not Finish

    过滤器准许你拦截请求 容器管理过滤器的生命周期 都在DD中声明

  9. Mac OS X上IntelliJ IDEA 13与Tomcat 8的Java Web开发环境搭建

    这标题实在有点拗口,不知道怎么写好,但看了标题也就明白文本的内容.最近几天在折腾这些玩意儿,所以写写总结.除了环境搭建,本文还是一篇入门级的上手教程. 去下载一些东西 JDK安装 Tomcat安装 T ...

随机推荐

  1. tomcat启动时,内存溢出,Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"

     问题原因 通过tomcat启动项目,也许是因为项目太大,配置的内存不够用了.老是报内存溢出的问题. 解决办法 1.选中项目 右键 run as ->Run Configurations... ...

  2. 2017 国庆湖南 Day1

    卡特兰数 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ] ...

  3. 51 nod 1046 A^B Mod C

    1046 A^B Mod C 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出3个正整数A B C,求A^B Mod C.   例如,3 5 8,3^ ...

  4. 基于Ubuntu16.04搭建WordPress

    安装 Apache2 在终端输入该命令 ,使用 apt-get 安装 Apache2: sudo apt-get install apache2 -y 安装好后,您可以通过访问实验室IP地址 http ...

  5. 高性能流媒体服务器EasyDarwin

    标准RTSP拉模式直播(EasyRelayModule):适合内部监控 分布式部署(EasyCMSModule):负载均衡主要是用Reids作为负载

  6. 一、Kafka初认识

    一.kafka使用背景 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我 ...

  7. Java并发编程原理与实战三十九:JDK8新增锁StampedLock详解

    1.StampedLock是做什么的? ----->它是ReentrantReadWriteLock 的增强版,是为了解决ReentrantReadWriteLock的一些不足.   2.Ree ...

  8. 一个JavaScript组件都需要哪些基础api

    { init: function() { // 模块初始化,包括属性初始化和配置初始化及调用父类的初始化方法 } ,build: function() { // 模块构建,包括子模块构建,dom构建, ...

  9. LintCode 158: Anagram

    LintCode 158: Anagram 题目描述 写出一个函数anagram(s, t)判断两个字符串是否可以通过改变字母的顺序变成一样的字符串. 样例 给出s = "abcd" ...

  10. 【leetcode 简单】 第八十七题 两整数之和

    不使用运算符 + 和-,计算两整数a .b之和. 示例: 若 a = 1 ,b = 2,返回 3. class Solution: def getSum(self, a, b): "&quo ...