21-22(2)第2次线上赛

21-22(2)第2次线上赛

罗少的一年级数学
描述

罗少做数学题经常把加法题看成减法题。有一天涂涂出了两个整数相加的算术题,罗少当成了这两个整数相减,于是给出了减法计算的结果。

大范手上有罗少的减法计算结果和涂涂的加法计算答案,但没有题目。大范想要知道题目中两个整数分别是多少。

输入

多组案例。一个正整数n,表示案例的数量。(n<=100)

每组案例由两个整数a和b组成,其中a表示两个整数相减的结果,b表示两个整数相加的结果。(-1e6<=a,b<=1e6)

输出

针对每组案例,如果无解,输出-1;如果有多个解,输出-2;如果只有唯一解,输出两个整数,这两个数之差等于a(第一个数减第二个数),之和等于b。两个数之间有一个空格。

每组案例输出都要换行。

样例输入

2
10 6
8 11

样例输出

8 -2

-1

code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//x-y=a x+y=b
//x=(a+b)/2 y=(b-a)/2
int main() {
    int n;
    cin >> n;
    while (n--) {
        int a, b;
        cin >> a >> b;
        double x = 1.0 * (a + b) / 2;
        double y = 1.0 * (b - a) / 2;
        if (x != int(x) || y != int(y))//判断解出来的方程是否为整数
            puts("-1");
        else
            cout << x << ' ' << y << endl;
        //没有-2的情况 两个方程两个未知数必定有解
    }
}
二、罗少的七年级生物
描述

罗少在做生物实验时,发现有一种生物的遗传链由一长串的0和1组成。该生物父系和母系具有相同长度的遗传链;同一位置上如果都是0,那么后代该位置上一定也是0;同一位置上如果都是1,那么后代该位置上一定也是1;同一位置上如果一个0一个1,那么后代该位置上可能是0也可能是1。

现在已知三个该种生物的遗传链,问有没有可能其中一个是另外两个的后代?如果有可能,输出Yes;如果不可能,输出No。

输入

多组案例。一个正整数n,表示案例的数量。(n<=100)

每组案例由3个字符串组成,每个字符串都是由字符0和字符1组成。保证这三个字符串的长度是相同的。(长度不大于100)

输出

针对每组案例,根据问题描述中的说明,输出Yes或No。

每组案例输出完都要换行。

样例输入

2
1101 0111 0101
111 100 010

样例输出

Yes

No

code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+14;
bool check(string fa,string ma,string son) {//根据题意判断儿子是不是亲生的
    for (int i = 0; i < fa.size(); i++) {
        if (fa[i] == ma[i] && fa[i] != son[i])//父母相同,儿子就必相同,如果不相同就不是亲生的
            return 0;
    }
    return 1;
}
int main() {
    int n;
    cin >> n;
    while (n--) {
        string s1, s2, s3;
        cin >> s1 >> s2 >> s3;
        if (check(s1, s2, s3) || check(s1, s3, s2) || check(s2, s3, s1))//不知道哪个是父,哪个是母,哪个是儿子,都试一遍
            puts("Yes");
        else
            puts("No");
    }
}
三、TQL喜欢的科目
描述

TQL每天都会花一些时间看书学习,学习一段时间以后会放松一下自己(比如做点线性代数题),然后继续学习另一门课程。现在已知TQL一天的学习记录(从6:00开始,最晚到第二天的2:00),需要找到其中用时总和最长的一门课程。例如从8:15到9:05是线性代数,从10:00到10:15是英语,从11:00到11:20是线性代数,从20:00到0:15是C++,显然其中学习时间最长的是C++。

输入

只有一组案例。

一个正整数n,表示有n个学习时间段。(n<=100)

然后是n行数据,每行数据包含三个字符串:一个起始时间和一个终止时间,还有课程的名字,两两之间用一个空格间隔。其中时间格式是“小时:分钟”,没有空格,冒号是英文字符,不是中文冒号。小时采用24小时制,如果小时只有一位数字,那么不会有十位数的0;分钟为一位数字时,则会保留十位数的0。例如8点会显示为8:00,而不会是08:00或者8:0。课程名字可能会含有空格。

保证是按照从早到晚的顺序列出学习记录,保证每段学习时间不会有重叠。

输出

输出一个字符串,表示用时总和最长的课程名字。如果出现并列,那么显示并列课程中,首次学习时间最早的那门(注意一天的学习从6:00开始)。

