atcoderABC261场

A - IntersectionA - Intersection

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

要求找到同时被涂成红色和蓝色的线段的长度。具体地,给定四个整数L1、R1、L2、R2,表示两个红色线段和两个蓝色线段的起止位置。需要计算重叠部分的长度。

思路分析

  • 使用max函数和min函数计算重叠部分的起止位置。较大的L1和L2为重叠部分的起始位置,较小的R1和R2为重叠部分的结束位置。
  • 使用max和min操作确保重叠部分的长度不为负数。如果两个线段不相交,则重叠部分的长度为0。
  • 输出重叠部分的长度。

时间复杂度

O(1)

代码

#include<iostream>
using namespace std;
int main()
{
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
int ans=max(min(r1,r2)-max(l1,l2),0);
cout<<ans<<endl;
return 0;
}

B - Tournament ResultB - Tournament Result在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

给定一个NxN的表格A,其中包含了N名玩家之间的比赛结果。判断该表格是否存在矛盾的情况,即有一对选手i和j,满足以下条件之一:

  1. 选手i战胜了选手j,但选手j并未输给选手i;
  2. 选手i输给了选手j,但选手j并未战胜选手i;
  3. 选手i与选手j打平,但选手j与选手i并未打平。

思路分析

使用双重循环遍历表格A,并检查每一对选手i和j。
对于每一对选手i和j,检查三种情况是否满足上述条件。如果满足任何一种情况,则说明存在矛盾,输出"incorrect"。
如果没有找到任何矛盾情况,输出"correct"。

时间复杂度

O(N2)

代码

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

int main() {
    int n;
    cin >> n;
    vector<vector<char>> A(n, vector<char>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> A[i][j];
        }
    }
    bool contradictory = false;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i != j && A[i][j] == 'W' && A[j][i] != 'L') {
                contradictory = true;
                break;
            }
            if (i != j && A[i][j] == 'L' && A[j][i] != 'W') {
                contradictory = true;
                break;
            }
            if (i != j && A[i][j] == 'D' && A[j][i] != 'D') {
                contradictory = true;
                break;
            }
        }
        if (contradictory) {
            break;
        }
    }
    if (contradictory) {
        cout << "incorrect" << endl;
    } else {
        cout << "correct" << endl;
    }

    return 0;
}

C - NewFolder(1)C - NewFolder(1)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

给定N个字符串S1, S2, …, SN,按照一定规则修改并打印它们。规则如下:对于每个字符串Si,如果Si与前面的字符串S1, S2, …, S(i-1)都不相等,则直接打印Si;如果Si与前面的某个字符串Sj(j < i)相等,并且与Sj之前的X个字符串(X>0)也相等,则将Si打印为Si + “(” X “)”。

思路分析

可以使用一个哈希表来记录每个字符串出现的次数。遍历每个字符串,对于每个字符串Si,检查它是否与之前的字符串相等。如果相等,则从哈希表中获取当前字符串的出现次数,并更新该次数+1,然后将Si打印为Si + “(” + 出现次数 + “)”。如果不相等,则打印Si。

时间复杂度

O(NM)

代码

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

int main() {
    int N;
    cin >> N;

    unordered_map<string, int> freq;

    for (int i = 0; i < N; i++) {
        string s;
        cin >> s;

        if (freq.count(s)) {
            int count = freq[s];
            freq[s]++;
            cout << s << "(" << count << ")" << endl;
        } else {
            freq[s] = 1;
            cout << s << endl;
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值