【4/1/26 更新第12题】摸鱼人节(April Fish Day)一周年,推荐一些有趣但不难的编程练习题(不是 LeetCode)

7456 我本来还在想 这要怎么数
拍一下脑袋才反应过来 这不就是加减法吗

真的给猴哥学校跪了,first solve 三分钟,我连题都没读完呢……

太慢了,搁lc周赛人家四题都做完了

本來想看看自己有多弱智,但是想到 JavaScript 處理 input 好麻煩就懶了 :face_exhaling:

这种题不用 Python 就是在跟自己作对,C++ 还要担心 int 会不会溢出 :yaoming:

JavaScript 有 BigInt

JS 寫題實在痛苦,很多標準 data structures 都沒有,搞得 LeetCode 還得給你引進第三方庫 :distorted_face:

2 个赞

python也没有标准

也得用

1 个赞

说实话我被 :airplane: :brain: 安利了几次之后现在真心觉得

不错 :joy:

看题型想到组合计数,想了三分钟然后发现只是加减法 :yaoming:

老话说得好,不开long long见祖宗

等待 sortedcontainers 加入標準包的那一天:Add binary search tree to collections - Ideas - Discussions on Python.org

JavaScript 可是連 queue/heap 都沒有 :distorted_face:

2 个赞

三十分钟都做不出来,我太笨了

旅行者也用,虽然是主人的任务罢了

:distorted_face: 用时 10 分钟

:distorted_face: 还爆了一波 int

3 个赞

罚时 20 分钟 :yaoming:

image

四小时内做出来击败100%美国大学生

有趣但不难

注意审题!

摸鱼人节(April Fish Day)快乐!不知不觉这个帖子已经一周年了。一年十二题,四舍五入也算是月更了吧[1] :joy:

今天的题目是 2026 年 ICPC North America Championship 的另一道签到题。这是一道跟薅羊毛有关的题——I Don’t Miss Pennies :coin:


Kattis 链接:I Don't Miss Pennies – Kattis, Kattis

解题思路

首先我想说的是,题目中薅羊毛的方法简直是弱爆了,Citi Rewards+ 才是 yyds(

言归正传,其实这道题的结果跟每件商品的具体价格无关,只跟价格除以五的余数有关。

  • 如果余数是 0、1、2,那么单独购买就好了,羊毛薅到 :666:
  • 如果余数是 3 或 4,那我们得想办法组合一下。最好的办法是每次把一个 3 和一个 4 凑成一对,可以薅到 2¢。这样凑完之后……
    • 如果还剩下多余的 3,那么每两个 3 凑在一起可以薅到 1¢。
    • 如果还剩下多余的 4,那么每三个 4 凑在一起可以薅到 2¢。
    • 如果还有多余的零头,就只能忍痛被反薅了 :cry:
参考代码
import collections

input()
c = collections.Counter(p % 5 for p in map(int, input().split(" ")))

pairs = min(c[3], c[4])
c[3] -= pairs
c[4] -= pairs

print(c[1] + c[2] * 2 + pairs * 2 + c[3] // 2 - (c[3] % 2) * 2 + (c[4] // 3) * 2 - c[4] % 3)

  1. [WARN] off-by-one error ↩︎

4 个赞

連簽到題都寫不出來 :cry:

随便贪了一下,过了。懒得证明了去捞卤牛肉了

n = int(input())
s = input()
mods = [0]*5
for item in s.split(' '):
    mods[int(item)%5] += 1
b, c, e, d = mods[1:]
res = b+2*c-d-2*e+min(d, e)*5
d, e = d-min(d, e), e-min(d, e)
res += (d//3)*5+(e//2)*5

print(res)

写完才发现和水妈的贪法是一样的。果然同样的论坛养出同样的挂壁。

1 个赞

WA 一次,寫得好醜 :wulian:

import collections

n = int(input())
prices = [int(_) for _ in input().split()]
piles = collections.defaultdict(int)

for p in prices:
    piles[(p % 5] += 1

# 3 + 4 -> 7
pair = min(piles[3], piles[4])
piles[3] -= pair
piles[4] -= pair
piles[2] += pair

# 3 + 3 -> 6
piles[1] += piles[3] // 2
piles[3] %= 2

# 4 + 4 + 4 -> 12
piles[2] += piles[4] // 3
piles[4] %= 3

res = piles[1] + piles[2] * 2 - piles[3] * 2 - piles[4]
print(res)

看不懂Python desuwa

总结
#include <bits/stdc++.h>
int n, x, res;
int main() {
    int a[5] = {0};
    res = 0;
    std::cin >> n;
    
    while (n--) {
        std::cin >> x;
        a[x % 5]++;
    }

    if (a[3] > a[4]) {
        a[2] += a[4];
        a[3] -= a[4];
        a[4] = 0;
        int r = a[3] / 2;
        a[1] += r;
        a[3] -= 2 * r;
    } else if (a[3] == a[4]) {
        a[2] += a[3];
        a[3] = 0;
        a[4] = 0;
    } else {
        a[2] += a[3];
        a[4] -= a[3];
        a[3] = 0;
        int r = a[4] / 3;
        a[2] += r;
        a[4] -= 3 * r;
    }
    
    for (int i = 1; i <= 2; i++) {
        res += a[i] * i;
    }
    for (int i = 3; i <= 4; i++) {
        res -= a[i] * (5 - i);
    }

    std::cout << res << std::endl;
}

这种题比较适合数学好的人做,不用纠结半天证明贪心是对的