专栏文章

【HT-049-Div.4】核桃新手组周赛个人题解

题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipzbvdt
此快照首次捕获于
2025/12/03 20:24
3 个月前
此快照最后确认于
2025/12/03 20:24
3 个月前
查看原文

0.序言

AK! 100+100+100+100=400

T1

说是只需要 O(1)O(1) 就能做但我忘了所以打了个 while 也能过。
CPP
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, ans = 0;
    cin >> n;
    n = 1000 - n;
    while(n != 0)
    {
        if(n>=1000) {ans++,n-=1000;continue;}
        if(n>=500) {ans++,n-=500;continue;}
        if(n>=100) {ans++,n-=100;continue;}
        if(n>=50) {ans++,n-=50;continue;}
        if(n>=10) {ans++,n-=10;continue;}
        if(n>=5) {ans++,n-=5;continue;}
        ans++,n--;
    }
    cout<<ans;
}

T2

枚举即可。
404^0 开始枚举直到 4k>n4^k > n(不难证明其实 k=n4k=\lfloor\frac{n}{4}\rfloor),若 n4imod5=0,i[0,m]n-4^i \bmod5=0,i\in[0,m],代表存在 4i+5j=n,j=n4i54^i + 5^j=n,j=\frac{n-4^i}{5} 这一种分法,计数器加一。最后输出计数器。
CPP
#include <bits/stdc++.h>
using namespace std;
int n, m;
int main()
{
    cin >> n;
    for (int i = 0; i <= n/4; i++)
    {
        if ((n-4*i)%5==0) m++;
    }
    cout<<m;
}

T3

先将输入的数组排序。字符串 ABC 一共只有六种排列情况,写六个 if 判断即可。
CPP
#include <bits/stdc++.h>
using namespace std;
int a[4];
string s;
int main()
{
    for(int i = 1;i  <= 3; i++)
    {
        cin >> a[i];
    }
    sort(a+1,a+4);
    cin >> s;
    if(s=="ABC")printf("%d %d %d",a[1],a[2],a[3]);
    if(s=="ACB")printf("%d %d %d",a[1],a[3],a[2]);
    if(s=="BAC")printf("%d %d %d",a[2],a[1],a[3]);
    if(s=="BCA")printf("%d %d %d",a[2],a[3],a[1]);
    if(s=="CAB")printf("%d %d %d",a[3],a[1],a[2]);
    if(s=="CBA")printf("%d %d %d",a[3],a[2],a[1]);
}

T4

无论我们如何操作,所有购物券与口袋里的购物券上的数值总和是不变的,因为我们相当于只能将一张购物券上的 11 点面值转移到另一张购物券上。所以最后地上的购物券的值全部为 00 的同时,口袋中的购物券应该为 i=1nai\sum_{i=1}^{n}a_i,即初始地上所有购物券的面值总和。
对于一张购物券,面值为 aia_i,那么它归零所需的操作次数为 ai|a_i|。每次操作,我们可以令两张优惠券剩余所需操作次数减少 11,而总需操作次数减少 22
  • 如果 i=1nai=0\sum_{i=1}^{n}a_i=0,代表着我们可以在不使用口袋中的购物券的情况下,仅通过正负抵消来完成。此时操作数即为: i=1nai2\frac{\sum_{i=1}^{n}|a_i|}{2}
  • 否则,在进行 i=1nai2\frac{\sum_{i=1}^{n}|a_i|}{2} 次消除后,还要额外进行 i=1nai2\frac{\sum_{i=1}^{n}a_i}{2} 次操作,使用口袋中的购物券来消除。总操作数为 i=1nai+i=1nai2\frac{\sum_{i=1}^{n}|a_i|+\sum_{i=1}^{n}a_i}{2}
不难发现当 i=1nai=0\sum_{i=1}^{n}a_i=0 时第二种情况推出的式子同样适用于第一种情况,因此连条件判断语句都省了,最终答案即为:
i=1nai+i=1nai2\frac{\sum_{i=1}^{n}|a_i|+\sum_{i=1}^{n}a_i}{2}
CPP
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    long long sum = 0, abs_sum = 0;
    for (int i = 1; i <= n; ++i)
    {
        int x;cin >> x;
        sum += x; abs_sum += abs(x);
    }
    long long ans = (abs_sum + abs(sum)) / 2;
    cout << ans << " " << sum;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...