于半路&澳门专题联合征文|【一日一城】澳门一模一样日攻略

华南师大 2017 年 ACM 程序设计比赛新生初赛题解

华南师范大学第很差不多交 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20
日 – 27 日成功举行,共有 146 叫做同学中参赛(做出 1
题)。进入决赛的资格初定为成功并透过 5 题或以上,决赛时是 12 月 3
日,地点未定。

大三巴

题解

被你们虐了千百方方面面的题目和 OJ
也要命辛苦的,也想使休息,所以你们别想了,行行好放了它,我们来拘禁题解吧。。。

失掉澳门的外出准备跟香港之慌以及小异咯~

A. 诡异的计数法

平等、出行准备:

Description

cgy
太喜欢质数了因有关他计数也要为此质数表示!在外看来,2(第一稍质数)表示1,3(第二略质数)表示2……可恰恰缘他的计数方法极其奇葩,所以他的数学成绩特别差而拖累了外的绩点。
lxy 得知 cgy 的绩点排名后打算告诉他,可是要坐无限麻烦的 cgy
质数计数法的章程表示。 lxy 出重金 ¥(10000000 mod 10)
请你来吗他解决这个奇异的计数。

【过关证件类】:港澳通行证(G签、L签)、护照。

Input

输入包括多组数,每组数据列占一实施,每一行来一个正整数 n ,表示 cgy
的绩点排名,输入到文件结尾结束( \(n \leq
100000\) ,数据组数 \(t \leq
1000000\) )。

1)港澳通行证G签,即个人签,可以直接自行过关;我是G签。

Output

针对许每组数据输出一个质数,为 cgy 绩点排名之质数计数法。

2)港澳通行证L签,同行小伙伴是L签,需要摸索旅行社送关。可TB提前采购好,也只是现场搜索人送关,现场用50首。

Sample Input

1
2
28
13

【手机有关准备】:

Sample Output

2
3
107
41

1) 地图APP,离线包提前生好

Hint

  1. 本场比赛是网络初赛,除了不可知抄袭袭其他选手代码外,对另文化以及素材之物色获取不作限制;
  2. A 题并无是无比简单易行的,题目难度不依照顺序,请量力而为~
  3. 如若产生其他疑问请看加说明 https://d.wps.cn/v/8pBAU

2)

题目大意

求第 \(K\) 个质数的价值

3) 境外流量包,支付宝上。

参考思路

可选用埃氏筛法(Sieve of Eratosthenes)、欧拉筛法(Sieve of
Euler)来做事先处理,之后虽足以一直出口。
瞩目先算产生第 100000 独素数是 1299709 ,所以记录数组只要开始及 MaxN
,但标志数组要起至 MaxP 。
日子复杂度 \(O(NloglogN)\) 或 \(O(N)\) 。

【港币or葡币】

参考代码

标程使用了埃氏筛法:

#include <stdio.h>
#include <math.h>

int n,cnt;
int notprime[10000010];
int prime[5000010];

int main(void)
{
    for (int i=2;i<=sqrt(10000000)+1;++i)
        if (!notprime[i])
            for (int j=2*i;j<=10000000;j+=i)
                notprime[j]=1;
    for (int i=2;i<=10000000;++i)
        if (!notprime[i])
        {
            ++cnt;
            prime[cnt]=i;
        }
    while (~scanf("%d",&n))
        printf("%d\n",prime[n]);

    return 0;
}

ZYJ 的欧拉筛解:

#include <stdio.h>
#include <string.h>

const int MaxN = 1E5;
const int MaxP = 1299709;

int primes[MaxN + 1], cnt;
char isPrime[MaxP + 1];

void init() {
    memset(isPrime, 0xff, sizeof(isPrime));
    for (int i = 2; i <= MaxP; ++i) {
        if (isPrime[i]) {
            primes[++cnt] = i;
        }
        for (int j = 1; j <= cnt && i * primes[j] <= MaxP; ++j) {
            isPrime[i * primes[j]] = 0;
            if (!(i % primes[j])) {
                break;
            }
        }
    }
}

int main() {
    int N;
    init();
    while (~scanf("%d", &N)) {
        printf("%d\n", primes[N]);
    }
    return 0;
}

打听及计院方面让的是 cin/cout 的输入输出方法,由于某出题事故造成
cin/cout
会被卡超时,公平起见放松了多少;进而导致优化的试行除法可以险过(过滤偶数、循环外开方、用时算),时间复杂度
\(O(N \sqrt{N})\) :

#include <stdio.h>
#include <math.h>

const int MaxN = 1E5;

int cnt = 1, primes[MaxN + 1] = {-1, 2};

int isPrime(const int& n) {
    int q = (int)sqrt(n) + 1;
    for (int i = 2; i < q; ++i) {
        if (!(n % i)) {
            return 0;
        }
    }
    return 1;
}

int getPrime(const int& n) {
    if (cnt < n) {
        for (int i = primes[cnt] + 1; cnt < n; ++i) {
            if ((n & 1) && isPrime(i)) {
                primes[++cnt] = i;
            }
        }
    }
    return primes[n];
}

int main() {
    int N;
    while (~scanf("%d", &N)) {
        printf("%d\n", getPrime(N));
    }
    return 0;
}

1)
选择:这是暨失香港免顶相同的地方了,因为汇率不同,如果单纯是错过澳门,建议换葡币,比较划算。如果继续会失去香港或其它地方,建议换港币。PS:如果要失去赌场玩几把,必须是港币哦~

B. 数发票

2)
兑换:不需交银行兑换,我是以珠海拱北口岸处换的,在大门外的广场上起同一下国认证的单位,不要手续费,需要提供身份证,接受小额兑换,两三百呢堪啊,兑换时方可假设有些硬币零钱什么的,坐公交买小食是颇需要的。

Description

cgy 组织了有外出运动准备及院报销,学院让了他迟早之差旅费报销金额。而
cgy
平时凡是一个良另眼相看集公交车发票的口,他的时有不少张不同面值的发票,现在客想计算最少要稍微张发票可以恰好达到报销金额。
cgy
忙在整理这些发票,于是把这职责交了一块儿出外的卿,你要细算否则即将不交出门的交通费了。

3)
从澳门回时,千万不要焦躁在内部兑换成人民币了。汇率可能多,但里面的一对旅社如手续费,还是顶大门外的广场及那么家兑换回来,不需手续费,如果回到比较后的语句,硬币是换不了的,需要第二龙早上7:30千古,不过硬币一般还见面留下了发纪念哈~

Input

输入第一履行是一个正整数 T
表示数据组数。接下来是差不多组数据,每组数据第一履是正整数 n ,分别代表 cgy
有 n 种面值的发票(每种都生不少摆放),接下去一行来 n
个由空格隔开的正整数,表示马上 n 种面值的轻重,再下一行是一个正整数 x
表示报销金额(T,x<=1000; n<=100)。

【其他】:

Output

对每一样组数,输出能聚集一起报销金额之尽少的发票张数,如果非可知正好凑齐则输出
-1 。

1)查好天气,穿在相当,不欲差不多带压外套什么的,那边并无是与香港同样一直Shopping啊冷气很没有什么的,根据天气穿衣就可以了。

Sample Input

2
3
1 3 5
11
2
3 5
7

2)查好怀念去的关键景点,看一下约位置,尽量避免多移动冤枉路或者回头路。

Sample Output

3
-1

4) 交通:不需打交通卡,新葡京、威尼斯人等都见面时有发生免费巴士。

Hint

样例解释:
率先组数中 11=5+5+1=5+3+3 ,最少要因此 3 张
亚组数据中任多少张都汇不齐 7 元,输出 -1

【出入境】:

题材大意

有 \(N\) 种物品与一个容量为 \(X\)
的背包,每种物品都发无限件可以动用。若在一样种方案使得刚刚放满背包,求这种方案中所运用物品的最为小件数。

摘的凡珠海拱北港,早六接触半到二十四接触。

