题目
3、清洁工老马(sweeper)–900
时间限制: | 空间限制:
题目描述:
有 个自然数 。
请找出至少进行多少次操作使 ,一次操作包括如下步骤:
1.选择两个整数 满足 ,且 ;
2.将 修改为 ;
3.将 修改为 。
共 组测试数据。
输入格式:
第一行仅有一个正整数 ( ),表示测试数据的组数。
接下来有 组测试数据:
第一行有一个正整数 ( ,且所有测试数据中 之和不超过 );
第二行为 个整数 ( )。
输出格式:
对于每组测试数据,输出一行一个整数,表示至少多少次操作(可以为0)。
思路
思路为搭桥,0要用一个去补,所有的大于0的去相加,第一个非0数后的0算作1去相加 搭桥 {搭桥} 搭桥,不算最后一个。
重点
ans最大为2*105*109= 2 * 1014
要开long long
代码实现
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+10;
int t,n;
ll ans;
int a[maxn];
int main(){
scanf("%d",&t);
while(t--){
ans=0;
bool flag=false;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i==n)break;
if(a[i]){
ans+=a[i];
flag=true;
}
else {
if(flag)ans++;
else continue;
}
}
printf("%lld\n",ans);
}
return 0;
}