双周赛补题目

本文介绍了如何提高打字效率,通过使用正确的手指对应键盘上不同颜色的键来练习打字。同时,提供了一个C++程序,用于计算给定字符串中每个手指在美式键盘上敲击的次数。此外,还涵盖了数学问题,如求最大公约数、香肠切割问题,以及活动安排和字符串解压缩等算法问题。
摘要由CSDN通过智能技术生成

如果你仍然再用二指禅打字,那我建议你重新学习打字,这样你打字会更快,感觉更舒适和愉快。

有很多网站教授正确的打字。下图描述了基本原理: 用同一手指按压颜色相同的键。黄色键需要用小指按压,蓝色的用无名指,绿色的用中指,红色的用食指。

另外,左手按键盘的左侧(从左侧的5、T、G、B键开始)右手按压右侧(从右侧的键6、Y、H、N开始)。拇指负责空格键。

图片描述的键盘是美式键盘。

现在,给出一段长度为 len(1≤len≤50) 的字符串,请你计算如果正确打出这个字符串,每个手指敲击键盘的次数。

输入格式:

输入为一行,一个由大写字母、数字和特殊符号组成的字符串(不包括空格,不需要管图片中未显示的按键)。

输出格式:

输出8行,表示左手小指、无名指、中指、食指以及右手食指、中指、无名指、小指敲击键盘的次数。

#include <iostream>
#include <string>
using namespace std;

char fingers[8][10] = {
    { '`', '1', 'Q', 'A', 'Z', '\0' },
    { '2', 'W', 'S', 'X', '\0' },
    { '3', 'E', 'D', 'C', '\0' },
    { '4', '5', 'R', 'T', 'F', 'G', 'V', 'B', '\0' },
    { '6', '7', 'Y', 'U', 'H', 'J', 'N', 'M', '\0' },
    { '8', 'I', 'K', ',', '\0' },
    { '9', 'O', 'L', '.', '\0' },
    { '0', 'P', ';', '/', '-', '[', '\'', '=', ']', '\0' }
};
size_t press_num[8] = { 0 };

int main() {
    bool is_find;
    string str;
    cin >> str;
    for (size_t i = 0; i < str.size(); i++) {
        is_find = false;
        for (size_t j = 0; j < 8; j++) {
            size_t k = 0;
            while (fingers[j][k]) {
                if (str[i] == fingers[j][k]) {
                    press_num[j]++;
                    is_find = true;
                }
                if (is_find) break;
                k++;
            }
            if (is_find) break;
        }
    }

    for (size_t i = 0; i < 8; i++) cout << press_num[i] << endl;
    return 0;
}

有 N 根完全相同的香肠, 现在要平均分给 M 个客人。 问最少需要切几刀才能将其平均分给客人(不能多个香肠一起切)。

输入格式:

两个整数 N(1≤N≤105) 和 M(1≤M≤105)

输出格式:

一个整数,表示要切的刀数

输入样例:

在这里给出一组输入。例如:

2 6

输出样例:

在这里给出相应的输出。例如:

4

 

#include <iostream>
using namespace std;

size_t great_common_division(size_t s_1, size_t s_2) {
    if (s_2 == 0) return 0;

    size_t temp;
    while (s_2 != 0) {
        temp = s_1 % s_2;
        s_1 = s_2;
        s_2 = temp;
    }
    return s_1;
}

int main() {
    size_t n, m;
    cin >> n >> m;
    n = n % m;
    if (n == 0)
        cout << 0;
    else{
        size_t gcd = great_common_division(m, n);
        n /= gcd;
        m /= gcd;
        cout << (m - 1) * gcd;
    }
    return 0;
}

学校的礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。

输入格式:

第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)

输出格式:

对于每一组输入,输出最多能够安排的活动数量。
每组的输出占一行

输入样例:

在这里给出一组输入。例如:

2
2
1 10
10 11
3
1 10
9 11
11 20

输出样例:

在这里给出相应的输出。例如:


#include<bits/stdc++.h>
using namespace std;
int m;
struct activ
{
int start;
int end;
};
bool cmp(activ a, activ b)
{
    if(a.end<b.end)return 1;
    else return 0;
}
activ mem[10010];

int main()
{
cin>>m;
while(m--)
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        mem[i].start=x;
        mem[i].end=y;
    }
    sort(mem,mem+n,cmp);
    int now=mem[0].end,ans=1;
    for(int i=1;i<n;i++)
    {
        if(now<=mem[i].start)
        {
            ans++;
            now=mem[i].end;
        }
    }
    cout<<ans<<endl;
}
system("pause");
return 0;
}

