AcWing 第35场周赛

4212. 字符串比较

题目链接

4212. 字符串比较 - AcWing题库

解题思路

c++自带字符串比较(字典序),所以主要工作是把两个字符串的大小写统一

代码

#include<iostream>
#include<cstring>
using namespace std;
​
string s1, s2;
​
void change_s(string &s)
{
    for(int i=0 ; i<s.length() ; i++)
        if(s[i]>='A' && s[i]<='Z')
            s[i] += 32;
}
​
int main()
{
    
    cin >> s1 >> s2;
    change_s(s1); //转为小写
    change_s(s2);
    
    if(s1<s2)
        cout << "-1";
    else if(s1>s2)
        cout << "1";
    else
        cout << "0";
​
    return 0;
}

特别注意

函数中要引入地址,这样才能在主程序中修改字符串

4213. 最小结果

题目链接

4213. 最小结果 - AcWing题库

解题思路

由于符号数量较小,所以可以枚举每种符号的情况。

代码

#include <iostream>
#include <cstring>
using namespace std;
​
int main()
{
    int a[4];
    char c[3];
    unsigned long long res=0;
​
    for(int i=0 ; i<4 ; i++)
        cin >> a[i];
​
    for(int i=0 ; i<3 ; i++)
        cin >> c[i];
​
    sort(a, a+4);
    if( a[0]==0 && (c[0]=='*' || c[1]=='*' || c[2]=='*') )
    {
        cout << "0";
        return 0;
    }
    if(c[0]==c[1] && c[1]==c[2])
    {
        if(c[0]=='*')
        {
            res = a[0];
            res *= a[1];
            res *= a[2];
            res *= a[3];
            cout << res;
            return 0;
        }
        if(c[0]=='+')
        {
            res = a[0]+a[1]+a[2]+a[3];
            cout << res;
            return 0;
        }
    }
​
    if(c[0]=='*')
    {
        if(c[1]=='*')
        {
            if(c[2] == '+')//**+
            {
                res = min(a[0]*a[1]*a[2]+a[3], a[0]*a[3]+a[2]*a[1]);
                cout << res;
                return 0;
            }
        }
        else if(c[1]=='+')
        {
            if(c[2]=='+')//*++
            {
                res = a[0]*a[1]+a[2]+a[3];
                cout << res;
                return 0;
            }
            else if(c[2]=='*')//*+*
            {
                res = min( ((a[0]*a[1])+a[3])*a[2], ((a[0]*a[1])+a[2])*a[3]);
                res = min(res, ((a[2]*a[1])+a[3])*a[0]);
                cout << res;
                return 0;
            }
        }
    }
    else if(c[0]=='+')
    {
        if(c[1]=='*')
        {
            if(c[2]=='*')//+**
            {
                res = min((a[0]+a[1])*a[2]*a[3], (a[2]+a[3])*a[0]*a[1]);
                cout << res;
                return 0;
            }
            else if(c[2]=='+')//+*+
            {
                res = a[3]+a[2]+a[0]*a[1];
                cout << res;
                return 0;
            }
        }
        else if(c[1]=='+')
        {
            if(c[2]=='*')//++*
            {
                res = a[3]+a[2]+a[1];
                res *= a[0];
                cout << res;
            }
        }
    }
​
​
    return 0;
}

4214. 三元组

题目链接

4214. 三元组 - AcWing题库

解题思路

枚举中间指针 j ,然后分别在 j 的左右两边枚举 i 和 k , 寻找最小值

讲解视频

AcWing 4214. 三元组(AcWing杯 - 周赛) - AcWing

代码

#include<iostream>
using namespace std;
​
const int M = 3010, INF = 5e8;
long long res = 0;
long long s[M], c[M];
​
int main()
{
    int n;
    cin >> n;
    
    for(int i=0 ; i<n ; i++)
        cin >> s[i];
    for(int i=0 ; i<n ; i++)
        cin >> c[i];
        
    long long res = INF;
    for(int j=0 ; j<n ; j++)
    {
        long long left = INF, right = INF;
        for(int i=0 ; i<j ; i++)
            if(s[i] < s[j])
                left = min(left, c[i]);
        for(int k=j+1 ; k<n ; k++)
            if(s[j] < s[k])
                right = min(right, c[k]);
                
        res = min(res, left+c[j]+right);
    }
    
    if(res == INF) res = -1;
    
    cout << res;
    
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值