“战疫杯”大学生程序设计在线邀请赛(4)

“战疫杯”大学生程序设计在线邀请赛(4),第1张

ps:赛时代码 + 赛时注释,可以更好的帮助你理解我赛时思考问题的方式 and 技巧!

(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:

(:我不是分隔符(:

时空密接

时空密接

在抗击疫情的过程中,我们需要清楚确定密接,而感染者的整个运动过程中和他位置重合的人都将被当作密切接触者,现在就请你设计一个算法计算两个人的轨迹是否有时空密接。

为了简化问题我们把场景当成一个二维坐标系,每个人看作坐标系上的一个整数点,在每一个时刻会原地不动或向上下左右移动一格,我们认为两个人只要在某一时刻出现在了同一个网格中就是时空密接。

输入格式:

第一行包含五个用空格隔开的正整数x1​,y1​,x2​,y2​(−109≤x1​,y1​,x2​,y2​≤109),t(1≤t≤100),分别代表两个人在0时刻所处的位置,以及接下来的t时刻中的移动路径。

第二行和第三行都是一个长度为t的字符串,分别代表两人在每一时刻的移动轨迹,字符串由大写字母W,S,A,D,O组成,分别代表上下左右移动一格与停止不动,即坐标由(x,y)改变为(x,y+1),(x,y−1),(x−1,y),(x+1,y),(x,y)。

输出格式:

如果两人存在时空密接就输出'yes',否则则输出'no'(不含引号,且区分大小写)。

输入样例:
1 1 2 2 4
DDDO
DSDD
输出样例:
yes
样例解释

两人的坐标分别为:

(1,1)→(2,1)→(3,1)→(4,1)→(4,1)

(2,2)→(3,2)→(3,1)→(4,1)→(5,1)

因此两人在第2、3时刻在同一位置,属于时空密接。

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

思路:

模拟:模拟两个人在相同时刻的位置,看是否位置相同

AC代码如下:
#include 
#define buff                     \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0)
using namespace std;
const int N = 109;
int x11, y11, x22, y22, t;
char s1[N];
char s2[N];
bool check(int a, int b, int c, int d)
{
    if (a == c && b == d)
        return true;
    else
        return false;
}
int main()
{
    buff;
    cin >> x11 >> y11 >> x22 >> y22 >> t;
    cin >> s1;
    cin >> s2;
    bool flag = 0;
    if (check(x11, y11, x22, y22))
        flag = 1;
    for (int i = 0; i < t; i++)
    {
        if (s1[i] == 'W')
            y11++;
        else if (s1[i] == 'S')
            y11--;
        else if (s1[i] == 'A')
            x11--;
        else if (s1[i] == 'D')
            x11++;
        //--------------------
        if (s2[i] == 'W')
            y22++;
        else if (s2[i] == 'S')
            y22--;
        else if (s2[i] == 'A')
            x22--;
        else if (s2[i] == 'D')
            x22++;
        
        if(check(x11,y11,x22,y22))
            flag = 1;
    }
    if(flag)
        cout << "yes" << endl;
    else
        cout << "no" << endl;
}

今晚吃鸡

今晚吃鸡

777777777Plus和SW2000正在游玩一款fps(第一人称射击类)游戏,在游戏中777777777Plus和SW2000需要瞄准射击,当系统判定到击中头部,身体,和四肢时会造成不同的伤害。当击中头部时,会造成100点伤害;当击中胸背部时,会造成30点伤害,当击中四肢时,会造成10点伤害。当血量小于等于0时,游戏结束,血量不为0的一方获胜。

同时该游戏有防具设计,包括头盔(保护头部)和护甲(保护胸背部)。当玩家穿着防具时,对该部位的攻击会由扣除血量改为扣除防具的耐久度。当防具耐久度降低到0时将会破碎失去伤害抵挡效果。

换言之,如果防具当前耐久为x,收到的攻击为y,当x>y时,防具的耐久变为x−y,不会破碎。当x≤y时,防具会破碎,且此次攻击不再扣除玩家血量。

现在,给出777777777Plus和SW2000游戏的记录,你能否算出是谁在游戏中获胜了?

输入格式:

第一行输入三个整数a1,b1,c1(1≤a1≤100,0≤b1,c1≤100),分别表示777777777Plus的剩余血量,护甲耐久度,头盔耐久度。

第二行输入三个整数a2,b2,c2(1≤a2≤100,0≤b2,c2≤100),分别表示SW2000的剩余血量,护甲耐久度,头盔耐久度。

第三行一个n(1≤n≤1000)代表游戏记录条数。

其后n行,每行两个字符串s,t。其中当s是"777777777Plus"(不带引号)时,代表777777777Plus受到了攻击,反之当s是"SW2000"(不带引号)时,代表SW2000受到了攻击。
当t是"head"(不带引号)时,代表头部受到攻击,当t是"body"(不带引号)时,代表胸背部受到攻击,当t是"limbs"(不带引号)时,代表四肢受到攻击。

数据保证不存在玩家血量小于等于0后继续攻击的情况。

输出格式:

输出一行一个字符串,"777777777Plus"或者"SW2000",代表获胜玩家。输出时不需要带引号。

输入样例:
1 1 1
100 0 0
4
777777777Plus head
SW2000 body
777777777Plus body
SW2000 head
输出样例:
777777777Plus

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

思路:

 模拟:模拟两人的 护甲 and 血量 情况

 最后谁的血量 大于0 谁获得游戏胜利

AC代码如下:    
#include 
#define buff                     \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0)
using namespace std;
int a1, b1, c1;
int a2, b2, c2;
int n;
int main()
{
    buff;
    //剩余血量,护甲耐久度,头盔耐久度
    cin >> a1 >> b1 >> c1;
    cin >> a2 >> b2 >> c2;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        string a, b;
        cin >> a >> b;
        int ak = 0;
        if (b == "head")
            ak = 100;
        else if (b == "body")
            ak = 30;
        else if (b == "limbs")
            ak = 10;

        if (a == "777777777Plus")
        {
            if (ak == 100)
            {
                if (c1)
                {
                    c1 -= ak;
                    if (c1 < 0)
                        c1 = 0;
                }
                else
                {
                    a1 -= ak;
                }
            }
            else if (ak == 30)
            {
                if (b1)
                {
                    b1 -= ak;
                    if (b1 < 0)
                        b1 = 0;
                }
                else
                {
                    a1 -= ak;
                }
            }
            else
                a1 -= ak;
        }

        if (a == "SW2000")
        {
            if (ak == 100)
            {
                if (c2)
                {
                    c2 -= ak;
                    if (c2 < 0)
                        c2 = 0;
                }
                else
                {
                    a2 -= ak;
                }
            }
            else if (ak == 30)
            {
                if (b2)
                {
                    b2 -= ak;
                    if (b2 < 0)
                        b2 = 0;
                }
                else
                {
                    a2 -= ak;
                }
            }
            else
                a2 -= ak;
        }
    }
    if (a1 > 0)
        cout << "777777777Plus" << endl;
    else
        cout << "SW2000" << endl;
}

核酸排队

核酸排队

在疫情到来的时候,做核酸成了大多数同学们的日常。做核酸也是需要时间的,而且在一个核酸检测点做核酸的人数往往很多,等待时间有时候会比较长。

在一个核酸检测点基本都安排有两个队列(默认两个队列的长度都为无限大):

  • 扫码队列:在该队列中,我们等待志愿者扫码录入核酸检测信息,志愿者每扫一个同学的码需要x单位时间。
  • 核酸队列:在该队列中,我们等待医生为我们做核酸,每个同学做核酸需要y单位时间。

一位同学做核酸的过程可以认为是先到达扫码队列等待志愿者扫码录入信息,录入信息之后到达核酸队列等待做核酸。一个志愿者一次只能处理一个同学的扫码,一个医生一次只能对一位同学进行核酸检测。

小王深深体会到了医生们的辛苦,他希望通过计算同学们等待做核酸的时间,以此平衡好同学们做核酸、学习和生活的时间。

假设核酸检测点只有一个志愿者和一个医生。已知有n个同学,第i个同学到达核酸检测点(即到达扫码队列)的时间为ti​(数据保证到达扫码队列的时间是升序的,且各不相同),求编程计算第i个同学做核酸耗费的时间wi​。

本题认为耗费时间为从到达扫码队列到完成做核酸的时间。

输入格式:

一共三行。

第一行为一个整数n(1≤n≤105)。

第二行为两个整数x,y(1≤x,y≤105)

第三行为n个整数t1​,t2​,t3​,...,tn−1​,tn​(1≤ti​≤109)

输出格式:

在一行输出n个核酸检测等待时间w1​,w2​,w3​,...,wn​

输入样例:
3
2 3
3 5 6
输出样例:

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

5 6 8

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

思路:

模拟:模拟两个时间刻【扫码 and 做核酸】

每个人按两个时间刻分类讨论

【1】

(1)可以立刻扫码

(2)需要等待一段时间后经行扫码

【2】

(1)可以立刻做核酸

(2)需要等待一段时间后经行核酸

可以开一个数组,分别记录:扫码需要的时间 + 做核酸需要的时间

最后输出 for 循环输出答案就ok咯!

AC代码如下:
#include 
#define buff                     \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0)
#define int long long
using namespace std;
const int N = 1e5 + 9;
int n;
int x, y;
int s[N];
int ans[N];
signed main()
{
    // buff;
    scanf("%lld", &n);
    scanf("%lld %lld", &x, &y); //扫码 ; 核酸
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &s[i]);
    }
    int tt1 = 0; //扫码
    int tt2 = 0; //核酸
    for (int i = 1; i <= n; i++)
    {
        if (s[i] >= tt1) //不用等
        {
            tt1 = s[i] + x;
            ans[i] += x;
        }
        else
        {
            ans[i] += (tt1 - s[i]) + x;
            tt1 = s[i] + (tt1 - s[i]) + x;
        }
        //---------
        int qur = ans[i] + s[i];
        if (qur >= tt2) //不用等
        {
            ans[i] += y;
            tt2 = qur + y;
        }
        else
        {
            ans[i] += (tt2 - qur) + y;
            tt2 = qur + (tt2 - qur) + y;
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (i == n)
            printf("%lld", ans[i]);
        else
            printf("%lld ", ans[i]);
    }

    printf("\n");
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/914591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存