侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 22 条评论

目 录CONTENT

文章目录

拼题 520 钻石争霸赛 2024

GabrielxD
2024-05-21 / 0 评论 / 0 点赞 / 156 阅读 / 4,434 字
温馨提示:
本文最后更新于 2024-05-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

520-1 爱之恒久远

在 520 这个特殊的日子里,请你直接在屏幕上输出:Forever and always

输入格式:

本题没有输入。

输出格式:

在一行中输出 Forever and always

输入样例:

输出样例:

Forever and always

解题:模拟

代码
#include <cstdio>

using namespace std;

int main() {
    printf("Forever and always");

    return 0;
}

520-2 良辰吉日

万事都讲究“吉利”二字,挑选一个良辰吉日对结婚来说更是至关重要。婚礼日期的选择有非常多的讲究,这里我们只论最简单的一条:选双日,讲究“好事成双”。
“双日”指两种日期均为偶数的日子。两种日期是指每个月的第 x 天、每周的第 y 天。
现给定一对新人都有空的日期 xy,请你写程序判断一下是不是双日。

输入格式:

输入在一行中给出一对整数 xy,其中 1x311\le x \le 311y71\le y\le 7

输出格式:

如果输入是一个双日,在一行中输出 x y ^_^!;否则输出 x y -_-。其中 xy 是输入的 xy 的值。

输入样例 1:

2 4

输出样例 1:

2 4 ^_^!

输入样例 2:

26 7

输出样例 2:

26 7 -_-

解题:模拟

代码
#include <cstdio>

using namespace std;

int main() {
    int x, y;
    scanf("%d%d", &x, &y);
    printf("%d %d ", x, y);
    puts((x & 1) == 0 && (y & 1) == 0 ? "^_^!" : "-_-");

    return 0;
}

520-3 记小本本

小情侣吵架拌嘴是很正常的事情,但拿小本本记下来就不好了,应该写个程序自动记……
本题的要求比较简单,只是统计吵架次数而已。姥姥给小情侣们做红色、绿色两个按钮,每次吵架就按红色按钮,想知道已经吵了多少次了就按绿色按钮。你就来实现这两个按钮的功能。

输入格式:

对每一个输入的 0,在一行中输出这次按下绿色按钮之前一共吵了多少次架。
题目保证每个输出的数字均不超过 104。

输出格式:

如果输入是一个双日,在一行中输出 x y ^_^!;否则输出 x y -_-。其中 xy 是输入的 xy 的值。

输入样例:

1
1
1
0
1
1
0
1
2

输出样例:

3
5

解题:模拟

代码
#include <cstdio>

using namespace std;

int main() {
    int x, cnt = 0;
    while (~scanf("%d", &x) && (x == 0 || x == 1)) {
        if (x == 1) ++cnt;
        else printf("%d\n", cnt);
    }

    return 0;
}

520-4 土味情话但数学

土味情话是指那些听起来比较俗气、比较接地气的情话,通常用于表达爱情或亲密关系。以下是一些土味情话的例子:

  • 我发现你今天有点怪,为什么?怪可爱的。
  • 我是 9 你是 3,除了你还是你。
  • 可以帮我洗个东西吗?洗什么?喜欢我。
  • 我 1 点也不想你,1 点半再想。
  • 1 对 0 说,我除了你,一切都没有意义
  • ……

喜欢数学的人对数字特别敏感,下面就请你从一大堆土味情话中,把那些带数字的情话挑出来。

输入格式:

输入首先在第一行给出一个正整数 n100\le 100),是土味情话的条数。随后 n 行,每行(以回车结束)给出一句土味情话。用汉语拼音给出的土味情话由不超过 100 个数字、中文字的汉语拼音、标点符号组成,相邻两字间以标点符号或/和 1 个空格分隔,每个字的拼音长度不超过 5 个小写英文字母,数字为不超过 100 的非负整数。题目保证每句土味情话都不是空话(至少有一个字的拼音或数字)。

输出格式:

按照输入的顺序,原样输出那些句子中带数字的土味情话。如果完全没有带数字的句子,则输出 Not interesting.

输入样例 1:

5
wo fa xian ni jin tian you dian guai, wei shen me? guai ke ai de.
wo shi 9 ni shi 3, chu le ni hai shi ni.
ke yi bang wo xi ge dong xi ma? xi shen me? xi huan wo.
wo 1 dian ye bu xiang ni, 1 dian ban zai xiang.
1 dui 0 shuo, wo chu le ni, yi qie du mei you yi yi.

