1. 程式人生 > >8-13 Just Finish it up uva11093

8-13 Just Finish it up uva11093

ret namespace += con pos 最小 possible 第一個 !=

題意:環形跑道上有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<0) return start; for(int i=(start+1)%n; i!=start;i=(i+1)%n ) { oil+=p[i]-q[i]; if(oil<0)return i; } return N; }
int solve(void) { int start=0; memset(vis,0,sizeof vis); vis[0]=1; for(;;) { int e=go(start); if(e==N)return start; start=e+1; if(vis[start])return -1; vis[start]=1; } } int main() { int cas;cin>>cas; for(int
kase=1;kase<=cas;kase++) { cin>>n; for(int i=0;i<n;i++)scanf("%d",&p[i]); for(int i=0;i<n;i++)scanf("%d",&q[i]); int ans=solve(); printf("Case %d: ",kase); if(ans==-1)printf("Not possible\n"); else printf("Possible from station %d\n",ans+1); } return 0; }

LRJ的代碼更快更巧妙!

// UVa11093 Just Finish it up
// Rujia Liu
#include<cstdio>

const int maxn = 100000 + 5;
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+1)%n; i != s; i = (i+1)%n) {
    if(fuel < 0) return i;
    fuel += p[i] - q[i];
  }
  if(fuel < 0) return -1; // this means sum(p) < sum(q), so this case is impossible
  return s; // success
}

int solve() {
  int start = 0;
  for(;;) {
    int finish = go(start);
    if(finish < start) return -1; // wrapped around, or go(start) returns -1
    if(finish == start) return start;
    start = finish;
  }
}

int main() {
  int T;
  scanf("%d", &T);
  for(int kase = 1; kase <= T; kase++) {
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d", &p[i]);
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    int ans = solve();
    printf("Case %d: ", kase);
    if(ans < 0) printf("Not possible\n");
    else printf("Possible from station %d\n", ans+1);
  }
  return 0;
}

8-13 Just Finish it up uva11093