传说二战时X国收到了上帝的一串密码,只有解开密码,才能阻止战争的继续进行,世界才会恢复和平。解开密码的第一道工序就是解压缩密码,上帝对于连续的若干个相同的子串"X"会压缩为"[DX]"的形式(D是一个整数且1<=D<=99),比如说字符串"CBCBCBCB"就压缩为"[4CB]"或者"[2[2CB]]",类似于后面这种压缩之后再压缩的称为二重压缩。如果是"[2[2[2CB]]]"则是三重的。现在我们给你上帝发送的密码,请你对其进行解压缩。

输入格式:

一个字符串。

输出格式:

一个字符串。

输入样例:

在这里给出一组输入。例如:

AC[3FUN]

输出样例:

在这里给出相应的输出。例如:

ACFUNFUNFUN

【数据范围】

解压后的字符串长度在 20000 以内,最多只有十重压缩。保证只包含数字、大写字母、[ 和 ]

#include <iostream>
using namespace std;

string read_string() {
    int num;
    string str, sub_str;
    char c;
    while (cin >> c) {
        if (c == '[') {
            cin >> num;
            sub_str = read_string();
            while (num--)str += sub_str;
        }
        else {
            if (c == ']') {
                return str;
            }
            str += c;
        }
    }
    return str;
}

int main() {
    cout << read_string();
    return 0;
}

恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。
首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。
然后,让这 n 位大臣排成一排,国王站在队伍的最前面。
排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:
排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。
注意,国王的位置始终在队伍的最前面。

输入格式:

第一行包含一个整数 n(1≤n≤1000),表示大臣的人数。
第二行包含两个整数 a (0<a)和 b(b<10000),之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出格式:

输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

输入样例:

在这里给出一组输入。例如:

3
1 1
2 3
7 4
4 6

输出样例:

在这里给出相应的输出。例如:

#include <iostream>
#include <algorithm>
#include <iomanip>
//#include <fstream>//Debug
using namespace std;

const size_t bits = 10;//1e10进制
const int64_t mod_num = 10000000000;//1e10

struct person {
    int left;
    int right;
};

person queue[1001];
int64_t num[2][10000] = { {1},{1} };//10000 * bits位
int64_t max_num[10000] = { 0 };//2^63 - 1 = 9 223 372 036 854 775 807
int max_len = 0;
//int max_i;//Debug

int main() {
    //ifstream ifs("C:\\Users\\dell\\Downloads\\P1080_9.in", ios::in);//Debug
    int n, highest = 0;
    cin >> n;
    //ifs >> n;//Debug
    for (int i = 0; i <= n; i++)
        cin >> queue[i].left >> queue[i].right;
        //ifs >> queue[i].left >> queue[i].right;//Debug
    //ifs.close();//Debug
    sort(queue + 1, queue + n + 1, [](person p_1, person p_2) {
        return p_1.left * p_1.right < p_2.left * p_2.right;
        });

    for (int i = 1; i <= n; i++) {
        //if (i == 1000) system("pause");//Debug
        num[(i + 1) % 2][0] = int64_t(queue[i - 1].left) * num[i % 2][0];
        int j = 1;
        while (j <= highest + 1)
        {
            num[(i + 1) % 2][j] = int64_t(queue[i - 1].left) * num[i % 2][j];
            num[(i + 1) % 2][j] += num[(i + 1) % 2][j - 1] / mod_num;
            num[(i + 1) % 2][j - 1] %= mod_num;
            j++;
        }

        while (j > 0 && num[(i + 1) % 2][j] == 0) j--;
        highest = j;
        int z = j;
        int64_t upper = 0, lower = 0;
        while (z >= 0) {
            upper = (num[(i + 1) % 2][z] + lower) / int64_t(queue[i].right);
            lower = (num[(i + 1) % 2][z] + lower) % int64_t(queue[i].right) * mod_num;
            if (upper > max_num[z]) {
                max_len = j;
                //max_i = i;//Debug
                lower = 0;
                while (j >= 0) {
                    upper = (num[(i + 1) % 2][j] + lower) / int64_t(queue[i].right);
                    lower = (num[(i + 1) % 2][j] + lower) % int64_t(queue[i].right) * mod_num;
                    max_num[j] = upper;
                    j--;
                }
                break;
            }
            else if (upper == max_num[z]) {
                z--;
                continue;
            }
            else break;
        }
    }

    //cout << max_i << endl;//Debug
    cout << max_num[max_len];
    while (--max_len >= 0) cout << setiosflags(ios::right) << setfill('0') << setw(bits) << max_num[max_len];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值