参考思路

动态规划,完全背包问题变种,时间复杂度 \(O(NX)\) 等。
参照《背包九谈》。

为什么未选择横琴口岸:因为那边有只长隆,据公寓老板说,那边人爆多爆多。

参照代码

标程:

#include <stdio.h>
#include <string.h>

int kase,n,x,c[1010];
int dp[1010];

int main(void)
{
    scanf("%d",&kase);
    while (kase--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%d",&n);
        for (int i=0;i<n;++i)
            scanf("%d",&c[i]);
        scanf("%d",&x);
        for (int i=0;i<=x;++i)
            for (int j=0;j<n;++j)
                if (i>c[j] && dp[i-c[j]])
                {
                    if (!dp[i])
                        dp[i]=dp[i-c[j]]+1;
                    else
                        dp[i]=dp[i-c[j]]+1<dp[i]?dp[i-c[j]]+1:dp[i];
                }
                else if (i==c[j])
                    dp[i]=1;
        if (dp[x])
            printf("%d\n",dp[x]);
        else
            printf("%d\n",-1);
    }

    return 0;
}

ZYJ:

#include <stdio.h>

inline void getMin(int& a, const int b) {
    if (a > b) a = b;
}

const int INF = 0x3f3f3f3f;
const int MAXN = 101;
const int MAXX = 1010;

int N, amount;
int cost[MAXN];
int dp[MAXX];

void read() {
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) {
        scanf("%d", cost + i);
    }
    scanf("%d", &amount);
}

void work() {
    dp[0] = 0;
    for (int i = 1; i <= amount; ++i) {
        int tmp = INF;
        for (int j = 0; j < N; ++j) {
            if (cost[j] <= i) {
                getMin(tmp, dp[i - cost[j]]);
            }
        }
        dp[i] = tmp + 1;
    }
    printf("%d\n", dp[amount] >= INF ? -1 : dp[amount]);
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        read();
        work();
    }
    return 0;
}

生关口后,可以望出许多赌场的免费巴士,建议选择新葡京之,先为大三蹭那去,先不苟去威尼斯人,后面有讲也甚,或者是和谐失去因公交,直接到目的地,港币和葡币均只是,票价是3.6这种意外的,吐槽~

C. ljc 吃糖

其次、澳门戏:

Description

ljc
喜欢吃糖,每一样粒糖能让他供一个单位的脑能量。对于各道题,他最少要发
m1 能量才见面考虑去举行,且 AC 这道题用吃 m2 能(即 ljc 能量数超过等于
m1 时才会去 AC 这道题,AC 完成后 ljc 剩余(当前能值-m2)能量)。
现今 ljc 的起能量为 n,比赛题目数为 k,问若 ljc 想如果 AK
(All-Killed,即 AC 所有问题),则他至少要备稍颗糖?

提议上午先行向好三附着那边倒,把那无异环抱大炮台、博物馆、各种教堂、历史文化会之先玩了,下午转战威尼斯人、官也摆等。

Input

率先推行输入一个正整数 T 表示数据组数,每组第 1 行两单数 n, k,接下 k
行为片只刚整数 m1, m2。
管所有数据 \(T, n, k, m1, m2 \leq
1000\),且 \(m1 \geq m2\) 。

的确,绝对让您不用人挤人,因为中午开好三沾满人会晤更换多,尤其下午,手信街那真的总人口挤人,而上午错过那实在是想念怎么动怎么动,有些街道就不曾什么人,很爽啊~而自从威尼斯人回来吧要赶紧多哦~

Output

每组数据占一实施,输出 ljc 至少要备的香甜的数码。

【大三巴】

Sample Input

1
0 8
4 2
6 4
8 6
10 8
12 10
14 12
16 14
18 16

撞倒录像就哼,蹭了只导游,听说从达成通往生往往第16层台阶上摄影最好看,全景。

Sample Output

74

脚的遗址教堂可以看,人多时需排队,一段时间放有总人口。

Hint

ljc 做题的逐条可以随意排列,顺序不同, AK 所用之糖数不自然同。
一经假定因此到排序,你得调用 C 语言的 qsort 函数或者 C++ 的 sort 函数。

【大炮台】

题材大意

让得一密密麻麻几何独任务,每个任务都有一个先验条件 precondition 和到位消耗
cost ,现在持有有限的未可再生资源数量 N
,问尽少得补多少资源才能够成功所有任务。

欠问题是“给定不可续资源,问尽多克得哪些任务”的变种,难度持平。

即使在很三黏附滨,沿着阶梯上不怕尽,一破大炮。

参考思路

野心勃勃算法。时间复杂度 \(O(klogk)\)

若果当前极度酷可用能量也 N ,任务队列为 prob[] ,如果一个任务 \(prob_i\) 不克吃得,一定是它的先验需求
\(prob_i.m1 > N\) ,否则由
\(m1 \leq m2\)
一定立,任何一个职责还可以让选择就。

重设存在个别个任务 a 和 b 能够依照梯次完成,那么必然要是 \(a.m2 + b.m1 < b.m2 + a.m1\)
,因为事先完成的任务会先耗费能量,若前方任务消耗得太多,则会造成不饱后面任务之先验条件,进而需要不停地互补能量。如果同多样任务还能够满足这同样法,就可以尽可能少地补偿能量,使得能量利用效率最大化。因此我们好因这无异于盘算被任务排序。
越为得以转账为 \(a.m1 – a.m2 > b.m1 –
b.m2\) 即对差值排序,思想为是近乎的。

大炮台

参考代码

没找到标程,以下由 ZYJ 提供:

#include <stdio.h>
#include <algorithm>

using std::sort;

const int MaxN = 1000;

struct Problem {
    int precond, cost;
    int priority;
    bool operator<(const Problem& cmp) const {
        return priority > cmp.priority;
    }
} prob[MaxN];

int n, k;

void read() {
    scanf("%d%d", &n, &k);
    for (int i = 0; i < k; ++i) {
        scanf("%d%d", &prob[i].precond, &prob[i].cost);
        prob[i].priority = prob[i].precond - prob[i].cost;
    }
}

void work() {
    sort(prob, prob + k);
    int res = 0;
    for (int i = 0; i < k; ++i) {
        if (n >= prob[i].precond) {
            n -= prob[i].cost;
        } else {
            res += prob[i].precond - n;
            n = prob[i].precond - prob[i].cost;
        }
    }
    printf("%d\n", res);
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        read();
        work();
    }
    return 0;
}

【澳门博物馆】

D. 姓名字母排列

大炮台看罢拍得了往前方走就是足以了,一眼便能看出。

Description

自古,如果安列一份无序名单是一个拥有争议性、颇为劳动的题材。通常的做法是遵循姓名拼音的英文字母排字典序。
某个同龙 Zyj
突发奇想,能无克管所有人数的名字拼在一起成为一个拧,并且这串在有着拼接方案中字典序是无限小之呢?比如来三单人口的名字:zyh、zy、zyj,显然会发出以下六栽组成(加入空格是便利阅读,实际排列不应当空格):

zyh zy zyj
zyh zyj zy
zy zyh zyj
zy zyj zyh
zyj zyh zy
zyj zy zyh

众所周知只有亚种植 zyhzyjzy 是颇具方案面临字典序最小之。
今天叫您同一份榜,你能够寻找有之极其小方案吧?

【手信街】

Input

第一实行输入一个正整数 \(N < 10^6\)
代表名字数量。
接下来 \(N\)
行,每行输入一个不过包含小写字母的字符串(当然为不含空格),代表每个人之名字。
管一个人口的讳最深尺寸不超过 20 ,保证拥有人数名字长度的总和小于 \(10^6\) 。

本着大三屈居前的阶梯下,那无异久街就是了,石头路。两限是各种卖手信的小卖部,因此这长长的街又给称作“手信街”,多是肉脯、杏仁饼、花生酥这些,间或有猪扒包、药房、鱼丸等。其中最为知名的啊是多少极其多的,是钜信,有趣味的好屡屡一下当下长达街上开了稍稍家钜信。

