题解 JSOI2010 找零钱的洁癖

题面

BZOJ

个人体会

van全没有思路...

只能去看题解...

还是个bfs+贪心

不管怎样竟然乱搞过了...

听M_sea小姐姐说她有更正经的做法(线性规划,网络流)?

解析

就是求最少的数加加减减得到\(X\).

考虑一波暴搜...

没了

开个map存一下当前的数经过没有.

最后和贪心比一下.

改错经历

一开始手写了一个Hash.

结果不知道为什么伪了...

然后用map过了...

另外还有数组开小(毕竟是搜索),循环边界写错导致RE的问题.

code

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <map>
#define ll long long
#define filein(a) freopen(a".cpp","r",stdin)
#define fileout(a) freopen(a".cpp","w",stdout);
using namespace std;

inline ll read(){
    ll sum=0,f=1;char c=getchar();
    while((c<'0'||c>'9')&&c!=EOF){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9'&&c!=EOF){sum=sum*10+c-'0';c=getchar();}
    return sum*f;
}

const int N=1000003;
const int INF=0x7FFFFFFF;
int n;
ll X,c[N],s[N],a[N];
map<ll,bool> mp;

inline ll greedy(){
    ll ret=0,sum=X;
    for(int i=n;i;i--){
        if(!a[i]) continue;
        ret+=sum/a[i];
        sum-=sum/a[i]*a[i];
    }
    return sum? INF:ret;
}

inline ll bfs(){
    int hd=0,tl=1;
    s[1]=c[1]=0;
    while(hd<tl){
        hd++;
        for(int i=1;i<=n;i++){
            tl++;if(tl==N-22) return INF;
            s[tl]=s[hd]+1;
            c[tl]=c[hd]<X? c[hd]+a[i]:c[hd]-a[i];
            if(c[tl]==X) return s[tl];
            if(mp.count(c[tl])){tl--;continue;}
            mp[c[tl]]=1;
        }
    }
    return INF;
}

signed main(){
    X=read();
    while(scanf("%lld",&a[++n])!=EOF);
    sort(a+1,a+n+1);
    if(!X) puts("0");
    else printf("%lld\n",min(greedy(),bfs()));
    return 0;
}

题解 JSOI2010 找零钱的洁癖的更多相关文章

  1. 「JSOI2010」找零钱的洁癖

    「JSOI2010」找零钱的洁癖 传送门 个人感觉很鬼的一道题... 首先我们观察到不同的数最多 \(50\) 个,于是考虑爆搜. 但是这样显然不太对啊,状态数太多了. 然后便出现了玄学操作: \(\ ...

  2. SQL反模式学习笔记22 伪键洁癖,整理数据

    目标:整理数据,使不连续的主键Id数据记录变的连续. 反模式:填充断档的数据空缺. 1.不按照顺序分配编号 在插入新行时,通过遍历表,找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键 ...

  3. PAT-乙级-1037. 在霍格沃茨找零钱(20)

    1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知 ...

  4. 贪心算法-找零钱(C#实现)

    找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下. 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单, ...

  5. [Kali_Debian] 清除无用的库文件(清理系统,洁癖专用)-布布扣-bubuko.com - Google Chrome

    [Kali_Debian] 清除无用的库文件(清理系统,洁癖专用) 时间:2014-11-07 16:25:36      阅读:1486      评论:0      收藏:0      [点我收藏 ...

  6. PAT 1037 在霍格沃茨找零钱(20)(代码+思路)

    1037 在霍格沃茨找零钱(20)(20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon) ...

  7. PAT 乙级 1037 在霍格沃茨找零钱(20)C++版

    1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知 ...

  8. 【算法笔记】B1037 在霍格沃茨找零钱

    1037 在霍格沃茨找零钱 (20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特( ...

  9. PAT——乙级1022:D进制的A+B &乙级1037:在霍格沃茨找零钱

    1022 D进制的A+B (20 point(s)) 输入两个非负 10 进制整数 A 和 B (≤2​30​​−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依 ...

随机推荐

  1. python中的while

    while循环 循环就是一个重复的过程,不断的重复.while循环又称条件循环 while 条件: code 1 code 2 code 3 ... ##实现ATM的输入密码重新输入的功能 while ...

  2. C/C++中size_t潜在的问题

    在C++中,利用数组下标访问数组元素时,常常将下标类型定义为size_t类型,因为正常来说,数组的下标就是size_t类型.例如这样: for (size_t i = 0; i < contai ...

  3. 解决:hudson.plugins.git.GitException: Could not init

    解决:

  4. 探讨 Git 代码托管平台的若干问题

    关于 Git 版本控制软件种类繁多,维基百科收录的最早的版本控制系统是 1972 年贝尔实验室开发的 Source Code Control System.1986 年 Concurrent Vers ...

  5. C:gcc的基本使用

    分布编译 预处理:gcc -E hello.c -o hello.i 编 译:gcc -S hello.i -o hello.s 汇 编:gcc -c hello.s -o hello.o 链 接:g ...

  6. Vue——手机号、验证码登录(设置按钮60s禁用倒计时)

    最近在做一个Vue项目,前端通过手机号.验证码登录,获取验证码按钮需要设置60s倒计时(点击一次后,一分钟内不得再次点击).先看一下效果图: 输入正确格式的手机号码后,“获取验证码”按钮方可点击:点击 ...

  7. SQLServer亿万级数据优化

    --创建分区文件组alter database seclab_sgk_db add filegroup seclab_sgk_db_01alter database seclab_sgk_db add ...

  8. 吴裕雄 python 神经网络——TensorFlow 花瓣识别2

    import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...

  9. ➡️➡️➡️IELTS speaking by simon

    目录 p1 课程概述 p2 speaking part1, intro, warm up introduction questions then 4 questions about one topic ...

  10. 转:HttpClient使用详解

    一.使用方法 使用HttpClient发送请求.接收响应很简单,一般需要如下几步即可. 1. 创建HttpClient对象. 2. 创建请求方法的实例,并指定请求URL.如果需要发送GET请求,创建H ...