语法周赛 weekend3 题解

凑数

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

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

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
    cin>>n;
    cout<<1<<' '<<1<<' '<<n-2<<endl;
    return 0;
}

开三方

难度:掌握单层循环语句,并且了解次方的数学含义。就可以拿到满分。 满分做法:根据题意 l≤n3<r 即 l×l×l≤n<r×r×r。又因为 l+1=r,所以我们只需要从小到大枚举 r 的值,找到第一个满足 n<r×r×r 的解。

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

#include<bits/stdc++.h>
using namespace std;
long long n,r;
int main(){
    cin>>n;
    while(r*r*r<=n){
        r++;
    }
    cout<<r-1<<' '<<r;
    return 0;
}

比大小

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

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

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

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

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

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

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

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

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

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

吃桃子

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

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

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

#include<bits/stdc++.h>
using namespace std;
struct st{   //把桃子定义成结构体类型 
    int a,b;
};
st 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=0,ans=0;
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;
    return 0;
}

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注