Output

出口名字排列拼接方案,要以备中方案被满足字典序最小。

【板樟堂 圣母玫瑰堂】

Sample Input

3
hello
world
zyj

本着前面的马路一直倒便好了,很巧妙的明黄色的礼拜堂,窗户是绿色的,和一般教堂的严正不同,这座教堂给丁轻松的感觉到。

Sample Output

helloworldzyj

【主教座堂】

Hint

只要如为此到排序,你可以调用 C 语言的 qsort 函数或者 C++ 的 sort 函数。

本着碎石斜坡往上,那边的人头显然少生多,很平静,越过坡,就是眼前一亮,感觉像是一个老者站在那,微笑着等候我们过去。很精美,很十分。

题目大意

本原题:《最特别屡屡》,1998 年 NOIP 全国联赛提高组,codevs 1860;
原题:《ZLM 的扑克牌》,2015 年华南师大 ACM 新生赛(逃;
加若干只小写的英文字母串,求平种植方案使得所有串按该方案的一一相邻首尾拼接后,得到的初串在备方案被字典序最小。

【澳门中华总商会直属阅书报室】

参照思路

贪欲算法,需要先严格弱序化(strict weak ordering)。

  1. 只是串字典序不控制拼接串字典序。如果就英文字母串的性来说,显然每个串都生一个“A-Za-z”的“字典序”,既然有一个约定成俗的字典序,它们中本是比的,也堪排序;但是并无可知征按照字典序排好之错拼接起来,得到的新串在有拼接方案中,它为是按部就班字典序的绝小元或大元。很易找到反例:
    bacd 和 b 可以凑合成 bacdb 和 bbacd 两种植, 虽然 b 是原串集合 {b,
    bacd} 中之卓绝小元,但 bbacd 不是合二为一接串集合 {bacdb, bbacd}
    的无限小元,因此 b 不能够解除在 bacd 的前方。
  2. 建立新涉及。基于上面的想想,很爱想到将原串集合任意元素两片拼接比较。对于任意串
    A 和 B ,大概有 3 种植状态:

    • A 和 B 在开头处没有公共子串。直接以字典序排就好了,比如 AB <
      BA 显然能够控制来 A < B ;
    • A 和 B 在开班处起一个缺失的公共子串。这时 A 可以解释为 PQ 而 B
      可以说明为 PR ,对于 Q 和 R 的于而回到了第一种情况;
    • A 是 B 在开头的子串,或掉。假如是前者,则 B 可以讲为 AP
      ,对 AAP 和 APA 的比实在是次种状况,对 A 和 P
      的于。但如果 A 和 P 又于始发处有国有子串,甚至是循环的吧?比如
      A 跟 B ,而 B = AA..AP 甚至 B = AA..AQR 且 A = QSQS..QS 呢?这时
      A 比较紧缺,先添补一起到 B 的长,有或是 A/P 甚至是 S/Q 、 S/R 、
      Q/R 的可比,取决于循环节的长度。

错开为威尼斯人,找公交站台的中途遇到的,圆柱加圆锥,有些古老中式建筑风格,又带动在西式的作风,红色的流派,绿色的顶,相映成趣。

参照代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const int MaxCount = 1E6 + 1;
const int MaxLength = 20 + 1;

int N;
char names[MaxCount][MaxLength] = {0};

void read() {
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) {
        scanf("%s", names[i]);
    }
}

int namesCmp(const void* a, const void* b) {
    static char p[MaxLength << 1], q[MaxLength << 1];
    strcat(strcpy(p, (char*)a), (char*)b);
    strcat(strcpy(q, (char*)b), (char*)a);
    return strcmp(p, q);
}

void work() {
    qsort(names, N, MaxLength, namesCmp);
    for (int i = 0; i < N; ++i) {
        printf("%s", names[i]);
    }
    putchar('\n');
}

int main() {
    read();
    work();
    return 0;
}

【与上述风景反方向的】

E. Substring

【圣安多尼教堂】

Description

一个字符串的子串表示原字符串中同样段子连接的片。例如,字符串”121″的子串总共有六只,它们分别是”1″(前一个),”2″,”1″(后一个),”12″,”21″和”121″。但”11″不是”121″的子串,因为少单’1’在原串中无总是。我们当空串也无是子串。
现受你一个止含有’0’和’1’两种植字符的字符串,问她含相同’0’和’1’的子串有几个。例如,字符串”0101″中符合条件的子串有4只。它们各自是”01″(前一个),”10″,”01″(后一个),”0101″。

随即所教堂就在路边,但是雅坦然,与甚三沾满那边的尘嚣不同。在赴白鸽巢前地的中途。个人最好欢喜这所教堂,不是深闷,又不是殊有,青绿色的槛与路灯,碎石路,小喷泉。

Input

输⼊只发生一行,为加的字符串。字符串长度不越100,且只有包含’0’和’1’两种字符。

【白鸽巢前地】

Output

输出为一个勤,表示符合条件的子串的个数。注意最后有一个换行符。

白底蓝字的标牌,这里吧是一个稍稍的公交总站,有一个红色的报亭,我们倒及马上发觉没什么路了,问了一个阿姨,我们倒错方向了,阿姨很热心,临近中午,多问了同样词当地人在乌用比较灵通好吃,阿姨说立刻边用很贵的,而且味道而非是异常好哇,我们且是友善带来饭的,在老伴做好,当地人非常少在外场吃饭,基本还是旅游者,我提议小姑娘你要么拿用餐的钱在就美妙玩嘞,晚上过口岸吃个大餐,比当下边哼广大。这个阿姨明确还看不过去了,弄得我们也是尴尬。

Sample Input

00110011

于往里倒还要是一个山水,不过我们从不继承朝里走了。

Sample Output

10

【澳门科技大学】

Hint

字符串”00110011″中符合条件的子串分别吗”01″(前一个),”10″,”01″(后一个),”0011″
(前一个),”0110″,”1100″,”1001″,”0011″(后一个),”011001″,”00110011″,共10独。

威尼斯人的边沿,可以感受一下,真的与境内的高校大不平等。

题材大意

加以任意 01 串,求含有相同数量的 ‘0’ 和 ‘1’ 之连子串有些许个。

【威尼斯人の赌场】

参考思路

遍历计数。时间复杂度 \(O(L^2)\) 或
\(O(L^3)\) ,其中 \(L = |S|\) 即字符串的长度。
从左到右扫一整整字符串,统计当中扫了之 ‘0’ 和 ‘1’
底数额,若数量相当则扫了的子串符合条件,进行添加。
出于一个字符串的子串有 \(L + (L – 1) +
\ldots + 2 + 1 = \frac{L(L + 1)}{2}\) 个,所以可能使原原本本历 \(L\) 次起点, \(1 \ldots (L – i)\) 次终点。

正门进入,就是一个美轮美奂的世界,入眼处是同样雕塑,绕过去就是是一样条大道,头顶是各种西方油画,主基调自然或金色。一直为里,就是传说被之赌场了,猜大小、猜数字各种大小的形式都发出。需要验证身份,港澳通行证拿出,只发满22周岁的才好进去,需要港币,购买筹码之后方可上桌了。

参照代码

\(O(L^3)\) 复杂度的解法:

#include <stdio.h>
#include <string.h>

char str[101];

void read() {
    scanf("%s", str);
}

void work() {
    int len = strlen(str);
    int res = 0;
    for (int i = 0; i < len; ++i) {
        for (int j = i; j < len; ++j) {
            int zeroCnt = 0, oneCnt = 0;
            for (int k = i; k <= j; ++k) {
                str[k] == '0' ? ++zeroCnt : ++oneCnt;
            }
            if (zeroCnt == oneCnt) {
                ++res;
            }
        }
    }
    printf("%d\n", res);
}

int main() {
    read();
    work();
    return 0;
}

