题目描述
程小盟的学生丹丹永远分不清减法和求余,他觉得两种运算都是将数字变小,所以差不多。
于是程小盟给了他两道题目来帮助他分清这两种运算。第一道题目是这样的:给定一个包含 n 个数字的数组,每次你可以任选两个数字做减法运算,将这两个数字变成一个新数字放回 数组,经过 n − 1 次操作之后变成一个数字。你的目标是让最终的这一个数字变得尽可能 大,请问最大是多少。
当然,这道题只涉及减法,于是程小盟还有一道同样的题目(只有加粗的地方不同):给定 一个包含 n 个数字的数组,每次你可以任选两个数字做求余运算,将这两个数字变成一个 新数字放回数组,经过 n − 1 次操作之后变成一个数字。你的目标是让最终的这一个数字 变得尽可能大,请问最大是多少。
丹丹说:“都是 n 个数字变成 1 个数字,这两道题不是一样吗?” 看来丹丹又分不清了,你能帮帮他吗?
为了防止丹丹搞混数字,所以程小盟给出的 n 个数字各不相同。
输入格式
第一行输入一个正整数 n, k,表示共有 n 个数字,k 是题目编号,如果 k = 1,则你需要 完成“减法”这道题,k = 2 表示你需要完成“ 求余”这道题。
接下来一行输入 n 个数字,其中第 i 个数字为 ai (1 ≤ ai ≤ 106)
输出格式
输出一行一个整数表示答案。
样例输入content_copy
5 1
1 2 3 4 5
样例输出content_copy
13
提示/说明
样例 1 的 k = 1,说明是一道减法问题,可以先用数组中的 1 减去 2,得到 −1,然后用 −1 减去 4,得到 −5,用 −5 减去 5,得到 −10,用 3 减去 −10,得到 13。
【样例 2 输入】
3 2
100 400 905
【样例 2 输出】
100
【说明】
样例 2 的 k = 2,说明是一道求余问题,先用 905 求余 400,得到余数 505,然后用 100 求余 505,得到余数 100。方案不唯一,但是无法得到比 100 还大的数字了。
测试点编号 | k | n |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 1000 |
5 | 1 | 100000 |
6 | 2 | 1 |
7 | 2 | 2 |
8 | 2 | 3 |
9 − 10 | 2 | 100000 |
#include<bits/stdc++.h>
using namespace std;
int a[100020];
int main()
{
long long sum=0;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
if(k==1){
if(n==1){
cout<<a[1];
return 0;
}
sum=a[2]-a[1];
for(int i=3;i<=n;i++){
sum+=a[i];
}
}else{
sum=a[1];
}
cout<<sum;
return 0;
}