巧克力

@loj - 2977@ 「THUSCH 2017」巧克力

北战南征 提交于 2020-03-05 13:54:31
目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道。」 明明收到了一大块巧克力,里面有若干小块,排成 n 行 m 列。每一小块都有自己特别的图案 \(c_{i, j}\) ,它们有的是海星,有的是贝壳,有的是海螺……其中还有一些因为挤压,已经分辨不出是什么图案了。明明给每一小块巧克力标上了一个美味值 \(a_{i, j}\) ( \(0 \leq a_{i, j} \leq 1\) ),这个值越大,表示这一小块巧克力越美味。 ​正当明明咽了咽口水,准备享用美味时,舟舟神奇地出现了。看到舟舟恳求的目光,明明决定从中选出一些小块与舟舟一同分享。 ​舟舟希望这些被选出的巧克力是连通的(两块巧克力连通当且仅当他们有公共边),而且这些巧克力要包含至少 k( \(1 \leq k \leq 5\) )种。而那些被挤压过的巧克力则是不能被选中的。 明明想满足舟舟的愿望,但他又有点「抠」,想将美味尽可能多地留给自己。所以明明希望选出的巧克力块数能够尽可能地少。如果在选出的块数最少的前提下,美味值的中位数(我们定义 n 个数的中位数为第 \(\lfloor \frac{n + 1}{2} \rfloor\) 小的数)能够达到最小就更好了。 你能帮帮明明吗?

7 装饰者模式

