SP8319 GLJIVE - GLJIVE的题解
SP 传送门
题目大意
给定 10 10 10 个整数,找到一个前缀和,使得它与 100 100 100 的差值最小,如果与 100 100 100 的差值相同,取大的那一个。
思路
输入 10 10 10 个数字,计算其前缀和。因为可能会差相同,而我们要大的那个数,所以要倒着遍历,找出答案。
前缀和求法
//使用循环求解
for(int i = 1; i <= t; i ++) {
cin >> n;//输入n
a[i] = n + a[i - 1];//第a[i]个数是当前n加上a数组中上一个数
}
代码
#include<bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {
inline int read() {
register int x = 0, f = 1;
register char c = getchar();
while (c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
inline void write(int x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
return;
}
}
using namespace fastIO;
int main() {
int n;
int number[11];
number[0] = 0;
for (int i = 1; i <= 10; i ++) {
cin >> n;
number[i] = number[i - 1] + n; // 计算前缀和
}
int ans = number[10];
for (int i = 10; i >= 1; i --) { // 如果有相同的答案,取最大的
if (abs (number[i] - 100) < abs (ans - 100)) {
ans = number[i];
}
}
cout << ans << endl; // 输出
return 0;
}