「NnOI R1-T1」购物
题目描述
小 R 是一个喜欢购物的女孩子,她生活在欧艾国中。
欧艾国共有 n n n 种面值的硬币,它们的面值分别为 1 = a 1 < a 2 < a 3 < ⋯ < a n 1=a_1 < a_2 < a_3 < \cdots < a_n 1=a1<a2<a3<⋯<an,且满足 a i + 1 a_{i+1} ai+1 是 a i a_i ai 的倍数。欧艾国只有硬币一种付款方式。
欧艾国的商店不支持找零,她在购物时必须支付与价格完全相等的硬币。对于同样的价格,可以有不同的支付方式。例如,如果欧艾国硬币的面值为 1 1 1 元和 5 5 5 元,那么支付 7 7 7 元有两种方式:支付 7 7 7 枚 1 1 1 元硬币,或者支付 1 1 1 枚 5 5 5 元硬币和 2 2 2 枚 1 1 1 元硬币。
由于硬币的质量大致相同,她不希望携带的硬币太重,因此每次购物都会携带符合要求的尽量少的硬币。她发现了一个神奇的现象:有的时候多买 1 1 1 元的商品可以使她少带很多硬币。
你能求出最小的 m m m,使得买 m m m 元的商品需要的硬币数比买 m − 1 m-1 m−1 元的商品需要的硬币数更少吗?
输入格式
第一行一个整数 n n n,表示硬币面值数。
第二行 n n n 个整数,第 i i i 个为 a i a_i ai,表示第 i i i 种硬币的面值。
输出格式
一行,一个整数 m m m,表示答案。特别地,如果不存在这样的 m m m,请输出 − 1 -1 −1。
样例 #1
样例输入 #1
4
1 6 12 48
样例输出 #1
6
样例 #2
样例输入 #2
3
1 2 8
样例输出 #2
8
样例 #3
样例输入 #3
1
1
样例输出 #3
-1
提示
样例解释
对于样例 1 1 1,购买 1 ∼ 5 1\sim 5 1∼5 元的商品分别需要 1 ∼ 5 1\sim 5 1∼5 枚 1 1 1 元硬币,购买 6 6 6 元的商品只需要 1 1 1 枚 6 6 6 元硬币。
对于样例 2 2 2,购买 1 1 1 元或 2 2 2 元的商品都需要 1 1 1 枚硬币,并不满足需要的硬币数更少的要求。
数据范围
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 10 1\le n\le 10 1≤n≤10, 1 = a 1 < a 2 < a 3 < ⋯ < a n ≤ 1 0 9 1=a_1 < a_2 < a_3 < \cdots < a_n\le 10^9 1=a1<a2<a3<⋯<an≤109,且满足 a i + 1 a_{i+1} ai+1 是 a i a_i ai 的倍数。
提示:本题开启捆绑测试。
本题共 4 4 4 个子任务。
子任务编号 | $ n \le $ | 特殊性质 | 分数 |
---|---|---|---|
$ 1 $ | $ 2 $ | 无 | 20 |
$ 2 $ | $ 10 $ | 保证 a i ≤ 1 0 3 a_i\le 10^3 ai≤103 | 20 |
$ 3 $ | $ 10 $ | 保证有解 | 30 |
$ 4 $ | $ 10 $ | 无 | 30 |
题目来源
项目 | 人员 |
---|---|
idea | rui_er |
std | rui_er |
data | rui_er |
check | Kevin0501 |
solution | rui_er |
贪心过程
直接锁定可以花一个钱就能买的那种,这就是本题贪心的核心思想,找到后往前看,看是否满足:“买
m
m
m 元的商品需要的硬币数比买
m
−
1
m-1
m−1 元的商品需要的硬币数更少”,直接上代码了
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int arr[15];
int n,ans;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];//输入
for (int i = 1; i < n; i++){
if (arr[i]/arr[i] <= (arr[i] - 1) / arr[i - 1]){//锁定对象
for (int k = 0; k < i; k++){//不一定只看前一个要把前面都遍历一遍
if ((arr[i] - 1) % arr[k] == 0 && (arr[i] - 1) / arr[k] > arr[i] / arr[i])
{
ans = arr[i];//存答案
cout << ans;
return 0;//找打了答案结束程序
}
}
}
}
cout << -1;//输入可不能的情况
return 0;
}