Gym 101102B The Little Match Girl(贪心+规律)

  这个题目的做法不止一种,solve1:每个数字使用的火柴棒都在2~7之间,而且是连续的,就是2-7之前没有空着的数。这样就有一个结论,在下界为l,上界为r的情况下,假设有n个数,那么火柴棒总数一定在n*l 与n*r之间,首先容易想到这个问题肯定是只关心火柴棒的总数,然后就是一个重新组合的问题,假设第一个重组后的数消耗了x个火柴棒,那么剩下的sum-x如果在(n-1)*l 与 (n-1)*r之间,那么一定可以组合成n-1个数,且最后正好用光,条件是数字必须连续,为什么读者可以自己举样例。 这样从9到1枚举即可了。

  solve2:观察这里的数,发现1是一个非常好的数,他是最小的数,并且消耗火柴棒最少,等等……0呢? 0直接无视掉变成9啊……最后的时候其实只会有1,9,7,4,8这几个数,我们可以让他们都变成1,然后把剩下的火柴棒加上去即可,肯定是加4根变成9最好,可以除以4看一下能出多少9,放不满余数只能是0,1,2,3讨论一下即可,放满了说明只能放8,每次加一个,从低位向高位加即可。

  总之,第一个算是上下界的结论,第二个是贪心,也是我自己的做法,第二个稍微快一点~

  代码如下:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
char a[MAXN];
int w[10] = {6,2,5,5,4,5,6,3,7,6};
int fan[8] = {0,0,1,7,4,5,9,8};
void solve1(int n) {
    int sum = 0,tmp;
    for(int i = 0; i < n; i++) {
        sum += w[a[i]-‘0‘];
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 9; j >= 0; j--) {
            tmp = sum-w[j];
            if(tmp>=2*(n-i) && tmp<=7*(n-i)) {
                printf("%d",j);
                sum = tmp;
                break;
            }
        }
    }
    printf("\n");
}
void solve2(int n) {
    int sum = 0,tmp;
    for(int i = 0; i < n; i++) {
        sum += w[a[i]-‘0‘];
        a[i] = ‘1‘;
    }
    tmp = sum-2*n;
    int k = tmp/4;
    int yu = tmp%4;
    for(int i = 0; i<n&&i<k; i++) {
        a[i] = ‘9‘;
    }
    if(k < n) {
        if(k == n-1) {
            a[k] = fan[2+yu]+‘0‘;
        } else if(k == n-2) {
            if(yu == 1) a[k] = ‘7‘;
            if(yu == 2) a[k] = a[k+1] = ‘7‘;
            if(yu == 3) a[k]=‘7‘,a[k+1] = ‘4‘;
        } else if(k == n-3) {
            if(yu == 1) a[k] = ‘7‘;
            if(yu == 2) a[k] = a[k+1] = ‘7‘;
            if(yu == 3) a[k] = a[k+1] = a[k+2] = ‘7‘;
        } else {
            for(int i = 0; i < yu; i++) {
                a[k+i] = ‘7‘;
            }
        }
    } else {
        tmp -= 4*n;
        int ip = n-1;
        while(tmp--) {
            a[ip--] = ‘8‘;
        }
    }
    printf("%s\n",a);
}
int main() {
//    freopen("B.in.cpp","r",stdin);
    int T,n;
    scanf("%d",&T);
    while(T--) {
        scanf("%d%s",&n,a);
//        solve1(n);
        solve2(n);
    }
    return 0;
}
时间: 2024-11-03 01:19:18

Gym 101102B The Little Match Girl(贪心+规律)的相关文章

codeforces Gym 100187F F - Doomsday 区间覆盖贪心

F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F Description Doomsday comes in t units of time. In anticipation of such a significant event n people prepared m vaults in which, as they think, it will

GYM 101173 F.Free Figurines(贪心||并查集)

原题链接 题意:俄罗斯套娃,给出一个初始状态和终止状态,问至少需要多少步操作才能实现状态转化 贪心做法如果完全拆掉再重装,答案是p[i]和q[i]中不为0的值的个数.现在要求寻找最小步数,显然要减去一些多余的步数.如果初始的一些链的前端是终止的某一条链的连续的一部分,那么这条链就不用被拆开再连上,这样每一个长度为x的链对答案的贡献就是-2*(x-1),对每条链进行同样的操作之后就是答案 #include <iostream> #include<cstdio> #include<

Gym - 101102B

题目链接 用火柴棍拼出最大的数,思维题,最后发现暴力1e7刚刚不会超时. #include <bits/stdc++.h> using namespace std; int a[15]={6,2,5,5,4,5,6,3,7,6}; int main() { int t; scanf("%d",&t); while(t--) { int len; char c[100005]; scanf("%d%s",&len,c); int sum=0

16年区域赛训练计划

训练时间: 星期二的晚上7:00 ~ 10:00 的小训练星期四的中午12:00 ~ 17:00的模拟区域赛训练(大仙视公司情况参加)星期六的中午12:00 ~ 17:00的模拟区域赛训练 平时不训练的时候:1.补题:补训练赛中的可做题,尽量脱题解补,特别对于自己算法负责的部分需要好好总结.2.参加比赛,学弟比较需要参加,因为比较缺乏这方面的经验.有选择的参加以下高质量的比赛:codeforces[特点:什么算法都有,难度区分明显,rating制度很科学]Topcoder(需要VPN,学弟可以用

【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】

目录: 1.A[树相关]    2.B[找规律]    3.C[贪心][拓扑排序] A. 描述(A 输入文件 : A.input 输出文件 : A.output)一个城市的构成是一颗n 个节点的树(2 ≤ n ≤ 200), 现在需要在树中找出两条不相交的路径(即两条路径不能有重边也不能有重点),使得路径的长度的乘积最大.输入描述第一行一个数n 表示这个城市一共有 n 个节点.接下来 n-1 行,每行两个数ai 和bi (1 ≤ ai,bi ≤ n ),分别表示从ai 到bi,有一条边,每条边的

nyoj 1078 汉诺塔(四)[二分图 || 规律 || 暴力 || 贪心]

题目:nyoj 1078 汉诺塔(四) 分析:做这个题目的时候是在图论的题目里面看到的,到时读了题目推了一下,发现好像有点规律,试了一下果然过了. 后来看了一下数据,才50,那么试了一下模拟,也过了. 好像zoj有一道题目卡模拟,模拟的时候必须贪心一下才能过 这道题出题人的意图在于考大家的:二分图最小路径覆盖. 把每一个球看做一个点,然后如果两个和为平方数的话就给这两个点之间连接一条边,然后用一个特殊的匹配算法,类似于匈牙利算法,但是每次找匹配的时候加入一条边上连接的有匹配的话就不能匹配,最后求

hdu-5695 Gym Class(贪心+拓扑排序)

题目链接: Gym Class Time Limit: 6000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description 众所周知,度度熊喜欢各类体育活动. 今天,它终于当上了梦寐以求的体育课老师.第一次课上,它发现一个有趣的事情.在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到N,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为

Codeforces Gym 100114 A. Hanoi tower 找规律

A. Hanoi tower Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description you the conditions of this task. There are 3 pivots: A, B, C. Initially, n disks of different diameter are placed on the pivot A: the smallest dis

Gym - 100338E Numbers 贪心

Gym - 100338E 题意:给你n,k问在1-n中能整出k的字典序最小的数.范围1018 思路:比较简单的贪心了,枚举10的幂m,然后加上k-m%k, 更新答案就可以了,数据一定要用unsigned long long,我就在这里挂了几次,查了半天. 1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm> 5 #include <c