\(O(L^2)\)
复杂度的解法只以一念之间,只要您肯怀念:

void work() {
    int len = strlen(str);
    int res = 0;
    for (int i = 0; i < len; ++i) {
        int zeroCnt = 0, oneCnt = 0;
        for (int j = i; j < len; ++j) {
            str[j] == '0' ? ++zeroCnt : ++oneCnt;
            if (zeroCnt == oneCnt) {
                ++res;
            }
        }
    }
    printf("%d\n", res);
}

赌场里分为大众区和VIP区,自然是筹码大小的不同。下午底时段基本都是老人在游戏,这应当是正儿八经来博的。围观的总人口于多,整体并无是深红火,有些清冷。晚一些的时,赌场里在一些小青年了,同时人乎大抵矣森,很是红极一时,自然还是跟电影里不同的哈。

F. 法特狗

赌场外不准拍照,会有人过来劝阻。赌场里提供免费的矿泉水。

Description

显著, cgq 因为脸黑而没有错过玩法特狗这等同慢性打,不过他老板 gou4shi1
经常发问他有英灵厉不厉害,为了一劳永逸, cgq
决定写个次于所有英灵打只分叉。
以法特狗里,每张卡牌都对准承诺着一个英灵。设 \(n\) 为卡池里装有卡牌的数额, \(m\) 为卡池里发些许张卡牌 y 使得,英灵 x
的有所属性都超等于英灵 y 的照应属性(注意, y 可以是 x
本身),则英灵x的评分也 \(\frac{m}{n}\) 。
现今看每个英灵只发四只属性(耐久、敏捷、魔力、幸运),每个属性只来四单等级(ABCD
, A 最强, D 最弱)。给起一个卡池所有英灵的性能,要求给有英灵评分。

每个出入口都起工作人员在,长得虎背熊腰、人高马大的,不管是哪位出入口,进入时犹亟待验证有效证件。

Input

输入第一实行是一个平头 n ( \(1 \le n \le
100000\) ),代表卡池里具有卡牌的数码。
连片下是 n
行,每行四独好写字母,分别代表每个英灵的坚固、敏捷、魔力、幸运。

【大运河购物为主】

Output

出口 n 行,每行一个浮点数(小数点后保留少数各类),代表每个英灵的评分。

发赌场,上楼就是是大运河购物为主了。天空格外蓝,是假的,湖水也充分蓝,这里拍摄很尴尬,有游船,船夫都是外国人,装扮统一,水手服戴帽子。

Sample Input

4
AAAA
AAAD
CBCD
DDDD

此间就是逛街之,购物天堂啊,大大小小的品牌还生,高端奢华之,大众平民的,因为汇率问题,在当时边购买东西,同等价格下,比境内便宜不丢掉,比香港略好有,可以银联刷卡支付。

Sample Output

1.00
0.75
0.50
0.25

【大利来记 猪扒包】

Hint

1.00 = 4/4
0.75 = 3/4
0.50 = 2/4
0.25 = 1/4

来澳门,必须要吃的尽管是猪扒包和葡式蛋挞了。猪熬包我是当大利来记吃的,猪熬炸得头头是道,人多,38葡币一个。我是于好三附着那边购买的。

题材大意

加若干独物品,每个物品含有四个属性,每个属性又有四种植价值,当且仅当一个品所有性之值都低于等于另一个品,才好说此物品比其余一个物品。求于随意一个品,比其的物品数。

【安德鲁饼店及咖啡馆 葡式蛋挞】

参照思路

四维偏序关系(partial ordering relation)计数。

尽管如此发出四个维度,但由于每一个维度的限定比较小,所以状态数片,只有 \(4^4 = 256\)
个,完全可以为此标记数组记录转:先预处理发生一致栽状态的卡牌有多少张,对于每种卡牌,找有比较其弱的卡牌数量,最后根据卡牌的输入顺序直接计算输出答案。时间复杂度
\(O(256 \times 256 + N)\) 或 \(O(256N)\) 。

L2M 说可以以每个状态加起,时间复杂度 \(O(4
\times 256 + N)\) 。

符数组可以是 ‘D’ – ‘A’ 变基映射成 0 – 3 的季维属性数组,这样盖会生出 5
或 8 个 for
循环;也得以是储存哈希(hash)成四前进制数的等同维状态数组;当然某些同学直接打表算状态吧可,就是生硌奇怪hhh。

葡式蛋挞大大推荐,强烈推荐,就当威尼斯人里面,看到队伍非常丰富的散至大桥及的即使是了,一开始还当是于大桥及拍摄,就错过了,后来寻找这家宾馆才察觉,哭笑不得。

好错点解析

  1. 偏序关系不可比:由于 C/C++
    函数库里的排序方法要求严格弱序,而这边是四维偏序,即自由两只物品
    \(X\) 和 \(Y\) ,当且仅当 \(X.p1 \leq Y.p1\) 且 \(X.p2 \leq Y.p2\) 且 \(X.p3 \leq Y.p3\) 且 \(X.p4 \leq Y.p4\) 都满足时才发出 \(X \preccurlyeq Y\) ,比如 \(ABCD \preccurlyeq AABB\) ,但 \(ABCD\) 和 \(BACD\)
    不可比较。你可以根据偏序关系之概念来好作证一下,总的是匪得以一直开展比排序(comparison
    sort)的,即使 hash 成四向前制数也老(数字本身吗是严格序);
  2. 数量漂移:由于要算并出口浮点数,部分就此 float
    的同班发或会见逢浮点数数据漂移问题;
  3. 卡牌可更:一摆卡牌只或是鲜的 256 种状态,卡池里 \(N\)
    张牌肯定有双重的;但结尾也要依据卡牌的输入顺序来输出(即相当于可还而非等同);
  4. 反向映射:因为本来的属于性值是 ‘A’ – ‘D’ ,如果依照此顺序映射成 0 – 3
    的说话,大概就是是 ‘D’ < ‘A’ 等价于 3 > 0
    ,这样要小心,对属性值的涉嫌比而反在来;如果 0 – 3 代表 ‘D’ – ‘A’
    就无须花就脑细胞了。

超好吃啊,是自个儿当下吃过太香的蛋挞了。10葡币一个,现烤现出。

参考代码

标程 1 (\(O(256N)\)):

#include <stdio.h>

const int N = 1e5 + 10;
const int M = 4;
int a0[N], a1[N], a2[N], a3[N];
int b[M][M][M][M];

int main() {
    int n;
    scanf("%d\n", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%c%c%c%c\n", &a0[i], &a1[i], &a2[i], &a3[i]);
        a0[i] = 'D' - a0[i]; a1[i] = 'D' - a1[i]; a2[i] = 'D' - a2[i]; a3[i] = 'D' - a3[i];
        b[a0[i]][a1[i]][a2[i]][a3[i]]++;
    }
    for (int i = 0; i < n; ++i) {
        int ans = 0;
        for (int j0 = 0; j0 <= a0[i]; ++j0)
            for (int j1 = 0; j1 <= a1[i]; ++j1)
                for (int j2 = 0; j2 <= a2[i]; ++j2)
                    for (int j3 = 0; j3 <= a3[i]; ++j3)
                        ans += b[j0][j1][j2][j3];
        printf("%.2f\n", (double)ans/n);
    }
    return 0;
}

标程 2 (\(O(256 \times 256 +
N)\)):

#include <stdio.h>

const int N = 1e5 + 10;
const int M = 4;
int a0[N], a1[N], a2[N], a3[N];
int b[M][M][M][M], c[M][M][M][M];

