[Offer收割]编程练习赛4 A 满减优惠

时间:2022-06-17 23:29:56

满减优惠

描述

最近天气炎热,小Ho天天宅在家里叫外卖。他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元。并且如果消费总计满X元,还能享受优惠。小Ho是一个不薅羊毛不舒服斯基的人,他希望选择若干道不同的菜品,使得总价在不低于X元的同时尽量低。

你能算出这一餐小Ho最少消费多少元吗?

输入

第一行包含两个整数N和X,(1 <= N <= 20, 1 <= X <= 100)

第二行包含N个整数A1, A2, ..., AN。(1 <= Ai <= 100)

输出

输出最少的消费。如果小Ho把N道菜都买了还不能达到X元的优惠标准,输出-1。

样例输入

10 50

9 9 9 9 9 9 9 9 9 8

样例输出

53

题解:

其实我真的想说这题好™难啊,刚看以为挺简单,最后wa了俩小时,= =

我是这么想的,首先从x枚举到sum,用dp写个ok(u)函数,判断是否可以正好加到u,ok()里面我套的01背包模板,这才是对的,我之前用二分写的,无限wa……

代码:

#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int INF = 0x3f3f3f3f;
#define PU puts("");
#define PI(A) cout<<(A)<<endl
#define SI(N) cin>>(N)
#define SII(N,M) cin>>(N)>>(M)
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++) const int MAXN = 20 + 9 ;
int dp[20 * 100 + 5];
int a[MAXN];
int N, X; bool ok(int u) {
for(int i = 0; i < N; i++)
for(int j = u; j >= a[i]; j--)
dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
if(dp[u] == u) return 1;
else return 0;
} int main() {
while(SII(N, X)) {
int sum = 0;
rep(i, N) SI(a[i]), sum += a[i];
sort(a, a + N);
if(sum < X) {
puts("-1");
continue;
}
int u = X;
for(; u < sum ; u++) {
cle(dp, 0);
if(ok(u)) break;
}
PI(u);
}
return 0;
}

以下还有一份,是dfs的代码,写起来很简洁,但时间复杂度就有些高了,O(2^20)

代码2:

#include <bits/stdc++.h>
using namespace std; int min_sum, x;
vector<int> a; void DFS(int idx, int sum) {
if(sum >= x) {
min_sum = min(sum, min_sum);
return;
}
if(idx >= a.size()) {
return;
}
DFS(idx + 1, sum);
DFS(idx + 1, sum + a[idx]);
} int main() {
int n;
while(scanf("%d %d", &n, &x) != EOF) {
a.clear();
int temp, sum = 0;
for(int i = 0; i < n; ++i) {
scanf("%d", &temp);
a.push_back(temp);
sum += temp;
}
min_sum = sum;
DFS(0, 0);
if(min_sum == sum) {
printf("-1\n");
} else {
printf("%d\n", min_sum);
}
}
}

再来一份,大神代码,rank1的,用的是非递归版的,也就是枚举所有情况,复杂度O(2^N),虽然这份跑的时间比上一份还长,但大神做的时候一定是已经想到了这个复杂度,觉对不会TLE,所以才写的,所以还是比较佩服这份

代码3:

#include <bits/stdc++.h>
using namespace std; #define N 100020
#define M 100200
#define eps 1e-12
#define inf 0x3f3f3f3f int n, a[N], X;
int main() {
scanf("%d%d", &n, &X);
int sum = 0;
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
}
if(sum < X) {
puts("-1");
return 0;
}
int ans = inf;
for(int s = 1; s < (1 << n); ++s) {
int t = 0;
for(int j = 0; j < n; ++j) {
if(s >> j & 1) {
t += a[j];
}
}
if(t >= X) ans = min(ans, t);
}
printf("%d\n", ans);
return 0;
}

[Offer收割]编程练习赛4 A 满减优惠的更多相关文章

  1. hihocoder &lbrack;Offer收割&rsqb;编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder &lbrack;Offer收割&rsqb;编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. &lbrack;Offer收割&rsqb;编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  4. &lbrack;Offer收割&rsqb;编程练习赛13 解题报告

    http://hihocoder.com/contest/offers13/problems 题目1 : 风格不统一如何写程序 首先:输入保证组成变量名的单词只包含小写字母. 做法:只要对不同的部分进 ...

  5. hihoCoder&lbrack;Offer收割&rsqb;编程练习赛1题目解析

    题目1 : 九宫 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi近期在教邻居家的小朋友小学奥数.而近期正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不反 ...

  6. ACM学习历程—Hihocoder &lbrack;Offer收割&rsqb;编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  7. HihoCoder1670 &colon; 比赛日程安排&lpar;&lbrack;Offer收割&rsqb;编程练习赛41&rpar;&lpar;模拟&rpar;

    描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...

  8. &lbrack;Offer收割&rsqb;编程练习赛48

    题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...

  9. &lbrack;Offer收割&rsqb;编程练习赛84 -- 括号序列

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个只包含'(', ')'和''的字符串S,现在小Hi可以任意指定''为'('或')',不同的'*'可以是不同的字符. ...

随机推荐

  1. 如何使用VS在SharePont 2013中插入ashx文件

    http://www.lifeonplanetgroove.com/adding-and-deploying-generic-handlers-ashx-to-a-sharepoint-2010-vi ...

  2. mysql优化案例分析

    本文总结了一些工作常见的sql优化例子,虽然比较简单,但很实用,希望对大家有所帮助.sql优化一般分为两类,一类是sql本身的优化,如何走到合适的索引,如何减少排序,减少逻辑读:另一类是sql本身没有 ...

  3. poj2676 Sudoku

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17953   Accepted: 8688   Special ...

  4. react&period;js 之 批量添加与删除功能

    最近做的CMS需要用到批量添加图片的功能:在添加文件的容器盒子内,有两个内容,分别是:添加按钮与被添加的选择文件组件. 结构分析: 被添加的组件,我们称为:UploadQiNiuFiles(七牛文件上 ...

  5. CentOS 6&period;4安装配置LAMP服务器&lpar;Apache&plus;PHP5&plus;MySQL&rpar;

    这篇文章主要介绍了CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)的方法,需要的朋友可以参考下 文章写的不错,很详细:IDO转载自网络: 准备篇: 1.配置防火墙,开启 ...

  6. 【No&period;2】监控Linux性能25个命令行工具

    接着上一篇博文继续 [No.1]监控Linux性能25个命令行工具 10:mpstat -- 显示每个CPU的占用情况 该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一 ...

  7. 05&lowbar;XML的解析&lowbar;01&lowbar;dom4j 解析

    [简述] Xml文件出了给开发者看,更多情况使用程序读取xml文件里的内容,这叫做xml解析. 根据解析方式分为:DOM解析 和 SAX解析 [解析工具] (一). 使用DOM解析原理的工具: 1.J ...

  8. BFC与hasLayout之间的故事

    刚拒绝了一个很有诱惑的公司,不是不想去,而是对现在的能力还不确定,希望能够进一步提高自己的技能,所有想写博客了,监督自己的学习进度·········现在还没有开放博客,希望成熟一些后再开放吧! 进入正 ...

  9. 几种能在O&lpar;n&ast;log&lpar;n&rpar;&rpar;时间排序

    线性时间排序   各种排序算法总结已经介绍了几种能在O(n*log(n))时间内培训n个数的算法.归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.这些算法都有一个有趣的性质:在 ...

  10. PHP页面提示与跳转

    <?php function message($msgTitle,$message,$jumpUrl){ $str = '<!DOCTYPE HTML>'; $str .= '&lt ...