中石油训练赛 - Match Matching(完全背包)
题目描述
Find the largest integer that can be formed with exactly N matchsticks, under the following conditions:
Every digit in the integer must be one of the digits A1,A2,...,AM(1≤Ai≤9).
The number of matchsticks used to form digits 1,2,3,4,5,6,7,8,9 should be 2,5,5,4,5,6
,3,7,6, respectively.
Constraints
·All values in input are integers.
·2≤N≤104
·1≤M≤9
·1≤Ai≤9
·Ai are all different.
·There exists an integer that can be formed by exactly N matchsticks under the conditions.
输入
Input is given from Standard Input in the following format:
N M
A1 A2 ... AM
输出
Print the largest integer that can be formed with exactly N matchsticks under the conditions in the problem statement.
样例输入
20 4 3 7 8 4
样例输出
777773
提示
The integer 777773 can be formed with 3+3+3+3+3+5=20 matchsticks, and this is the largest integer that can be formed by 20 matchsticks under the conditions.
题目大意:规定用火柴摆数字的样子,从 1 ~ 9 所需要的火柴分别为2,5,5,4,5,6,3,7,6,现在给出 m 个不同的且小于十的数字,问恰好用完 n 根火柴,使得摆出的数字最大,且该数字必须使用提供的 m 个数字,问最大可以拼出的数字能有多大
题目分析:一开始感觉是先贪心后暴力,但看到需要恰好用掉 n 个火柴感觉有点蹊跷,加上有 m 个数字的限制,使得贪心并不是如此简单,后来发现 n 比较小,且必须要恰好用完 n ,使得结果最大,那不就是一个最优性问题,用dp来解决,恰好用完让我想到了完全背包,这样一来只要重载一下MAX函数,用字符串作为dp数组,花费为每个数字所需要的火柴数,价值为每个数字本身,转移一遍就好了,注意初始化
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N];string dp[N];string val="0123456789";int cost[10]={0,2,5,5,4,5,6,3,7,6};string MAX(string a,string b)
{if(a.size()>b.size())return a;if(a.size()<b.size())return b;return a>b?a:b;
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d",a+i);for(int i=0;i<=n;i++)dp[i]="-";dp[0]="";for(int i=0;i<=n;i++){if(dp[i]=="-")continue;for(int j=1;j<=m;j++)if(i+cost[a[j]]<=n)dp[i+cost[a[j]]]=MAX(dp[i+cost[a[j]]],dp[i]+val[a[j]]);}cout<<dp[n]<<endl;return 0;
}
中石油训练赛 - Match Matching(完全背包)相关推荐
- 中石油训练赛 - Trading Cards(最大权闭合子图)
题目大意:给出 n 个卡片,可以自由买卖,且价格都是相同的,再给出 m 个集合,如果已经得到了其中一个集合中的卡片,那么可以获得该集合的收益,问如何操作可以使得收益最大化 题目分析:最大权闭合子图的模 ...
- 中石油训练赛 - Watch Later(状压dp)
题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...
- 中石油训练赛 - Swapping Places(字典序最小的拓扑排序)
题目链接:点击查看 题目大意:给出 s 个字符串表示种类,再给出 m 个朋友关系,表示两个种类的动物是朋友,现在给出一个长度为 n 的种类排列,规定相邻两个是朋友的种类的动物可以交换位置,问如何操作, ...
- 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)
题目大意:在二维平面中给出 n 个点,再给出一个固定大小的圆,问如何放置这个圆可以使其覆盖最多的点 题目分析:首先不难想到一种 n^3 的做法,就是两层循环去枚举两个点,因为两个不同的点就可以确定下来 ...
- 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)
题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...
- 中石油训练赛 - Check List(线段树维护偏序问题)
题目大意:给出 n 个点,需要计算出满足下列条件的三元对 ( i , j , k ) 的数量: x[ i ] < x[ j ] < x[ k ] y[ k ] > y[ i ] &g ...
- 中石油训练赛 - Bad Treap(数学)
题目链接:点击查看 题目大意:给出笛卡尔树的定义,现在要求给出 n 个点对 ( x , sin( x ) ),使得笛卡尔树的高度尽可能大 题目分析:如果想让笛卡尔树的高度尽可能大,令其退化为一条链即可 ...
- 中石油训练赛 - High Load Database(二分+记忆化)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次询问,每次询问给出一个阈值 x ,问最少将数列分割成多少段,可以使得每一段的总和都不超过 x,无解的话输出 Impossible ...
- 中石油训练赛 - Plan B(点双缩点+树形dp)
题目大意:给出一张 n 个点 m 条边的无向连通图,现在有某些点被标记了,问能否通过删除某个未被标记的点,使得删除该点后的数个互不相交的连通块中,至少存在一个联通块中不含有被标记的点 题目分析:首先不 ...
最新文章
- PointNet++论文个人理解
- Python测试框架pytest(02)PyCharm设置运行pytest、pytest.main()
- 架构师已死(转自UML软件工程组织)
- Uniform String
- java tag和flt区别,这些年,我爬过的 Android 坑 | 持续更新
- netcore 内存限制_.NET Core 和 Serverless 构建飞速发展的架构
- JavaWeb 如何防止表单重复提交 - 使用Token,令牌
- kindeditor图片批量上传失败问题
- outlook express重定向
- php员工删除,php+mysql删除指定编号员工信息的方法_PHP
- 十三、栅栏CyclicBarrier
- HTML与CSS各种代码与用法,几种关于html和css的使用方法
- web 基本概念辨异 —— URI 与 URL
- emacs coding UTF-8 保存报错
- 经验分享:我是如何在网店无货源情况下快速出单?
- QT 笔记6 | Qt网络编程
- PS暂存盘已满怎么办
- Android 之6.0 双向通话自动录音
- 第二十五届全国青少年信息学奥林匹克联赛初赛
- 【面试总结】Unity3D面试题总结