int main() {
    int n;
    scanf("%d\n", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%c%c%c%c\n", &a0[i], &a1[i], &a2[i], &a3[i]);
        a0[i] = 'D' - a0[i]; a1[i] = 'D' - a1[i]; a2[i] = 'D' - a2[i]; a3[i] = 'D' - a3[i];
        b[a0[i]][a1[i]][a2[i]][a3[i]]++;
    }
    for (int i0 = 0; i0 < M; ++i0)
        for (int i1 = 0; i1 < M; ++i1)
            for (int i2 = 0; i2 < M; ++i2)
                for (int i3 = 0; i3 < M; ++i3)
                    for (int j0 = 0; j0 <= i0; ++j0)
                        for (int j1 = 0; j1 <= i1; ++j1)
                            for (int j2 = 0; j2 <= i2; ++j2)
                                for (int j3 = 0; j3 <= i3; ++j3)
                                    c[i0][i1][i2][i3] += b[j0][j1][j2][j3];
    for (int i = 0; i < n; ++i)
        printf("%.2f\n", (double)c[a0[i]][a1[i]][a2[i]][a3[i]]/n);
    return 0;
}

ZYJ 的季上制标记解法(O\((4 \times 256
\times 256 + N)\),虽然多矣只常反复 4
但就算是自豪地比标程快(骄傲.jpg)):

#include <stdio.h>

int N;
int cardSet[100100];
int cardMap[256];
int leqCount[256];

void addCard(int idx, const char* card) {
    int val = 0;
    for (const char *p = card + 3; p >= card; --p) {
        val <<= 2;
        val |= 'D' - *p;
    }
    cardSet[idx] = val;
    ++cardMap[val];
}

void read() {
    char card[5];
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) {
        scanf("%s", card);
        addCard(i, card);
    }
}

int leqCard(int a, int b) {
    for (int i = 4; i > 0; --i) {
        if ((a & 3) > (b & 3)) {
            return 0;
        }
        a >>= 2;
        b >>= 2;
    }
    return 1;
}

void work() {
    for (int i = 0; i < 256; ++i) {
        if (cardMap[i]) for (int j = 0; j < 256; ++j) {
            if (cardMap[j] && leqCard(j, i)) {
                leqCount[i] += cardMap[j];
            }
        }
    }
    for (int i = 0; i < N; ++i) {
        printf("%.2lf\n", (double)leqCount[cardSet[i]] / N);
    }
}

int main() {
    read();
    work();
    return 0;
}

【官也街】

G. zyj 打印奖状

公家为会不酷,是澳门举世瞩目的食街之一,这里多餐厅食肆,也时有发生许多手信,而我们最后在威尼斯人找地方坐下后,就无思量动了,然后就是不曾去,只能以后发生机遇错过矣。出去玩体力很重点,官为街离威尼斯人很近呀~~

Description

zyj
又让被去打印奖状啦!但是学院办公室的打印机实在太辣鸡,经常将奖状文字打歪。为了为学院更换打印机,
zyj
把自己以院得之具备奖状都以出来,用以展示这打印机打出来的奖状到底歪成什么体统。为了方便表示,
zyj
决定将每一样摆奖状的文范围中心以及奖状纸张中心的几乎哪距离列举出,用以表观地展示打印机的误差。
zyj 天天都使打印奖状,日理万机,所以他请你帮忙他成功这任务。

【返程】

Input

zyj
得的奖状数不胜数,所以输入文件包括若干组奖状数据。每组奖状数据包含两实施,第一实施是零星个浮点数
a, b(a, b > 0) ,表示奖状的大小;第二尽是四个浮点数 x, y, l, w(x, y
>= 0; l, w > 0)
,表示奖状上文字范围左上比的坐标和仿范围的丰富以及红火。输入数据保证文字范围势必完全在奖状面积内。输入到文件结尾结束。

威尼斯人提供前往珠海拱北港的免费巴士,找不顶之足问问一下工作人员,长长的队伍,还好班次也大都,我们约排了三四十分钟吧,上车,一路高达眯了一会,回去感觉特别快。

Output

针对诺每一样组奖状数据输出奖状中心及文字区域中心的几哪距离,保留 3 位小数。

暨珠海拱北港时大约是七八点的师,回来的正是有些早了。

Sample Input

3.0 4.0
1.0 1.0 1.0 1.0
2.0 2.0
1.0 1.0 1.0 1.0
3.0 3.0
0.0 0.0 3.0 3.0

Sample Output

0.500
0.707
0.000

Hint

double 类型的输入输出格式: scanf(“%lf”) / printf(“%f”)
主题数据量大,请动 scanf/printf ,使用 cin/cout 会导致超时

题材大意

被得两个矩形,其中有些矩形一定让法于特别矩形之中。给有十分矩形的丰富宽,小矩形的左上角顶点坐标和丰富宽,求来些许独矩形中心的几何距离。

参照思路

签到开,公式乱抓就实施。

好错点解析

  1. 就书没有说亮举凡平于 x 轴的丰富,凡平于 y
    轴的宽,举报出题人;
  2. 马上题没有说亮 a / x / l 一定对许同 b / y / w
    一定对应,举报出题人;
  3. 输入输出:如果用 scanf / printf 作输入输出,前者要指定具体是 %f /
    %lf / %Lf 的哪个,而后人的 float / double 都是故 %f 输出,当然 long
    double 还是用 %Lf ;
  4. 数码漂移:由于要算并出口浮点数,部分用 float
    的同室发或会见遇见浮点数数据漂移问题;

参考代码

#include <stdio.h>
#include <math.h>

double a, b;
double x, y, width, height;

inline double dist(double x1, double y1, double x2, double y2) {
    return sqrt(pow(x1 - x2, 2.f) + pow(y1 - y2, 2.f));
}

int main() {
    while (~scanf("%lf%lf", &a, &b)) {
        scanf("%lf%lf%lf%lf", &x, &y, &width, &height);
        double res = dist(a / 2.f, b / 2.f, x + width / 2.f, y + height / 2.f);
        printf("%.3f\n", res);
    }
    return 0;
}

H. CG 之争

Description

妇孺皆知, cgq 和 cgy 名字被仅差一个许。为了保住 CG 这个称号, cgq
作为擂主给 cgy 出了个难题:要是 cgy 能于 1s 内报出 \(\frac{(\frac{1+\sqrt{5}}{2})^{n}-(\frac{1-\sqrt{5}}{2})^{n}}{\sqrt{5}}\)
,就能够获取同样糟正式挑战 cgq 的机遇。 cgy 好菜呀,而且他的 1s
十分宝贵,于是求助于你,请你帮他恳求来这个数。

Input

多组数据,每一样组一行是 cgq 给出的一个正整数 n
,输入到文件结尾结束(\(n \leq
80\))。

Output

本着许给诸一样组 n 求出 \(\frac{(\frac{1+\sqrt{5}}{2})^{n}-(\frac{1-\sqrt{5}}{2})^{n}}{\sqrt{5}}\)
,保留 3 位小数。

Sample Input

1
2

Sample Output

1.000
1.000

Hint

double 和 long double 精度都有数,求 80 次方会满怀不生。

题目大意

求斐波那契数列的第 \(k\) 项值。

参考思路

打表 or 记忆化递推。递推的时光复杂度 \(O(80)\) ,还有 \(O(N)\) 的输入输出。

因为浮点数类型存不生 80 次方这么好的多次(存储号数不敷 or
表示精度不够),可以找一下问题为起底公式,容易懂凡是斐波那契数列的通项公式;也足以搜索一下
C/C++ 语言是怎么处理大数计算、高精度科学计算的,用大精算法求 80
次方也可以。

易错点解析

  1. 保存 3
    位小数是行骗你的。因为斐波那契是独整数往往排,就算用公式算,考虑上精度损失相当问题后取的还是独整数;
  2. 免发记忆化处理的递归是碰头晚点的。递归空间是同蔸二交叉树,不发记忆化处理的语句不过老出
    80 层,复杂度高及 O(2^N) 指数爆炸算到地老天荒;
  3. 免发记忆化处理的递推是可能会见晚点的。因为有差不多组输入数据呀,你的复杂度是
    O(80T) 哦;
  4. 故浮点数类型递推到最终精度不够是会 WA
    的。有些同学便召开了优化,从奇怪的地方拿到了第 79 、 80
    项一直用字符串输出, emmm… 也是可的。