不要换行。

样例输入

4
8:15 9:05 Linear Algebra
10:00 10:15 English
11:00 11:20 Linear Algebra
23:05 0:15 CPP

样例输出

Linear Algebra

code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;//第一个int代表时间的早晚,第二个int代表学习时间
int main() {
    map<string, pii> mp;
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int h, m, hh, mm;
        scanf("%d:%d %d:%d ", &h, &m, &hh, &mm);//通过scanf格式输入很方便
        h = (h <= 2) ? h += 24 : h;//小于两点钟了说明是第二天了 直接看成24点往上加
        hh = (hh <= 2) ? hh += 24 : hh;
        int time = hh * 60 + mm - h * 60 - m;//计算学习时间
        string s;
        getline(cin, s);
        mp[s].second += time;//通过课程名字增加时间(合并)
        mp[s].first = mp[s].first == 0 ? i : mp[s].first;//如果课程是第一次出现,那么第一个int变成i来表示学习的时间顺序
    }
    //寻找最长学习时间
    int maxtime = -1, maxTime = 999;
    string ans;
    for (auto i: mp) {
        if (i.second.second > maxtime || i.second.second == maxtime && i.second.first <maxTime) {//如果学习时间比maxtime大,或者学习时间相同但是学习的比较早就将maxtime的值改变,将名字存入ans
            ans = i.first;
            maxtime = i.second.second;
            maxTime = i.second.first;
        }
    }
    cout << ans;
}
四、罗少的二年级数学
描述

罗少做数学题经常把加法题看成乘法题。有一天涂涂出了三个正整数相加的算术题,罗少当成了这三个正整数相乘,于是给出了乘法计算的结果。

大范手上有罗少的乘法计算结果和涂涂的加法计算答案,但没有题目。大范想要知道题目中三个正整数分别是多少。

输入

多组案例。一个正整数n,表示案例的数量。(n<=100)

每组案例由两个正整数a和b组成,其中a表示三个正整数相乘的结果,b表示三个正整数相加的结果。(a,b<=1e6)

输出

针对每组案例,如果无解,输出-1;如果有多个解,输出-2;如果只有唯一解,按从小到大的顺序输出三个正整数,这三个数之积等于a,之和等于b。每两个数之间有一个空格。

每组案例输出都要换行。

样例输入

2
45 11
10 9

样例输出

3 3 5

-1

code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+14;
int main() {
    int n;
    cin >> n;
    while (n--) {
        int a, b, c;
        int x, y, z;
        int cnt = 0;
        cin >> a >> b;
        for (int i = 1; i * i * i < a; i++) {//第一个数字
            if (a % i == 0) {//如果能被整除
                c = a / i;//后两个数字的乘积
                for (int j = i; j * j <= c; j++) {
                    if (c % j == 0 && i + j + c / j == b) {//判断条件
                        x = i, y = j, z = c / j;
                        cnt++;
                    }
                }
            }
        }
        if (cnt == 0)//无解的情况
            cout << -1 << endl;
        else if (cnt > 1)//多解的情况
            cout << -2 << endl;
        else printf("%d %d %d\n", x, y, z);//只有一解的情况
    }
}
五、罗少的七年级数学
描述

罗少做数学题经常把幂运算题看成乘法题。有一天涂涂出了求x的y次幂的计算题,其中x和y都是正整数,罗少当成了x与y相乘,于是给出了乘法计算的结果。

大范手上有罗少的乘法计算结果和涂涂幂运算答案的最后m位数字,但没有题目。大范想要知道题目中的x和y分别是多少。

输入

多组案例。一个正整数n,表示案例的数量。(n<=10000)

每组案例由三个正整数a、b、m组成,其中a表示两个正整数的乘积,b表示两个正整数幂运算的后m位数字(如果这m位数字以0开头,会省略前导0,例如后5位数是00120,那么b会表示成120)。(a<=1e9,m<=9,b<=10^m-1)

输出

针对每组案例,如果无解,输出-1;如果有多个解,输出一个整数,表示解的数量;如果只有唯一解,输出x和y,满足x与y之积等于a,且x的y次幂的后m位数字等于b。每两个数之间有一个空格。

每组案例输出都要换行。

样例输入

2
15 43 2
15 34 2

样例输出

3 5

-1