输出样例 1:

wo shi 9 ni shi 3, chu le ni hai shi ni.
wo 1 dian ye bu xiang ni, 1 dian ban zai xiang.
1 dui 0 shuo, wo chu le ni, yi qie du mei you yi yi.

输入样例 2:

2
wo fa xian ni jin tian you dian guai, wei shen me? guai ke ai de.
ke yi bang wo xi ge dong xi ma? xi shen me? xi huan wo.

输出样例 2:

Not interesting.

解题:模拟

代码
#include <cstdio>
#include <cctype>

using namespace std;

const int N = 1e5 + 10;
int n;
char s[N];

int main() {
    scanf("%d", &n);
    getchar();
    bool flag = false;
    while (n--) {
        fgets(s, sizeof(s), stdin);
        for (int i = 0; s[i] && s[i] != '\n'; i++) {
            if (isdigit(s[i])) {
                printf("%s", s);
                flag = true;
                break;
            }
        }
    }
    if (!flag) puts("Not interesting.");

    return 0;
}

520-5 婚礼上的游戏

姥姥在劳动节假期出席了八云学长的婚礼,婚礼上有一个小游戏比较适合拿来出题,于是就有了这个题目。
在游戏中,主持人手举一个计时器,递给参与游戏的宾客一个红色按钮,按下后计时器上的数字就开始以每厘秒一个数字的速度跳动。宾客要在最接近 3 秒(即 300 厘秒)的时刻再次按下按钮,停止计时。停止的时刻最接近 300 厘秒的宾客获得大奖。
姥姥记录了所有宾客们玩这个游戏的成绩,下面就请你统计一下,有多少人获得了大奖。

输入格式:

输入首先在第一行给出一个正整数 n1000\le 1000),是参与游戏的宾客数量。随后 n 行,每行给出一位宾客的计时结果,是以厘秒为单位,在区间 [100,500][100,500] 内的整数。

输出格式:

输出获得大奖的宾客人数,即计时结果最接近 300 厘秒的并列人数。

输入样例:

5
157
298
302
303
325

输出样例:

2

解题:模拟

代码
#include <cstdio>
#include <cctype>
#include <cmath>

using namespace std;

int n, x;

int main() {
    scanf("%d", &n);
    int mn = 2e9, mn_cnt = 0;
    while (n--) {
        scanf("%d", &x);
        int y = abs(x - 300);
        if (y < mn) {
            mn = y;
            mn_cnt = 1;
        } else if (y == mn) mn_cnt++;
    }
    printf("%d\n", mn);

    return 0;
}

520-6 借贷还是赠予

每逢 520 这类日子,许多情侣之间会转账 520 元、1314 元等金额,尤其是热恋期,双方对花费不太计较,但一旦感情破裂,经济纠纷随之而来。日常生活中,情侣间的转账是借款还是赠与?法官认为,“1314”、“520”等对男女朋友关系具有特殊含义的金额,应认定为赠与。
现给定一个情侣特殊数字的集合,对于某人的转账清单,请你标记出哪些是赠予,哪些是借贷。

输入格式:

输入首先在第一行给出一个正整数 n103\le 10^3),是情侣特殊数字的数量。随后一行给出 n 个不超过 10410^4 的正整数。
接下来一行给出一个正整数 m103\le 10^3),是转账记录的条数。随后一行给出 m 个不超过 10910^9 的转账金额。

输出格式:

按照输入的顺序处理转账金额,每个处理结果占一行。对于每个转账金额,如果其是情侣特殊数字集合中的数字,就在对应行中输出 ZengYu,否则输出 JieDai

输入样例:

4
1314 521 2199 520
10
10 12345678 520 2200 233 2199 1314 666 888 521

输出样例:

JieDai
JieDai
ZengYu
JieDai
JieDai
ZengYu
ZengYu
JieDai
JieDai
ZengYu

解题:模拟 哈希表

代码
#include <cstdio>
#include <unordered_set>

using namespace std;

int n, m;

unordered_set<int> st;

int main() {
    scanf("%d", &n);
    while (n--) {
        int x; scanf("%d", &x);
        st.insert(x);
    }
    scanf("%d", &m);
    while (m--) {
        int x; scanf("%d", &x);
        puts(st.find(x) != st.end() ? "ZengYu" : "JieDai");
    }

    return 0;
}