参照代码

#include <stdio.h>

#define LL long long
#define lld "%lld"

const int MaxN = 80;

LL fib[MaxN + 1] = {0, 1};

inline void init() {
    for (int i = 2; i <= MaxN; ++i) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
}

int main() {
    int N;
    init();
    while (~scanf("%d", &N)) {
        printf(lld".000\n", fib[N]);
    }
    return 0;
}

I. 人形质量单位

Description

每个人之成色可能同样,或许不同。于是乎,如果因人们的体重作为一个计量单位,那么得生出多少种不同的重组也?
设有 n(\(1 \leq n \leq 10\))
种不同的成色,第 i 种质量大小也
wi,第
i 独品质发生
xi
个人(其总分量不超过 300000kg
),要求编程输出这些人形能如出不同品质之种数,但不包括一个丁吧未用底图景。

Input

首先履行输入质量之种数 n
仲实施输入每种质量之质量
老三履输入每种质量之丁之丁

Output

输出可以称的身分种数

Sample Input

3
1 2 3
2 1 2

Sample Output

10

Hint

题目大意

有 \(N\) 种物品,每种物品来 \(X_i\) 个还价值也 \(W_i\)
。可以自由选择物品,求使得所获物品总价值不同的方案往往。

参考思路

动态规划,或记忆化搜索。
假若限了人口,求最好可怜总质量,那就是基本上重新背包问题,参看《背包九谈》。
这里只是要求方案往往,拿个记数组记录转就算哼了,时间复杂度 \(O(N\sum{W_iX_i})\) 等。

爱错点解析

  1. 想必会见来同学想到枚举的方式,即假而总共发生 P 个人,从选 1 私家及选 P
    个人不断做出,看起小种不同之毕竟质量未就好了呢?但假如专注,最要命情况下而选方案数是仅次于等于
    \(C^1_P + C^2_P + \ldots + C^P_P =
    2^P – 1\) 的(当且仅仅当有着品类质量值 \(W_i\) 互质,且非存在 \(p \leq X_j \land q \leq X_i\)
    使得 \(W_i = p \land W_j = q\)
    时取等号),考虑到有 10 种质地还各种品质发生 100 个人,总人数最多大臻
    1000 这是只要算是到地老天荒的节奏;

参考代码

标程(\(O(N\sum{X_i\sum{W_iX_i}})\)):

#include<iostream>

using namespace std;
int main()
{
    int max=0;
    int n,w[305],x[105];
    bool p[300*100*10+5];
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>w[i];
    for(int i=1;i<=n;i++)
    {
        cin>>x[i];
        max+=x[i]*w[i];
    }
    for(int i=1;i<=max;i++) p[i]=false;
    p[0]=true;

    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=x[k];i++)
            for(int j=max;j>=w[k];j--)
            {
                if(p[j]==false && p[j-w[k]]==true) p[j]=true;
            }
    }
    int ans=0;
    for(int i=1;i<=max;i++)
    {
        if(p[i]) {ans++; }
    }
    cout<<ans;
}

\(O(N\sum{W_iX_i})\) :

#include <stdio.h>
#include <string.h>

const int MaxN = 10, MaxW = 301, MaxX = 101;
const int MaxM = MaxN * MaxW * MaxX;

int N, maxWeight;
int W[MaxW], X[MaxX], flag[MaxM];

void read() {
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) {
        scanf("%d", W + i);
    }
    for (int i = 0; i < N; ++i) {
        scanf("%d", X + i);
        maxWeight += W[i] * X[i];
    }
}

int curr[MaxM];

void work() {
    int res = 0;
    flag[0] = 1;
    for (int i = 0; i < N; ++i) {
        memset(curr, 0, sizeof(curr));
        for (int j = W[i]; j <= maxWeight; ++j) {
            if (!flag[j] && flag[j - W[i]] && curr[j - W[i]] < X[i]) {
                flag[j] = 1;
                curr[j] = curr[j - W[i]] + 1;
                ++res;
            }
        }
    }
    printf("%d\n", res);
}

int main() {
    read();
    work();
    return 0;
}

J. 训练 ZetaGo

Description

L2M 未来科技支出公司研制了扳平磨蹭新的智能机器人 ZetaGo
,它好将任何事物都盘算出一个特性值,在通过重排后可以用做出一多级之决策。
为了印证 ZetaGo 的重排能力,需要人工进行督查上(supervised
learning)训练。 LLM 作为 L2M
手下的一律名实验员,就要每天进行这样的苦差事。
今底重排规则是这般的:已清楚一组特征值 A ,要求重新排列后的结 B
可以满足任意两个相邻元素的乘积(\(B_i *
B_{i+1}\))为 4 的翻番。 ZetaGo
经过表决运算后会见于有是否有这么同样栽重排方案, LLM
要因决定结果报告她对怪,以便改正学习型。
今日 LLM 实在尽难为呀,想拜托你帮助拉。

Input

率先实践输入一个正整数 \(T \leq 10\)
代表着训练组数。
接下来 \(3T\) 行,每 \(3\) 行首先是一个正整数 \(2 \leq N \leq 1000\)
代表在特征值的个数,接下一样履行是因此空格隔开的特征值 \(A_i\) (其中 \(1 \leq A_i \leq 10^9\) 且 \(0 \leq i < N\) ),最后一实践 ZetaGo
会给闹它的判断结果 “yes” 或者 “no” 。

Output

请求你告诉 ZetaGo 它的判定结果对怪,输出 “AC” 或者 “WA”
表示针对还是错(不包引号)。

Sample Input

3
2
4 4
no
3
1 2 4
yes
4
1 2 2 4
yes

Sample Output

WA
AC
AC

Hint

样例 2 解释:1 4 2
样例 3 解释:1 4 2 2

题材大意

深受一定一组数据,问是不是存在这样同样栽排列,使得重排后的数量,任意相邻元素两点滴互就的值是
4 的翻番,再跟机器人输入的“它的论断结果”作于。

参照思路

原理题,统计数据关系。时间复杂度 \(\theta(N)\) 。

分类讨论,可以将数字分为三类: 4 的倍数、是 2 的翻番但不是 4
的倍数、奇数。

  1. 强烈,任何数及 4 的翻番相乘,其结果仍然是 4 的翻番,因此是文武双全搭配;
  2. 一目了然,任意 2 的翻番只发生一个因子 2 ,因此她只能两简单间互动就才能够获得 4
    的翻番,必须相邻地放一起;
  3. 对自由奇数,和 2 的翻番相乘不抱题意,只能和 4 的翻番相间搭配。

据此可先行排所有 cnt1 个奇数,每半只奇数之间插入一个 4 的倍数,需要
\(cnt1 – 1\) 个 4 的翻番;若有 2
的倍数,需要拿出一个 4 来连续它们,这样需要 \(cnt1\) 个 4 的翻番。判断一下 4
的倍数有微个,是否满足条件,并将判断结果跟机器人之互相较,得出答案。

爱错点解析

  1. 稍许同学规律找对了,可惜忘记每次都如初始化;
  2. 有些同学规律找对了,可惜和机器人结果的对照反了;
  3. 粗同学规律找对了,可惜统计 4 的翻番时也有意无意算进 2 的倍数了;
  4. 稍微同学规律找对了,可惜忘记是倍数

参照代码

#include <stdio.h>

int T, N;
int cnt1, cnt2, cnt4;
char ans[4] = "yes";

void init() {
    cnt1 = cnt2 = cnt4 = 0;
}

void read() {
    int rd;
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) {
        scanf("%d", &rd);
        if (rd & 3) {
            (rd & 1) ? ++cnt1 : ++cnt2;
        } else {
            ++cnt4;
        }
    }
    scanf("%s", ans);
}

void work() {
    puts(ans[0] == "ny"[cnt4 >= cnt1 - !cnt2] ? "AC" : "WA");
}

