2018-19赛季联合新生训练赛第三场

本次训练赛误打误撞弄了个AK(因为H题数据范围小,打表...逃...),以后继续努力,看此篇文章的你也要更加努力哦。

鉴于此次训练赛大家都还做的不错,我就再来个部分题解吧(偷个懒..emm)

选几个出问题多的

问题 E:取数排列

  • 这个问题好像很多同学被绊了一下,这里看无非1~9回溯一波就可以了啊
  • 注意回溯的标记数组问题
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int v[20];
int ans[20];
int tot;
int n, m;
int ok = 1;
void dfs(int k)
{
    if (k > n)
    {
        tot++;
        if (tot == m)
            for (int i = 1; i <= n; i++)
            {
                cout << ans[i];
                ok = 0;
            }
        return;
    }
    for (int i = 1; i <= n; i++)
        if (!v[i])
        {
            ans[k] = i;
            v[i] = 1;
            dfs(k + 1);
            if (!ok)
                return;
            v[i] = 0;
        }
}
int main()
{
    cin >> n >> m;
    dfs(1);
    return 0;
}

问题 H:自然数无序拆分

  • 这个应该就是很多人离AK的分水岭,赛时的我也没想出正解的DP,就算想出,一时半会也实现不出来
  • 看一眼数据 N<=100 (虚...我又发现新大陆啦,天生爱打表..理理思路迅速码完代码,打表搜答案,O(1)复杂度解决问题....没想到罚时有些许的优势拿了Rank 1 (不能骄傲,继续加油)
  • 这个题我分阶段解决,然后把答案合并,分阶段的意思是,一个数分成若干数相加,有几种情况?答案是N中,最少是 1 个数,最多是 N个数。
  • 下边贴上我的搜索代码:
#include <cstdio>
#include <iostream>
using namespace std;
int n, k, tot;
void dfs(int now, int sum, int cur)
{
    if (cur == k)
    {
        if (sum == n)
            tot++;
        return;
    }
    for (int i = now; sum + i * (k - cur) <= n; i++)  //想一想,这里其实没必要往下搜了,相当于剪枝了
        dfs(i, sum + i, cur + 1);
}

int main()
{
    //freopen("std.in","w",stdout);
    for (int i = 1; i <= 100; i++)   //这里枚举1到100所有数
    {
        n = i;
        tot = 0;
        for (int j = 1; j <= n; j++)  //这里枚举他分成几部分
        {
            k = j;
            dfs(1, 0, 0);
        }
        cout << tot << endl;
    }
}
  • 下面贴上我提交的代码:
#include<iostream>
using namespace std;
int k[200]={1,2,3,5,7,11,15,22,30,42,56,77,101,135,176,231,297,385,490,627,792,1002,1255,1575,1958,2436,3010,3718,4565,5604,6842,8349,10143,12310,14883,17977,21637,26015,31185,37338,44583,53174,63261,75175,89134,105558,124754,147273,173525,204226,239943,281589,329931,386155,451276,526823,614154,715220,831820,966467,1121505,1300156,1505499,1741630,2012558,2323520,2679689,3087735,3554345,4087968,4697205,5392783,6185689,7089500,8118264,9289091,10619863,12132164,13848650,15796476,18004327,20506255,23338469,26543660,30167357,34262962,38887673,44108109,49995925,56634173,64112359,72533807,82010177,92669720,104651419,118114304,133230930,150198136,169229875,190569292};
int main()
{
    int n;
    cin>>n;            //输入
    cout<<k[n-1];    //输出
    return 0;
}
  • 赛后问朋哥这题正解:朋哥:DP!
  • 一个小时后...
  • 两个小时后...
  • 朋哥:再等我10分钟
  • 半小时后....
  • 第二天,代码出来了....(这里不是说朋哥敲的慢,朋哥心里还惦记着他的电路呢,明天下午考试啊!为朋哥祈祷,别挂科,哈哈)传送门DP解法

问题 K:最少移动次数

  • 每堆糖果必定变成总糖果的平均数
  • 怎么说呢,我没法证明我是对的,但是找不出反例来,就是数的传递呗,1给2,2给3,3给4..
  • 如果某堆糖果小于平均数,他就跟下一堆要,传递次数+1,如果恰好是平均数,传递次数不变,如果大于平均数,那么传递给下一堆,传递次数+1
  • Lrj蓝书有一道跟这个相似的题,不过那个题要难些,求的是最少传递的糖果数,有兴趣同学可以去翻一下 Page 4
  • 细节见代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
long long c[500];
long long tot, k, x;
long long ans;
long long num[500];
int n;
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> num[i];
        tot += num[i];
    }
    k = tot / n;
    tot = 0;
    if (num[1] < k)
    {
        tot++;
        num[2] -= (k - num[1]);
        num[1] = k;
    }
    else if (num[1] > k)
    {
        tot++;
        num[2] += (num[1] - k);
        num[1] = k;
    }
    for (int i = 2; i < n; i++)
    {
        if (num[i] == k)
            continue;
        if (num[i] < k)
        {
            tot++;
            num[i + 1] -= (k - num[i]);
            num[i] = k;
        }
        else if (num[i] > k)
        {
            tot++;
            num[i + 1] += (num[i] - k);
            num[i] = k;
        }
    }
    cout << tot;
    return 0;
}

PS 这三个题大家出问题多一些,暂时先讲这三个题,其他题若有需要讨论的可以私聊我QQ

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,462评论 2 59
  • 问题 A: 录取分数线 题目描述新学年,学校将成立信息学兴趣小组提高班。由于指导教师精力有限,只能以选拔考试的成绩...
    StilllFantasy阅读 910评论 2 3
  • 今天晚上是个安静的周末,独自去健身,独自去看电影,独自去吃冰激凌…… 独处,才能真正明白什么是你最需要的,去完...
    achoo_8a26阅读 154评论 0 1
  • 写啥
    周日遛狗阅读 193评论 0 0
  • 所有的问题都不只一个答案 所有的心动都不只一个瞬间 从西北呼啸刮来的风被嘲笑 不过是它想和它那亲密的黄沙一起 飞越...
    北斗夜凉阅读 189评论 0 0