♀尐吖头ヾ 提交于 2020-02-09 00:12:39
装饰者模式 一、应用实例 咖啡订单项目 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack、Decaf 2)调料:Milk、Soy、Chocolate 3)要求在扩展新的咖啡种类时,有良好的扩展性、改动方便。 二、装饰者模式 动态的将新功能附加到对象上。在对象功能扩展方面比继承更有弹性 1.装饰者模式解决咖啡订单项目 2.装饰者模式下的订单:2份巧克力里和一份牛奶的LongBlack 3.代码实现 public class CoffeeBar { public static void main(String[] args) { // 装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack // 1. 点一份 LongBlack Drink order = new LongBlack(); System.out.println("费用1=" + order.cost()); System.out.println("描述=" + order.getDes()); // 2. order 加入一份牛奶 order = new Milk(order); System.out.println("order 加入一份牛奶 费用 =" + order.cost()); System.out.println("order 加入一份牛奶 描述

吃糖果

风格不统一 提交于 2020-02-06 16:56:22
原题链接 # include <iostream> # include <cstdio> # include <queue> # include <cstring> # include <algorithm> using namespace std; /*很容易想到根据每种颜色糖果总数量从多到少排序,若总数量相同,则按水果糖数量从 多到少排序计数。但是当出现三组数据 5 5、 4 6、3 6 时,三组总数量依次为 10、10、9, 先吃完第一组 5 颗水果糖和 5 颗巧克力后,注意此时虽然第二组的总数量也为 10,但是可 以选择吃第二组的 4 颗水果糖和 5 颗巧克力,这样既避免与第一组总数量相同的冲突,又 最大化糖果总数量且吃了尽可能少的巧克力。接着再吃第三组的 3 颗水果糖与 5 颗巧克力。 所以,可以建立一个优先队列来存储糖果数量信息,还是按照之前的规则排序,当数量 出现冲突的时候,将总数量减一,再压入队列里,重新参与排序。数量不冲突的时候,即可 计数。*/ struct Suger { int sum, f; bool operator < (const Suger &s) const { return sum!=s.sum ? sum<s.sum : f<s.f; } }; int main() { //freopen("2.in", "r", stdin); int T

蓝桥杯 分巧克力

依然范特西╮ 提交于 2020-01-31 01:53:34
第八届蓝桥杯第九题–分巧克力(C语言) 一.比赛题目 1.题目要求 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足: 形状是正方形,边长是整数 大小相同 例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么? 2.输入与输出 输入: 第一行输入包含两个整数N和K。(1 <= N, K <= 100000) 以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000) 输入保证每位小朋友至少能获得一块1x1的巧克力。 输出: 输出切出的正方形巧克力最大可能的边长。 样例输入: 2 10 6 5 5 6 样例输出: 2 二.分析过程 1.整体分析 (1)首先我个人认为这道题里面最重要的就是认识到如何来切 题目中要求是第i块是hi*wi,且切割出来的是正方形,边长是整数,在这种情况下,我们可以来进行判断,把每块巧克力的边长都拿来除以j(j暂时未知,是能够切出来的正方形巧克力的边长),然后在把每块巧克力能切出来的个数相加,大于或者等于k(k位小朋友),我们就说k是满足条件的。 代码如下:

分巧克力

☆樱花仙子☆ 提交于 2020-01-24 05:44:26
儿童节那天有 K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N块巧克力,其中第 i 块是 Hi×Wi的方格组成的长方形。 为了公平起见,小明需要从这 N块巧克力中切出 K块巧克力分给小朋友们。 切出的巧克力需要满足: 形状是正方形,边长是整数 大小相同 例如一块 6×5的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3的巧克力。 当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么? 输入格式 第一行包含两个整数 N和 K。 以下 N行每行包含两个整数 Hi 和 Wi。 输入保证每位小朋友至少能获得一块 1×1的巧克力。 输出格式 输出切出的正方形巧克力最大可能的边长。 数据范围 1≤N,K≤105, 1≤Hi,Wi≤105 输入样例: 2 10 6 5 5 6 输出样例: 2 用二分做 用两个数组legth[],width[]来储存长和宽,legth[i]/x)*(width[i]/x表示这个巧克力可以分为几个正方形的小巧克力 二分搜索边长最大的就行 # include <iostream> # include <algorithm> using namespace std ; int legth [ 123456 ] , width [ 123456 ] ; int n , m ; bool check ( int

腾讯笔试题之贪吃的小Q java 实现代码

旧巷老猫 提交于 2019-12-12 02:34:59
package org.buptdavid.datastructure.zj; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * 小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半, * 但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力 */ public class Demo1 { static int key=0; static int value=0; private static final double tmp=0.5; private static final int day =5;//N天 private static final int food =40;//M块巧克力 public static void main(String[] args) { while (true){ Map<Integer,Integer> map=new HashMap<Integer, Integer>(); map.put(key,value); key++;value++; double result = exce(map); if(result!=-1){ System.out.println(

luogu P2985 [USACO10FEB]吃巧克力Chocolate Eating

谁都会走 提交于 2019-12-03 06:48:20
题目描述 Bessie拿到了N (1 <= N <= 50,000)块巧克力。她决定想个办法吃掉这些巧克力,使得它在吃巧克力的这段时间里,最不开心的一天尽可能的开心。并且一共吃D (1 <= D <= 50,000)天。 每块巧克力有一个开心值H_i (1 <= H_i <= 1,000,000),当某天你吃下那块巧克力时,你将获得那块巧克力的开心值。每一天的开心值是所有当天吃掉的巧克力的总开心值之和。每天晚上Bessie睡觉之后,它的开心值会减半。也就是说,比如昨天Bessie的开心值为50,那么今天早上我一醒来我就会有25点的开心值,舍去小数点后数字。另外,Bessie还有一个怪癖,她喜欢按照巧克力本来的排列顺序吃。 Bessie第一天的开心值为0,求一个每天吃巧克力的方案,使得Bessie最不开心的一天尽可能的开心。 输入格式 Line 1: Two space separated integers: N and D Lines 2..N+1: Line i+1 contains a single integer: H_i 输出格式 Line 1: A single integer, the highest Bessie's minimum happiness can be over the next D days Lines 2..N+1: Line i+1

HDU3544 Alice's Game && POJ 2960 S-Nim(SG函数)

≡放荡痞女 提交于 2019-11-27 17:57:36
题意: 有一块xi*Yi的矩形巧克力,Alice只允许垂直分割巧克力,Bob只允许水平分割巧克力。具体来说,对于Alice,一块巧克力X i * Y i,只能分解成a * Y i和b * Y i其中a + b = X i和a, b > 0。对于Bob,一块巧克力X i * Y i,只能分解成X i * a和X i * b其中a + b = Y i和a ,b > 0。(每次切割只能以整数单位来切,例如一个宽为3的巧克力,你垂直切只能切成一个1,2而不能切成两个1.5) 谁最后不能操作了,谁就输了 题解: 根据题意我们只需要找到在给出的巧克力中他们两个人能走的最大步数,然后对比一下就可以了;但是另一个人的步数是和前一个人个操作有关 例如一个4*4的巧克力,如果每一次Alice都以1来切割(第一次1 3,第二次1 1 2,第三次1 1 1 1),这样的话Bob每一次切割宽为1的巧克力的话,他一共能走3*4=12步。但是如果每次Alice按照总宽度的一半来切割的话,那么Alice还是走4步(先切成2 2,然后再找每一个2来切),但是Bob就只能走2步 而且Alice肯定想让Bob走最小步数,因为Bob步数越大Alice就越难赢,所以每次Alice按照总宽度一半来切就是最优了 代码: 1 //参考:https://blog.csdn.net/qq_34374664/article