CODEVS 2835挖金币

题目描述 Description

这天,小X幸运地获得了一次进行挖金币游戏的机会,规则如下:

在一个N*N的矩形里,有N*N个边长为1的正方形格子。在游戏中取左下角的格子坐标为(1,1),右上角为(N,N)。在游戏开始前,每一个格子中都会放入一枚金币,而当游戏开始时,每一个格子中的那一枚金币都会进行一次移动,移动后的横、纵坐标值将分别变为原横、纵坐标值每一位上的乘积。当有金币被移动出格子矩形时,将被游戏方收走。小X将被允许选取M个格子,他将获得他所选取的格子中所有的金币,而他对游戏中获得的金币数有一个期望值H。他想知道他最多能获得的金币数能否达到他的期望值。不过金币移动的让人眼花缭乱,小X算不过来了,他找到了你,希望你能用编程解决这个问题。

输入描述 Input Description

一行,三个正整数数N、M、H,以空格隔开,意义如题目中所说

输出描述 Output Description

一个或两个正整数数,以空格隔开

若小X最多能获得的金币数能达到期望值(即大于等于),则输出小X最多能获得的金币数以及金币总数能达到期望值的格子数的最小值

若小X最多能获得的金币数不能达到期望值(即小于),则输出金币数最多的那个格子中的金币数

样例输入 Sample Input

17 3 10

样例输出 Sample Output

12 3

数据范围及提示 Data Size & Hint

对于20%的数据,保证0<M≤N≤100

对于50%的数据,保证0<M≤N≤2000

对于70%的数据,保证0<M≤N≤5000

对于100%的数据,保证0<M≤N≤10000

举例,(123,456)处的金币将会被移动至(1*2*3,4*5*6)即(6,120)。

很明显这是一道模拟题。

暴力的话,会T掉,数据范围开二维数组的话会M掉。

所以我们需要换一种方式来思考  我们没有必要关注最大的格子的坐标,只需要知道最多的金币。

这样就把空间降下来了。

上代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int coin[30050],p[30050];//p[i]代表1~n能变到i的数的个数(排序前)
 6 int n,m,h,sum,minn,ans;
 7 bool flag;
 8 int cmp(int x,int y)
 9 {
10     return x>y;
11 }
12 int main()
13 {
14     cin>>n>>m>>h;
15     for(int i=1;i<=n;i++)
16     {
17         int tmp=i,tot=1;
18         while(tmp)
19         {
20             tot*=tmp%10;
21             tmp/=10;
22         }
23         p[tot]++;
24     }
25     sort(p+1,p+n+1,cmp);
26     for(int i=1;i<=150;i++)
27         for(int j=1;j<=150;j++)
28             coin[++sum]=p[i]*p[j];
29     sort(coin+1,coin+sum+1,cmp);
30     for(int i=1;i<=m;i++)
31     {
32         ans+=coin[i];
33         if(ans>=h && !flag)
34         {
35             minn=i;
36             flag=1;
37         }
38     }
39     if(flag)cout<<ans<<" "<<minn;
40     else cout<<coin[1];
41     return 0;
42 }
时间: 2024-10-21 13:18:02

CODEVS 2835挖金币的相关文章

Codevs 1257 打砖块

1257 打砖块 http://codevs.cn/problem/1257/ 题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[i,j](a[i,j]<=50).下面是一个有5层砖块的例子.如果你要敲掉第i层的第j块砖的话,若i=1,你可以直接敲掉它,若i>1,则你必须先敲掉第i-1层的第j和第j+1块砖. 你的任务是从一个有n(n<=5

【题解】CODEVS 1993 草地排水

CODEVS 1993 草地排水 Description 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网

codevs http://www.codevs.cn/problem/?problemset_id=1 循环、递归、stl复习题

12.10高一练习题 1.要求: 这周回顾复习的内容是循环.递归.stl. 不要因为题目简单就放弃不做,现在就是练习基础. 2.练习题: (1)循环   题目解析与代码见随笔分类  NOI题库 http://noi.openjudge.cn/ch0106/    10-15题 http://noi.openjudge.cn/ch0105/     37-45题 http://noi.openjudge.cn/ch0107/     28-35题 (2)递归   题目解析与代码见随笔分类 递归 h

codevs 3249 搭积木

提交地址:http://codevs.cn/problem/3249/ 3249 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Petya有一个A×B×C的长方体积木,积木是有1×1×1的小积木块组成的.那么这个长方体的高为A,宽为B,长为C.(^-^哦亲,记住长方体的长不一定要比宽的数值大的哦). 现在好玩Petya在这个长方体中的的左上角挖去了一个(A-1)×(B-2)×(C-2)的小长方体.并且告诉你被挖去

[swustoj 1095] 挖金子

挖金子(1095) 题目描述 你在一个N*M的区域中,一开始在(1,1)的位置,每个位置有可能有金子,也有可能不能到达,也有可能有传送门.你只能往右或者下走,不能走出这个区域.当你位于传送门时,传送门你可以选择使用或者不使用,使用的次数无限,若使用则传送到传送门指定的位置.每个位置的金子你可以拿走它,问最后你最多能够拿走多少金子. 输入 首先测试数据组数T. 对于每组测试数据,先输入两个整数N,M(2<=N,M<=40). 接下来是一个N*M的矩阵,表示每个位置的内容X,若0<=X<

Linux下GDB调试与对拍(先挖个坑)

应为NOIP要复赛在NOI-Linux下编写程序,所以被迫选择Vim+Gdb(主要是Guide太丑了). 虽然GUIDE的调试功能已经对付大多数的调试,反正学一学GDB的使用也没什么坏处. 1 生成调试信息 要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点.如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-g,你将看不见程序的函数名.变量名,

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

[ CodeVS冲杯之路 ] P2492

不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT 不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表 路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3 当访问 2 的时候,会跳到3,但 3 已经删除了,

[CODEVS 1281] Xn数列

描述 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn http://codevs.cn/problem/1281/ 分析 比较裸的矩阵乘法题, 好久没做了, 写写思路 假设矩阵 A = { {a1, a2}, {a3, a4} }, B = { {b1, b2}, {b3, b4} }. 根据矩阵乘法的计算方法, 有 : A×B = { {a1b1+a2b2, a1b2+a2b4}, {a3b1+a4b3, a3b2+a4b4} }. 那