2020-8-11 组队赛补题

链接: link.
我们把信件的投递看作在坐标轴上移动,起始坐标为x=1,根据单词的首字母我们建立一个数组存放投递位置的坐标,随着不断移动我们不断更新x的值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define INF 0x3f3f3f3f

int judge(char s[])
{//我们根据首字母来进行分类储存
    if(s[0]=='A'||s[0]=='P'||s[0]=='O'||s[0]=='R')
        return 1;
    else if(s[0]=='B'||s[0]=='M'||s[0]=='S')
        return 2;
    else
        return 3;
}

int main()
{
    char s[100];
    int n,t;
    int x=1,sum=0;//这相当于我们在坐标轴上移动,x用来记录我们每一步的起始坐标
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        gets(s);
        t=judge(s);
        sum+=abs(x-t);
        x=t;//更新起始坐标
    }
    printf("%d",sum);

    return 0;
}

链接: link.
左转的车要先让另一对右转或直行的车先通过,我们就循环分情况讨论,直到有一队车辆全部通过,这时另剩余车辆可直接通过无需等待

#include <stdio.h>
#include <string.h>

#include <iostream>

using namespace std;

int main()
{
    int sum, i, j, len1, len2;
    char str1[2010], str2[2010];//记录两队车辆的行驶方向
    while (scanf("%s%s", str1, str2) != EOF)
    {
        len1 = strlen(str1);
        len2 = strlen(str2);
        sum = 0;
        i = j = 0;
        while (i < len1 && j < len2)
        {
            if ((str2[j] == 'L' && str1[i] == 'F') ||
                    (str2[j] == 'L' && str1[i] == 'R'))//左转遇到右转或直行
            {
                sum++;
                i++;
            }
            else if ((str1[i] == 'L' && str2[j] == 'F') ||
                     (str1[i] == 'L' && str2[j] == 'R'))//同上
            {
                sum++;
                j++;
            }
            else//若不冲突,则均可通过
            {
                sum++;
                i++;
                j++;
            }
        }
        //哪队有剩余车辆,把剩余数量加上
        if (len1 > i)
            sum = sum + len1 - i;
        else if (len2 > j)
            sum = sum + len2 - j;
        printf("%d\n", sum);
        memset(str1, 0, sizeof(str1));
        memset(str2, 0, sizeof(str2));
    }
    return 0;
}

链接: link.
两队进行比赛,每次派出一人,我们要想办法让比赛更加具有观赏性,不能一边碾压。我们可以先算出每队的总得分,赢的队伍从小到大输出,输的队伍从大到小输出,这样更具白热化

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <algorithm>

using namespace std;

const int N = 1010;
struct node
{
    int cnt;
    int num;
} a[N],b[N];

bool cmp1(node a,node b)
{
    return a.cnt<b.cnt;
}

bool cmp2(node a,node b)
{
    return a.cnt>b.cnt;
}

int main()
{
    int n;
    while(cin>>n)
    {
        int suma = 0;
        int sumb = 0;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i].cnt;
            suma+=a[i].cnt;
            a[i].num = i;
        }
        for(int j=1; j<=n; j++)
        {
            cin>>b[j].cnt;
            sumb+=b[j].cnt;
            b[j].num = j;
        }
        if(suma>sumb)
        {
            sort(a+1,a+1+n,cmp1);
            sort(b+1,b+1+n,cmp2);
            for(int i=1; i<=n; i++)
                cout<<a[i].num<<' '<<b[i].num<<endl;
        }
        else
        {
            sort(a+1,a+1+n,cmp2);
            sort(b+1,b+1+n,cmp1);
            for(int i=1; i<=n; i++)
                cout<<a[i].num<<' '<<b[i].num<<endl;
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值