题目链接:
https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264
题目分析:
本题较为简单,两个for循环即可。但是需要注意的是,由于输入的序列元素为正整数,那么当外循环从某一值始,sum和任小于给定的m值,此时直接退出循环,因为外循环后面的值也必然不满足题目要求。
参考代码:
#include <iostream>
using namespace std;
const int maxn=100010;
int pos[maxn], ava[maxn], ans[maxn]; //pos,ans分别记录当前位置下满足题意的位置以及最小和
int main()
{
int n, m;
cin >> n >> m;
for(int i =1; i <=n; i++){
cin >> ava[i];
}
bool flag=false; //标记是否有累和为m的情况
for(int i = 1; i <= n; i++){
int sum =0;
bool flag1 = false; //当从当前位置到最后一个位置的累和都小于m,则跳出循环。
for(int j = i; j <=n; j++){
sum += ava[j];
if(sum >= m){
ans[i] = sum;
pos[i] = j;
flag1 = true;
if(sum == m) flag = true;
break;}
}
if(flag1 == false) break; //注意要是没有该段测试点2,5将超时。
}
if(flag){
for(int i = 1; i <= n; i++)
if(ans[i]==m) cout << i << '-' << pos[i] <<endl;
}else{
int minum = ans[1];
for(int j = 2; j <=n; j++){
if(minum > ans[j] &&ans[j] > m) minum = ans[j];
}
for(int i = 1; i <=n; i++){
if(ans[i]==minum) cout << i << '-' << pos[i] <<endl;
}
}
return 0;
}