没有保存题面,只能靠回忆把题目写出来

一,点外卖

点外卖有两种优惠方式,一是凑满减,二是使用折扣

凑满减只享受最大的,也就是说满10减一和满20减2的话超过20只减2

每个外卖都有一个折扣价,使用了折扣价就不能凑满减,反过来也一样

然后给出nn个外卖,问在购买前12..n1,2..n个的时候,哪种更优惠

暴力就完了 数据量很小

nn表示有nn种外卖,mm表示有mm种满减方式

a,b,c,da,b,c,d数组分别外卖价格,外卖折扣价,满减条件,满减金额(达到c就减d)

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

const int maxn = 5005;
int a[maxn] , b[maxn] , c[maxn] , d[maxn];
int main(void){
    int n , m;
    cin>>n;
    for(int i = 1 ; i <= n ; ++i){
        cin>>a[i];
    }
    for(int i = 1 ; i <= n ; ++i){
        cin>>b[i];
    }
    cin>>m;
    for(int i = 1 ; i <= m ; ++i){
        cin>>c[i];
    }
    for(int i = 1 ; i <= m ; ++i){
        cin>>d[i];
    }
    int sum = 0;
    int zsum = 0;
    int jsum = 0;
    for(int i = 1 ; i <= n ; ++i){
        sum += a[i];
        zsum += b[i];
        int j = 1;
        jsum = sum;
        for(j = 1 ; j <= m ; ++j){
            if(sum < d[j]){
                break;
            }
        }
        if(j > 1 ){
            jsum = sum - d[j - 1];
        }
        if(jsum == zsum) cout << "B";
        else if(jsum > zsum) cout<<"Z";
        else cout<<"M";
    }
    cout<<endl;
    return 0;
}

二,解密和加密

给出一个长为nn的字符串,和一个数字kk,k=1k=1表示加密,k=2k=2表示解密

加密规则为拿出字符串的第ceil(str.size()/2.0)ceil(str.size() / 2.0)个数,放在解密串的第一个,一直这样循环,只到加密完成。

样例是hhhaaa -> hahaha

解密就是反过来,

加密模拟,解密找规律

123456 -> 342516 1234567 -> 4352617

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

int main(void)
{
    int n, m;
    cin >> n >> m;
    string str, ansStr;
    cin >> str;
    if (m == 1)
    {
        while (str.size())
        {
            int k = ceil(str.size() / 2.0) - 1;
            // cout<<k<<endl;
            ansStr += str.substr(k, 1);
            str.erase(k, 1);
        }
    }
    else
    {
        if (str.size() % 2 == 1)
        {
            int k = str.size() - 2;
            for(int i = k ; i >= 0 ; i -= 2){
                ansStr += str.substr(i , 1);
            }
            for(int i = 0 ; i < str.size() ; i += 2){
                ansStr += str.substr(i , 1);
            }
        }
        else
        {
            int k = str.size() - 2;
            for(int i = k ; i >= 0 ; i-= 2){
                ansStr += str.substr(i , 1);
            }
            for(int i = 1 ; i < str.size() ; i += 2){
                ansStr += str.substr(i , 1);
            }
        }
    }
    cout << ansStr << endl;
    return 0;
}

后面两题晚点再写,后面两题都没满分,只能口胡一下

三,修电脑

大概就是给家里有一台电脑,公司有一台电脑,共享nn个文件,然后给出两个数组,数组里装的是区间,第一个数组表示家里的文件哪些区间修改了,第二个表示公司的,然后输出家里和公司都修改了的文件数量。

四,取球

给你nn个球,每个球有一个数字,然后从这些球里取若干个

要求满足

1,取得球上的数字和能够被 k1k1 整除

2,取得球上的数字和不能够被 k2k2 整除

3,数字和要尽可能大

问有多少种取法,对998244353取模