T1 凑数

难度:学过输入输出就可以拿到满分。

满分做法:题目要求我们输出三个非负整数 a,b,ca,b,c,使得 a+b+c=na+b+c=n。可能有多种答案,而我们只需要输出其中一种即可。又根据 nn 的范围得知,nn 一定是大于等于 33 的正整数。所以 nn 这个数必然可以被拆分成 1,1,n21,1,n-2 三个数,我们直接输出这三个数就可以啦。

C++ 代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    cout << 1 << " " << 1 << " " << n - 2 << endl;
    
    return 0;
}

T2 开三方

难度:掌握单层循环语句,并且了解次方的数学含义。就可以拿到满分。

满分做法:根据题意 l<=n3<rl<=\sqrt[3]{n}<rlll<=n<rrrl*l*l<=n<r*r*r。又因为 l+1=rl+1=r,所以我们只需要从小到大枚举 rr 的值,找到第一个满足 n<rrrn<r*r*r 的解。

注:本题数据范围较大,要把变量定义成 long long 类型!!!

C++ 代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long n;
    cin >> n;
    
    for (int i = 1; ; i ++ )
    {
        if (1LL * i * i * i > n)
        {
            cout << i - 1 << " " << i << endl;
            break;
        }
    }
    
    return 0;
}

T3 比大小

难度:需要熟练掌握分支、字符串以及字典序才可以拿到满分。

3030 分做法:对于 3030 % 的数据,a,ba,b 均在 int 的范围之内,使用整型来存储和比较即可。

满分做法:对于 100100 % 的数据,a,ba,b 显然无法再使用 intlong long 进行存储,需要将 a,ba,b 定义成字符串来储存,而字符串之间的关系运算已不符合数值之间的运算规则,我们需要思考所有可能的情况,进行分类讨论:

(1)两数相等,输出 “samesame”,则对应的字符串也应完全一致,我们可以通过 “====” 直接进行判断。

(2)第一个数是负数,第二个数是正数,即 a[0] 是 '-' ,b[0] 不是 '-' 时输出 "secondsecond"。

(3)第一个数是正数,第二个数是负数,即 a[0] 不是 '-' ,b[0] 是 '-' 时输出 "firstfirst"。

(4)两个数同正或者同负。

同正,即 a[0] 不是 '-' 且 b[0] 也不是 '-' 。先判断一下两个数的位数(字符串长度)是否相等。如果不等,则位数大的数值本身也一定更大。如果位数相等,则可以比较字典序,字典序大的数值更大。然后根据结果输出对应的语句即可!

同负,即 a[0] 是 '-' 且 b[0] 也是 '-'。判断原理同上,但结果相反。

C++ 代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string a, b;
    cin >> a >> b;
    
    if (a == b) cout << "same" << endl; // 相等
    else if (a[0] == '-' && b[0] != '-')
        cout << "second" << endl; // 一负一正
    else if (a[0] != '-' && b[0] == '-')
        cout << "first" << endl; // 一正一负
    else if (a[0] != '-' && b[0] != '-')
    {
        // 两个正数
        if (a.length() < b.length() ||
            (a.length() == b.length() && a < b))
            cout << "second" << endl;
        else
            cout << "first" << endl;
    }
    else
    {
        // 两个负数
        if (a.length() < b.length() ||
            (a.length() == b.length() && a < b))
            cout << "first" << endl;
        else
            cout << "second" << endl;
    }
    
    return 0;
}

T4 吃桃子

难度:需要熟练掌握结构体、 sort 排序和贪心思想。

满分做法:为了吃到最多的桃子,我们的策略是优先吃最开胃的桃子,因为这样能吃到尽可能多的桃子,必然开心程度也就高。而如果有相同开胃值的桃子,我们要优先吃其中开心值最高的桃子。

具体实现为,首先定义一个结构体,其中包括桃子的开胃值和开心值。因为我们要先按开胃值从大到小排序,开胃值相等时再按开心值从大到小排序。那么我们可以用 sort 排序,通过自定义 cmp 函数来处理这种二级排序的问题。在排序之后,我们就可以从头到尾模拟吃桃的过程,最后算出最大的开心程度即可得到答案。

C++ 代码

#include <bits/stdc++.h>
using namespace std;

struct st
{
    int a, b;
}p[100000]; // 定义一个结构体数组存储各个桃子的信息

bool cmp(st A, st B) // 自定义cmp函数,进行二级排序
{
    if (A.b == B.b) return A.a > B.a;
    return A.b > B.b;
}

int n, sum = 1, i, ans;

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ )
        cin >> p[i].a >> p[i].b;
    
    sort(p + 1, p + 1 + n, cmp); // 调用sort
	
    while (sum != 0 || i == n) // 模拟吃桃子的过程计算最大开心程度
	{
        i ++ ;
        ans += p[i].a;
        sum -- ;
        sum += p[i].b;
    }
	
    cout << ans << endl;
    
    return 0;
}

2 comments

  • @ 2024-12-28 15:08:45

    吃桃子那道题说实话不用排序相同开胃值中开心值最高,可以直接把所有开胃的桃子吃完,毕竟开胃值不可能小于1(((

    🤔 2
    • @ 2025-1-2 20:47:42

      @

      等你吃完开胃的桃子,剩下还能吃的时候就得 “排序相同开胃值中开心值最高”,冒泡有点简陋,不如直接 sort ++ 结构体预处理好省事了。

  • @ 2024-12-28 15:06:18

    刚在群里面说不至于用贪心吧就被打脸了哭😥

    🤣 2
    • 1