code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpmod(ll a, ll b,ll mod=0x7fffffff)//快速幂
{
    ll ans = 1;
    while (b) {
        if (b & 1)
            ans = (ans * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return ans;
}
int main() {
    int n;
    cin >> n;
    while (n--) {
        int a, b, m;
        cin >> a >> b >> m;
        int x, y, cnt = 0;
        m = qpmod(10, m);//取后面m位就是对10的m次取余
        for (int i = 1; i * i <= a; i++) {
            if (a % i == 0) {//如果a能被整除
                if (qpmod(i, a / i, m) == b) {//判断这两个数的幂运算符不符合
                    x = i;
                    y = a / i;
                    cnt++;
                }
                if (a / i != i && qpmod(a / i, i, m) == b) {//倒过来幂运算,要考虑完全平方数会在上面的if算过的情况
                    x = a / i;
                    y = i;
                    cnt++;
                }
            }
        }
        if (cnt == 0)puts("-1");//无解的情况
        else if (cnt > 1) cout << cnt << endl;//多解的情况
        else printf("%d %d\n", x, y);//一解的情况
    }
}
六、炉石传说-3
描述

你的回合开始:此时你控制 n 个随从,他们的攻击力分别是 a1、a2、…、an,对方控制着一个嘲讽随从,生命值为 x。

在本回合中,你需要尽可能地降低对手英雄的血量,但是在攻击敌方英雄前,你必须先处理掉这个具有嘲讽技能的随从。

你的每个随从在本回合中仅可以攻击 1 次:

若攻击嘲讽随从,则嘲讽随从将受到等同于攻击随从攻击力的伤害;

若攻击敌方英雄,则敌方英雄将受到等同于攻击随从攻击力的伤害;

当对方嘲讽随从受到一次攻击后,生命值若小于等于 0 则视为被消灭,此时你的其它尚未攻击的随从才可以攻击敌方英雄。

输入

第一行包含两个正整数 x 和 n 分别表示嘲讽随从的生命值和你的随从数量。(1 <= x <= 10000,1 <= n <= 100)

然后 n 个正整数 a1、a2、…、an 分别表示你的这些随从的攻击力。(1 <= ai <= 200)

输出

在本回合中,敌方英雄最多可以受到多少点伤害,然后换行。

样例输入

11 4
5 2 7 3

样例输出

5

code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=1e9;
int attack[10000];//伤害
bool dp[10000];//嘲讽怪能受到的伤害
int main(){
   int hp,n,sum=0;//sum伤害总和
   cin>>hp>>n;//hp嘲讽怪血量,n卡牌数量
   for(int i=0;i<n;i++){
       cin>>attack[i];
       sum+=attack[i];
   }
   dp[0]=1;//可以对嘲讽怪造成0点伤害
   int cnt=INF;
   for(int i=0;i<n;i++){//第i张牌对嘲讽怪造成伤害
       for(int j=hp-1;j>=0;j--){
           if(dp[j]){//在造成j点伤害的同时继续追加attack[i]点伤害
               if(j+attack[i]>=hp)
                   cnt=min(cnt,j+attack[i]);//寻找最接近hp的伤害
               else
                   dp[j+attack[i]]=1;//不够就记录能造成的伤害
           }
       }
   }
   if(cnt==INF)puts("0");//全部伤害丢给嘲讽怪了还是不够或刚好
   else cout<<sum-cnt<<endl;//丢给嘲讽怪后剩下的伤害
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。精灵王子的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。 现在已知精灵王子的魔法初值M,他所在洞穴中的位置与洞穴出口之间的距离S,距离洞穴塌陷的时间T。 你的任务是写一个程序帮助精灵王子计算如何在最短的时间内逃离洞穴。若能逃出,输出"Yes",并输出逃出所用的最短时间;若不能逃出,则输出"No", 同时输出精灵王子在剩下的时间内能走的最远距离。注意字母大小写。注意:精灵王子跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。 注:M、S、T均是大于等于0的整数。由输入保证取值合法性,考生不用检查。 提醒: 如果输入的S为0,则说明本身已经在出口,输出应为:Yes 0 如果输入的T为0(且S不为0),则说明已经没有时间了,输出应为:No 0 运行时间限制: 无限制 内存限制: 无限制 输入: 输入格式: M S T 输出: 输出格式: Yes 逃出洞穴所用的最短时间 或 No 在洞穴塌陷前能逃跑的最远距离 样例输入: 10 50 5 样例输出: Yes 1

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值