int main() {
    scanf("%d", &T);
    while (T--) {
        init();
        read();
        work();
    }
}

K. 强迫症患者

Description

cgy是一个要命有强迫症的丁,他平看到小数就全身难让。然而有雷同天,他撞了这么一修只有整数和除号构成的姿势:1/2/4/16
,他的强迫症又来了,加上了括号让式子变成了 (1/2)/(4/16)=2
把它成为了整数。但是运动着活动在,他又逢了一个墙上写满了之风格的姿势,cgy突然发现有点式子可以经过加括号来深受结果成整数,有些却格外。但是他手下没有纸和笔,于是就无管这个想法写下来,现在而能够通过这无异于系列数字来判断他们是不是可通过加括号改为整数么

Input

一个平头 n(n<=100) 表示来几乎组数据
属下输入 m(m<=1000) 表示出 m 个数字,再下一行输入 m
个刚整数(每个数字不高于 1000 ),表示式子中之数字。

Output

对于各一样行输入,如果可以通过加括号改为整数就输出 Yes ,否则输出 No 。

Sample Input

3
3
1 2 4
4
1 5 6 9
4
1 4 2 2

Sample Output

Yes
No
Yes

Hint

题材大意

被得一串除法式子 a / b / c / …
,可以本着拖欠姿势任意加括号坐改变中一些运算符(除号变乘号),问是不是存在这样同样种植加括号方案,使得全式子的分子得以整除分母。

参照思路

野心勃勃 + 最大公约数,时间复杂度 \(O(N)\) 。

因为括号可以任意加,一定有一样种最优良方案,使得除了次只数只能作为除数外,其他数字之积为受除数,若她的积及第二只数的最大公约数为
1
,则说明有的累累就起来还非可知整除第二只数,否则第二独数除为这最大公约数后该价值也
1 (被除掉了,也堪知道吧让约分了)。

贪欲策略证明:假如从最良好方案中删去某一个括号,使得还有另外一组数和第二单数相就作为除数,若其他剩余的往往的积不可知整除第二单数,当然为非克整除这个新的重要命的除数;若剩余的累累的乘积能整除这个新除数,根据乘法结合律,它们啊会整除单独的老二单数,因此得证。

好错点解析

  1. 乘法溢起:因为 int
    乘法有或溢起,为了避免大精计算,干脆每次都受第二单数除为有数与它的最大公约数,只要交终极时第二单数成为
    1 ,说明她于这进程中给除掉啊;
  2. 约分:整个经过实际上就是相当给约分,我们以大体分时就是以寻觅分子与分母的最大公约数并同除,这个当十分好明;
  3. 运算结合性:现代人类设计下的算术乘法、算术除法符号是大错特错结合的,也就算是必是自漏洞百出为右侧算的,这点应该没有问题吧,所以
    a / b / c 一定当于 ((a / b) / c) 也绝非问题吧….

参照代码

#include <stdio.h>

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

void work() {
    int M, a, b;
    scanf("%d%d%d", &M, &a, &b);
    b /= gcd(a, b);
    for (int i = 2; i < M; ++i) {
        scanf("%d", &a);
        b /= gcd(a, b);
    }
    puts(b == 1 ? "Yes" : "No");
}

int main() {
    int N;
    scanf("%d", &N);
    while (N--) {
        work();
    }
    return 0;
}

L. Oyk 捏泡泡纸

Description

知名的剪纸大师 Oyk
今年不剪纸了,最近做事压力格外,他转移吧捏泡泡纸来放松心情。由于 Czj
每天上班摸鱼,他深受抓恢复陪 Oyk 捏泡泡纸。
就解一摆设完整的泡泡纸上会发出 \(N\)
个泡泡,他们预定每次每个人都得以 paji 掉 2
的幂次(1,2,4,8,16,…,\(2^k\))个泡泡,并且连续由 Oyk
先捏,轮流下直到捏了。他们都想由好来捏完整张泡泡纸,且他们都足够聪明,总会算计选择最好利于团结的国策。
扣押她们捏泡泡太鄙俗了,我思先了解他们谁能够刚好在终极捏完整张泡泡纸。

Input

或是会见生差不多履行输入,请您一直处理及文件尾。
每行会输入一个正整数 \(N \leq 10^6\)

Output

于每张泡泡纸,请你告知我故事的产物。
一经是 Oyk 最后捏了,输出 “Oyk Oyk!” (不包括引号,下同)。
如若是 Czj 最后捏了,输出 “diu,Czj!” 。

Sample Input

4
5
6

Sample Output

Oyk Oyk!
Oyk Oyk!
diu,Czj!

Hint

对样例 3 ,无论 Oyk 先捏 1 / 2 / 4 个都转不了泡泡纸最后被 Czj 捏了。

问题大意

原题:与 hdu 1847 几乎一致。
才发一致堆积若干多少的品,规定每位每次可取 \(2^{\mathbb{k}}\)
个,取完者胜,问先手是否会获胜。

参照思路

巴什博弈变种,找有先手必败态,发现 \(N =
3\mathbb{k}\) 先手必败。时间复杂度 \(O(1)\) 。

可以预先枚举出前几乎单数比如 1 ~ 10 观察先手的输赢情况,发现 \(N = 3\)
是率先只先手必败态,想方用必定败态转移给对方就可知获得胜利。发现其他数总能加
1 或者 2 成为 3 的倍数,而其余 \(3\mathbb{k}\) 都不可知整除 \(2^{\mathbb{p}}\) ,剩下的往往总会是 \(3\mathbb{m} + 1\) 或 \(3\mathbb{m} + 2\) ,这样只待用走 1
个或 2 独就是可知将 \(3\mathbb{m}\)
的状态转移给对方,直到 \(N = 3\)
,因此我们可确定 \(N =
3\mathbb{k}\) 是随游戏的先手必败态。

由数量比较小,也同意递推的做法,复杂度 \(o(NlogN)\) 。原理是这么的,假设当前来
\(N\) 个,如果博走 \(2^{\mathbb{p}}\)
个后对手是必败态,说明及时同一柜先手是一帆风顺的,遍历一全副所有的模拟即可。这同心想实际看似于
SG 函数,各位可自行去询问 SG 函数的规律,把这个题当作 SG 的入门题hhh。