520-7 静待缘分

如果有这样两个整数 xy,它们的和、差、积、商之和正好等于某个正整数 N,则它们就是一对缘分到了 N 级的数。

本题给定任一正整数 N,请你找出所有缘分到了 N 级的数。

注:解题过程中可能用到的一元二次方程 ax2+bx+c=0ax^2+bx+c = 0a0a\ne0)的求根公式为:x=(b±b24ac/2ax = (-b \pm \sqrt{b^2 - 4ac} / 2a

提示:如果 (x,y) 是一对缘分到了 N 级的数,则 x/y 一定是整数。

输入格式:

输入在一行中给出正整数 N106\le 10^6)。

输出格式:

如果存在满足要求的一对缘分到了 N 级的数 (x,y),则在一行中输出。格式为:

(x, y)

如果达到这个级别缘分的数字有有多对,则按照 x 的递增序输出。

输入样例:

27

输出样例:

(-54, -2)
(-12, -4)
(6, 2)

解题:数学

由题意得:要求 (x+y)+(xy)+(xy)+(x÷y)=n(x + y) + (x - y) + (x \cdot y) + (x \div y) = n 的所有 (x,y)(x, y) 整数解。

化简得:2x+xy+xy=n2x + xy + \frac{x}{y} = n

由于 xx 是整数,yy 是整数,nn 是正整数,要想使 xy\frac{x}{y} 为整数,xx 就必须是 yy 的整数倍,且 yy 不能为 00

故:设 x=ky(kZ)x = ky(k \in \mathbb{Z})

原式变为:

2ky+ky2+k=nk(y2+2y+1)=ny2+2y+1=nky2+2y+1nk=0\begin{aligned} 2ky + ky^2 + k &= n \\ k(y^2 + 2y + 1) &= n \\ y^2 + 2y + 1 &= \frac{n}{k} \\ y^2 + 2y + 1 - \frac{n}{k} &= 0 \end{aligned}

为保证 k,yk, y 为整数,必须满足 kknn 的因数,所以枚举 nn 的因数为 kk 然后解这个一元二次方程即可。

注意答案需要去重+排序(应该)。

代码
#include <cstdio>
#include <set>
#include <cmath>

using namespace std;

typedef pair<int, int> pii;

int n;

set<pii> st;

bool check(int x, int y) {
    return y != 0 && x + y + x - y + x * y + x / y == n;
}

void solve(int a, int b, int c, int k) {
    int delta = b * b - 4 * a * c;
    if (delta == 0) {
        int y = (-b + sqrt(delta)) / (2 * a);
        if (check(k * y, y)) st.insert({k * y, y});
    } else if (delta > 0) {
        int y1 = (-b + sqrt(delta)) / (2 * a);
        int y2 = (-b - sqrt(delta)) / (2 * a);
        if (check(k * y1, y1)) st.insert({k * y1, y1});
        if (check(k * y2, y2)) st.insert({k * y2, y2});
    }
}

int main() {
    scanf("%d", &n);
    for (int k = 1; k <= n; k++) {
        if (n % k != 0) continue;
        solve(1, 2, 1 - n / k, k);
    }
    for (const auto& [x, y] : st) {
        printf("(%d, %d)\n", x, y);
    }

    return 0;
}

520-8 测测名字

有一个“爱情测试研究所”请你帮助写一个测恋人名字的小程序,需求如下:

  • 需要准备一本“答案之书”,书中列出若干由 4 ~ 8 个中文字组成的句子,即为测试答案。部分答案是正向的,例如“其实我在等你”;部分答案是负向的,例如“相见不如怀念”。
  • 提取句子中每个字的汉语拼音首字母,例如“其实我在等你”对应“qswzdn”,“相见不如怀念”对应“xjbrhn”。
  • 接收两位用户输入的姓名,同样提取名字中每个字的汉语拼音首字母,形成姓名缩写。例如“张丹宁”对应“zdn”,“齐少文”对应“qsw”。
  • 将两位用户的姓名缩写拼接在一起,去答案之书中寻找缩写完全一致的答案,并输出。例如“齐少文”和“张丹宁”的名字拼接起来,就可以得到“其实我在等你”。

当然答案之书的答案可能是不唯一的 —— 两个名字的先后拼接顺序就至少对应了两种可能的答案。对于同一种拼接,答案之书也可能有多个答案与之对应。则输出规则如下:

  • 在所有对应的答案有正向有负向时,一定选择正向的答案输出;没有正向答案的时候只好选择负向的。
  • 如果前一步选择的同向答案不唯一,则首先将这些答案按其在书中的编号递增排序,然后输出第 k1\ge 1)个答案,其中 k=nt%na+1k = n_t \% n_a + 1ntn_t 是两位用户姓名的汉语拼音字母总数,nan_a 是候选输出答案的总数。

