洛谷SP8319 GLJIVE 题解

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) a1at(t=10) 的前缀和, 用求绝对值函数取出 a a a 数组中每个 ∣ a i − 100 ∣ \left\vert a_i -100\right\vert ai100 的值,如果比答案更优,更新答案为当前 ∣ a i − 100 ∣ \left\vert a_i -100\right\vert ai100 的值,输出答案。

模拟过程:

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 ai100 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 ai1=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 ai1=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 ai100 的绝对值的解释:
∵ 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 a1100=90100=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 a2100=30100=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 a3100=60100=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;
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值