轻错点解析

  1. 不亮堂发生没有同桌将 Oyk 看成了 Qyk …(逃;

参考代码

标程:

#include <stdio.h>

int main() {
    int N;
    while (~scanf("%d", &N)) {
        puts(N % 3 ? "Oyk Oyk!" : "diu,Czj!");
    }
    return 0;
}

递推解法(改自一个同校的付出):

#include <stdio.h>

const int MAXN = 1E6;
int win[MAXN + 1];

void init() {
    for (int i = 1; i <= MAXN; ++i) {
        for (int j = 1; j <= i; j <<= 1) {
            if (!win[i - j]) {
                win[i] = 1;
                break;
            }
        }
    }
}

int main() {
    init();
    int N;
    while (~scanf("%d", &N)) {
        puts(win[N] ? "Oyk Oyk!" : "diu,Czj!");
    }
    return 0;
}

M. 光棍节活动

Description

一年一度的光棍节活动中,cgy
的班级想做一个别具一格的动,要求用班上之男生和女生到分组,规则如下:

  1. 每个组中男生数要一致,女生数也要平等;
  2. 与一个组中的男生数不能够等于女生数;
  3. 每组中男生和女生分别要生 2 名或上述;
  4. 务必使分成 2 独或以上的组,组数也要尽可能的基本上才好打;

使未可知全面分组,将随意抽出一誉为男生与同等名叫女生组成一起进行装扮情侣活动,重复进行(尽量少之次数)抽人直到剩余的孩子大人口恰好可以全面分组。
假设总不存完美分组,那么除了成功组队进行装扮情侣的他,可能会见多起几男生要女生没有组队哦(同性才是真正好!)。

cgy 安排 lxy 实施之方案,但 lxy 脸葡京签到送彩金红心跳,想求你帮忙拉。

Input

第一实施输入正整数 \(T \leq 100\)
代表共发生 \(T\) 种情况。
接下来 \(T\) 行,每行包含两只正整数
\(N < 10^5\) 和 \(M < 10^5\) 代表在该种情况屡遭生出 \(N\) 名男生和 \(M\) 名女生。

Output

于各种状况,请您拉计算起得了美分组数和扮情侣数,在一行中输出,用空格隔开。
假设存在没有组队的福星,你得还为 ta 们输出都只输出一行 “happy single
dog!” (不包引号)聊表庆祝。

Sample Input

3
18 24
19 25
18 19

Sample Output

6 0
6 1
0 18
happy single dog!

Hint

样例解释:
对于样例 1 ,可以圆分组为极其多 6 组,每组有 3 称男生 4
名女生,不需要再减少人开展装扮情侣活动。
对此样例 2 ,先抽出一针对送给 FFF 团,之后就跟样例 1 一样啊。
对此样例 3 ,只能抽出 18
对玩假扮情侣活动,然后下一行也剩下的要命妹纸出口 happy single dog! 。

题材大意

产生少堆放数量不同的物料,要求对该展开分组,且完成组数最大化;
勿能够就分一个组,否则不为分组;
切莫能够自由分组,每个组的景而一致;
进入规则 2 ,一个组中不同门类物品数量不等;
在规则 3 ,一个组中任意一种物品数量不也 1 。
(由于自家原来的次忘记考虑规则 3
,所以比赛被临时删掉了,后来意识数目也不曾卡掉,改不改动都是对准之)

参照思路

数据关系规律题,枚举到能够告最大公约数为止。
假定少独数据等则一直通正是假扮情侣。
倘少只数据相差 1 则一定非可知请 gcd 。
若枚举过程中极特别勤得整除最小数,则非饱规则 3 。
苟枚举失败,那便无能够完美分组了。

参考代码

脚的代码都考虑了平整 3 :

#include <stdio.h>

int N, M;

void swap(int &a, int &b) {
    const int t = a;
    a = b;
    b = t;
}

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

void read() {
    scanf("%d %d", &N, &M);
}

void work() {
    int perfect = 0, fake = 0;
    bool hasSingle = false;
    if (N > M) {
        swap(N, M);
    }
    if (N == M) {
        fake = N;
    } else if (N + 1 == M) {
        hasSingle = true;
        fake = N;
    } else {
        int groupCnt = 1;
        while (N && (1 == (groupCnt = gcd(M, N)) || N == groupCnt)) {
            ++fake;
            --N;
            --M;
        }
        if (!N) {
            hasSingle = true;
        } else {
            perfect = groupCnt;
        }
    }
    printf("%d %d\n", perfect, fake);
    if (hasSingle) {
        puts("happy single dog!");
    }
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        read();
        work();
    }
    return 0;
}

初赛复盘

相同开始自己是没有想了如管题目排成者顺序的,我们的背锅侠忘记调啦!于是只好在
7
分钟发了条@全员说难度不按梯次,然而大家要爱按部就班顺序做(摊手.jpg)。于是便又起矣同堆放被打击信心之爆零啦
qwq

就就是由于尚未尽验题,陆续发现了卡 cin
之类的奇怪问题,改了一定量次等数据重判了好多次等,又拿本 AC 的吃重判成 TLE
了“咦重判完 AC 反而易少了”(药丸.jpg)。

下一场安利一下 qu 老师家的可能还算好用的金山 WPS
写得;借助这个奇怪之著作(?)工具临时对发现的有题材,一些无说清楚的事项作了个补充(虽然感到并无丁看),于是像
system("pause") 之类的顶深似乎尚未在选手们的交给中出现过了。

整体区分度良好,从最后排名来拘禁,做对题目数上阶段性分布;除了 A
题是只看起简单其实大家都无学过的雅坑客,对 H 题《CG
之如何》难度估算错误,显然大家都没听说过斐波那契的通项公式;对 M
题《光棍节活动》难度估算错误,虽然与 K
题《强迫症患者》一样是要因此到要最大公约数的算法,但题面明显比复杂,陈述有待优化,甚至出现有写人自己尚且渗透考虑其中一个准的场面;对
L 题《Oyk
捏泡泡纸》难度估算错误,显然大家找找规律的力量还是坏高的,之前是认为是博弈题比较麻烦证明,然而大家敢于交题。。

完题目质量优异,除了各自题目题意有待提高、条件描述不标准或任何小题目他,涉及的知识点较咸,没有更出题;除了各自选手在
F
题用到批处理生成长段代码,正解解答代码量适中,涉及的少数程序语言文化大致可教xue学xi进度。

出题总结

题号 题目 ZYJ 预xia估cai难度 正确率(正确/提交) 通过率(正确人数/有效人数) 出题人
A 诡异的计数法 2.8 9.88%(100/1012) 61.64%(90/146) Cgy
B 数发票 4.0 11.43%(28/245) 13.01%(19/146) Cgy
C Ljc 吃糖 2.5 8.82%(30/340) 14.38%(21/146) Ljc
D 姓名字母排列 2.5 9.59%(21/219) 8.22%(12/146) Zyj
E Substring 2.0 51.08%(118/231) 74.66%(109/146) Zlm
F 法特狗 3.0 7.29%(25/343) 12.33%(18/146) Cgq
G Zyj 打印奖状 1.0 26.97%(140/519) 88.36%(129/146) Cgy
H Cg 之争 1.8 21.55%(86/399) 53.42%(78/146) Cgy
I 人形质量单位 4.0 20.00%(16/80) 6.85%(10/146) Lxy
J 训练 ZetaGo 3.0 21.02%(78/371) 47.95%(70/146) Zyj
K 强迫症患者 2.5 21.26%(44/207) 27.40%(40/146) Lxy
L Oyk 捏泡泡纸 3.0 59.90%(118/197) 74.66%(109/146) Zyj
M 光棍节活动 2.2 11.35%(43/379) 26.03%(38/146) Zyj

呃,文字性的物辣么烦,怎么可能会见时有发生出题总结这种事物嘛。

最后

初赛并无是为为难大家,而是叫大家感受 ACM
程序设计比赛是如何的,算法和数据结构是单什么东西,对于一个都解的题目,如何抽象出它们的范并找到适当的主意,在比较好的特性外解决它们。
现年应吗是首先年许转专业的同学参加,一开始还蛮担心她们大多学了半学期《数据结构》会无会见太胜了的(逃)。可能对此绝大多数同班来说,参加
ACM
新生赛或许是首先不好这样高密度地思量和缓解问题,但无论是是萌新也好,还是改变专业的同桌也好,希望我们这次比赛可以是公踏上上正式成长途径的第一步,相信呢只是各位的成千上万活着历程的同一聊截,未来底存还死丰富,可能您晤面如本人同一莫名其妙地改成了前端开发,可能你见面举行片复幽默之物,可能而下会做一样称教职工,也或您晤面连续深入计算机科学的钻被,甚至可能好上算法竞赛和算法研究暨计划,往小了游说后还有
CTF 竞赛(逃)。
不管怎样,希望这次比赛能够被你感触及电脑科学的措施和程序设计的魅力,让您的编程能力有着锻炼以及增强,让您的思量空间及知识面有所扩大,而不仅仅是待在表面上之“这个极碍事矣”“这个有什么用嘛”“我随后总会学到的”,谢谢!

本文基于葡京签到送彩金 1知识共享署名-非商业性使用-相同方式一同享
4.0
国际许可协议宣布,欢迎引用、转载或演绎,但是要保留本文的签约BlackStorm与本文链接http://www.cnblogs.com/BlackStorm/p/SCNUCPCFF-2017-Solutions.html,且未经许可不可知用于商业目的。如发疑难还是授权协商请以及我关系。