标签:type iostream mini stream nes stand 链接 star ring
链接:https://ac.nowcoder.com/acm/contest/1086/C
* Line 1: A single integer: N
* Lines 2..N+1: Line i+1 contains a single integer: Di
* Line 1: A single integer that is the total metric distance Bessie must travel in order to collect or pay each cow.
5 100 -200 250 -200 200
9
题目概述:
Bessie欠一些人钱,也有一些人欠Bessie的钱。Bessie在原点,也就是x=0,而其他共n个人恰好住在x=1,2,3,…,n处。Bessie现在从家出发,要到把别人欠的债收回来,并用收回来的钱还清欠别人的债,并到达x=n处。
问Bessie最少花费的时间
方法:
当且仅当手中的可以还清当前的所有欠款时,立即回头去还清!
将每一步到达的钱累加:
(1)如果刚好从不欠款到欠款,说明目前这点是欠款最少的点,等到一有钱马上回来该点还钱。
(2)如果刚好从欠款过渡到不欠款,说明目前有能力去还钱,马上回头,所走的步数是当前点位置到起点来回减去还钱点位置到起点来回步数,即(i-flag)*2;(需要还钱的不仅仅是前面记录下来的那点,沿途可能还有其他需要还钱的点,但不影响结果)
(3)其他情况只需要直接还钱或者直接收钱,因为前面有累加,所以不用再做处理。
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 #include <set> 10 #include <map> 11 #include <math.h> 12 const int INF=0x3f3f3f3f; 13 typedef long long LL; 14 const int mod=1e9+7; 15 const int maxn=1e5+10; 16 using namespace std; 17 18 int A[maxn]; 19 20 int main() 21 { 22 int n; 23 scanf("%d",&n); 24 for(int i=1;i<=n;i++) 25 { 26 scanf("%d",&A[i]); 27 } 28 int money=0; 29 int pace=0; 30 int flag; 31 for(int i=1;i<=n;i++) 32 { 33 pace++; 34 if(money>=0&&money+A[i]<0)//从不欠钱到欠钱,记录下来这个要还钱的最远点 35 { 36 flag=i; 37 } 38 else if(money<0&&money+A[i]>=0)//从欠钱到不欠钱,说明已有能力还清前面所有点的钱,马上回去还钱 39 { 40 pace+=(i-flag)*2;//一来一回 41 } 42 money+=A[i]; 43 } 44 printf("%d\n",pace); 45 return 0; 46 }
标签:type iostream mini stream nes stand 链接 star ring
原文地址:https://www.cnblogs.com/jiamian/p/11494969.html