结算日 - 洛谷
解释:
1.用sum记录贝西走到某位置的累计的总钱,flag标记是否有欠债还不了的情况(1为有),ans记录步数。
2.若sum<0,则欠债无法还,flag标记为1,并记录下此刻的位置 ad 。
若sum>=0,1⃣️之前无欠债,则只需要累加步数即可。2⃣️若之前有欠债,则需要去还债,ans += ( i - ad)* 2;
看代码:
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int a[100010]={};
int ans = 0;//记录距离
int sum = 0;//记录某位置的总钱
int flag = 0;//标记是否有欠债情况
int ad = 0;//标记欠债位置
for(int i = 1; i <= n; i++){
cin >> a[i];
sum += a[i];
if(sum >= 0 && flag){
flag = 0;
ans += (i - ad) * 2;//还债来回距离
}
if(sum < 0 && flag == 0){
flag = 1;
ad = i;
}
ans++;
}
cout << ans << endl;
return 0;
}