输入格式:

输入首先在第一行给出一个正整数 n105\le 10^5),是答案之书中答案的个数。随后 n 行,每行(以回车结束)按下列格式给出一句答案:

答案属性 用汉语拼音给出的答案句子

其中答案属性为 1 表示正向,为 0 表示负向;用汉语拼音给出的答案句子由 4 ~ 8 个中文字的汉语拼音组成,相邻两字间以 1 个空格分隔,每个字的拼音长度不超过 5 个小写英文字母。注意:这里默认第 i 行给出的答案对应编号为 i1in1\le i\le n)。
随后一行给出正整数 m103\le 10^3),是前来咨询的用户对数。随后 2m 行,每行(以回车结束)给出一位用户的姓名,由 2 ~ 4 个中文字组成,同样以汉语拼音的格式给出,即相邻两字间以 1 个空格分隔,每个字的拼音长度不超过 5 个小写英文字母。默认每 2 行对应一对用户。

输出格式:

对前来咨询的每一对用户,按照题面给出的规则输出答案之书的答案。如果答案不存在,则输出 tian ji bu ke xie lu(天机不可泄露)。

输入样例:

4
1 que shi wo zai deng nin
0 xiang jian bu ru huai nian
1 qi shi wo zai deng ni
0 zha da nan qi si wo
3
zhang dan ning
qi shao wen
ren huai nan
xiao jin bo
wo bu cun zai
ai

输出样例:

qi shi wo zai deng ni
xiang jian bu ru huai nian
tian ji bu ke xie lu

样例说明:

第 1 对用户可以得到 3 条答案,其中 2 条是正向的。这时 ntn_t 是 21,nan_a 是 2,则应该输出第 21%2+1=221\%2+1=2 条候选答案。
第 2 对用户只能得到 1 条负向的答案。
第 3 对用户找不到答案。

解题:哈希表 字符串的最小表示法

拼接字符串易想到最小表示法。用缩写的最小表示法做键,其它按题目模拟即可

代码
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <sstream>

using namespace std;

int _ = [] {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    return 0;
}();

int n, m;
string s, a, b;

string get_acronyms(string s) {
    istringstream iss(s);
    std::string word, res;
    while (iss >> word) res += word[0];
    return res;
}

string get_min(string s) {
    int n = s.size(), k = 0, i = 0, j = 1;
    while (k < n && i < n && j < n) {
        if (s[(i + k) % n] == s[(j + k) % n]) k++;
        else {
            (s[(i + k) % n] > s[(j + k) % n] ? i : j) += k + 1;
            if (i == j) i++;
            k = 0;
        }
    }
    i = min(i, j);
    return s.substr(i) + s.substr(0, i);
}

int main() {
    cin >> n;
    unordered_map<string, vector<string>> positives, passives;
    while (n--) {
        int type; cin >> type;
        cin.ignore();
        getline(cin, s);
        if (type == 1) positives[get_min(get_acronyms(s))].push_back(s);
        else passives[get_min(get_acronyms(s))].push_back(s);
    }
    cin >> m;
    cin.ignore();
    while (m--) {
        getline(cin, a), getline(cin, b);
        int nt = 0;
        for (const char& c : a) {
            if (c != ' ') nt++;
        }
        for (const char& c : b) {
            if (c != ' ') nt++;
        }
        string min_acronyms = get_min(get_acronyms(a) + get_acronyms(b));
        if (!positives[min_acronyms].empty()) {
            cout << positives[min_acronyms][nt % positives[min_acronyms].size()] << '\n';
        } else if (!passives[min_acronyms].empty()) {
            cout << passives[min_acronyms][nt % passives[min_acronyms].size()] << '\n';
        } else {
            cout << "tian ji bu ke xie lu" << '\n';
        }
    }

    return 0;
}
0

评论区