SP8319 GLJIVE 题解
题面描述
给定十个整数,询问一个前缀和使得它与 100 100 100 的差值最小,如果与 100 100 100 的差值相同,取大的那一个。
样例输入 #1
10
20
30
40
50
60
70
80
90
100
样例输出 #1
100
思路:
求出 a 1 ∼ a t ( t = 10 ) a_1\sim a_t(t=10) a1∼at(t=10) 的前缀和, 用求绝对值函数取出 a a a 数组中每个 ∣ a i − 100 ∣ \left\vert a_i -100\right\vert ∣ai−100∣ 的值,如果比答案更优,更新答案为当前 ∣ a i − 100 ∣ \left\vert a_i -100\right\vert ∣ai−100∣ 的值,输出答案。
模拟过程:
i i i | 1 1 1 | 2 2 2 | 3 3 3 | 4 4 4 | 5 5 5 | 6 6 6 | 7 7 7 | 8 8 8 | 9 9 9 | 10 10 10 |
---|---|---|---|---|---|---|---|---|---|---|
n n n | 10 10 10 | 20 20 20 | 30 30 30 | 40 40 40 | 50 50 50 | 60 60 60 | 70 70 70 | 80 80 80 | 90 90 90 | 100 100 100 |
a i a_i ai | 10 10 10 | 30 30 30 | 60 60 60 | 100 100 100 | 150 150 150 | 210 210 210 | 280 280 280 | 360 360 360 | 450 450 450 | 550 550 550 |
∣ a i − 100 ∣ \left\vert a_i -100\right\vert ∣ai−100∣ | 90 90 90 | 70 70 70 | 40 40 40 | 0 0 0 | 50 50 50 | 110 110 110 | 180 180 180 | 260 260 260 | 350 350 350 | 450 450 450 |
解释:
当
i
=
1
i=1
i=1 时,
n
=
10
n=10
n=10 , 由于
a
1
a_1
a1 之前没有数,所以此时的前缀和
a
i
=
n
=
10
a_i=n=10
ai=n=10 。
当
i
=
2
i=2
i=2 时,
n
=
20
n=20
n=20 ,
a
i
−
1
=
a
1
=
10
a_{i-1}=a_1=10
ai−1=a1=10 ,所以前缀和
a
2
=
n
+
a
1
=
10
+
20
=
30
a_2=n+a_1=10+20=30
a2=n+a1=10+20=30 。
当
i
=
3
i=3
i=3 时,
n
=
30
n=30
n=30 ,
a
i
−
1
=
a
2
=
30
a_{i-1}=a_2=30
ai−1=a2=30 ,所以前缀和
a
3
=
n
+
a
2
=
10
+
20
+
30
=
60
a_3=n+a_2=10+20+30=60
a3=n+a2=10+20+30=60 。
以此类推……
接下来是关于表格中
a
i
−
100
a_{i}-100
ai−100 的绝对值的解释:
∵
a
1
=
10
\because a_1=10
∵a1=10 ,
∴
∣
a
1
−
100
∣
=
∣
90
−
100
∣
=
∣
−
10
∣
=
10
\therefore\left\vert a_1 -100\right\vert=\left\vert 90-100\right\vert=\left\vert -10\right\vert=10
∴∣a1−100∣=∣90−100∣=∣−10∣=10 。
∵
a
2
=
30
\because a_2=30
∵a2=30 ,
∴
∣
a
2
−
100
∣
=
∣
30
−
100
∣
=
∣
−
70
∣
=
70
\therefore\left\vert a_2-100\right\vert=\left\vert 30-100\right\vert=\left\vert -70\right\vert=70
∴∣a2−100∣=∣30−100∣=∣−70∣=70 。
∵
a
3
=
60
\because a_3=60
∵a3=60 ,
∴
∣
a
3
−
100
∣
=
∣
60
−
100
∣
=
∣
−
40
∣
=
40
\therefore\left\vert a_3 -100\right\vert=\left\vert 60-100\right\vert=\left\vert -40\right\vert=40
∴∣a3−100∣=∣60−100∣=∣−40∣=40 。
前缀和求法
//使用循环求解
for(int i=1;i<=t;i++){
cin>>n;//输入n
a[i]=n+a[i-1];//第a[i]个数是当前n加上a数组中上一个数
}
AC \begin{aligned}\large\colorbox{white}{\color{#52C410}AC }\end{aligned} AC 代码:
#include<bits/stdc++.h>
using namespace std;
const int t=10;//定义常量
long long n,ans,a[110];
void input(){//输入函数
for(int i=1;i<=t;i++){
cin>>n;//输入n
a[i]=n+a[i-1];//求前缀和
}
}
int main(){
input();//使用输入函数
for(int i=t;i>0;i--)//从大到小模拟,如果与 100 的差值相同,取大的那一个
if(abs(ans-100)>abs(a[i]-100))ans=a[i];//如果有更优解,更新答案
cout<<ans<<endl;//输出ans
return 0;
}