结算日 - 洛谷
解释:
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;
}