AtcoderABC262场

文章介绍了两个编程题目,一个是关于找出每年6月举办且除以4余数为2的体育赛事的下一次年份,另一个是求解无向图中满足特定条件的整数元组数量。涉及年份判断和图的邻接关系处理,以及时间复杂度为O(1)和O(N^3)的算法实现。
摘要由CSDN通过智能技术生成

A - World CupA - World Cup

Problem Statement
A sport event is held in June of every year whose remainder when divided by 4 is 2.
Suppose that it is now January of the year Y. In what year will this sport event be held next time?在这里插入图片描述在这里插入图片描述

题目大意

每年6月举行一次体育赛事,除以4的余数为2。假设现在是Y年的1月,下一次举办这个体育赛事是在哪一年?

思路分析

题目要求找出满足条件的下一次举办体育赛事的年份。根据题意,我们知道这个体育赛事的年份满足两个条件:除以4的余数为2,并且年份大于等于Y。

时间复杂度

O(1)

代码

#include<iostream>
using namespace std;
int main()
{
  int y;
cin>>y;
for(int i=y;;i++)
{if(i%4==2)
{cout<<i<<endl;
break;
}
}
return 0;
}

#B - Triangle (Easier)B - Triangle (Easier)

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

题目大意

给定一个简单的无向图,求满足特定条件的整数元组的数量。条件是:在图中存在一条边连接三个顶点a、b、c,并且满足a<b<c。

思路分析

题目要求计算满足条件的整数元组的数量。具体地,需要找到所有满足以下三个条件的顶点集合:对于其中的任意三个顶点a、b、c,存在边连接a和b,b和c,c和a,并且a<b<c。

  • 首先,从输入中读取N(顶点数)和M(边数)。
  • 创建一个二维数组graph,用于存储图的邻接关系。初始化所有元素为false。
  • 根据输入的边信息,更新graph中连接的顶点对应的位置为true。
  • 遍历所有可能的三个顶点的组合(a, b, c),其中1≤a<b<c≤N。
  • 对于每个组合,检查是否存在边连接a和b,b和c,c和a。如果这三条边都存在,将符合条件的组合数量加1。
  • 输出最终的符合条件的组合数量。

时间复杂度

O(N3)

代码

#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
vector<vector<bool>> g(n+1,vector<bool>(n+1,false));
for(int i=0;i<m;i++)
{
int u,v;
cin>>u>>v;
g[u][v]=true;
g[v][u]=true;
}
int cnt=0;
for(int a=1;a<=n;a++)
{for(int b=a+1;b<=n;b++)
{for(int c=b+1;c<=n;c++){
if(g[a][b]&&g[b][c]&&g[c][a]){
cnt++;
}
}
}
}
cout<<cnt<<endl;
return 0;
}

C - Min Max PairC - Min Max Pair

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

题目大意

给定一个长度为N的整数序列a = (a1, …, aN),其中每个元素都是介于1和N之间的整数。
找到满足以下条件的整数对i,j的数量:

  • 1≤i<j≤N
  • min(ai, aj) = i
    max(ai, aj) = j

思路分析

分析满足要求的有两种:

  • a[i] = i and a[j] = j

  • a[i] = j and a[j] = i
    满足前一种情况的整数对数量为 n(n-1)/2,其中n是满足ak = k的k的数量。
    满足后一种情况的整数对可以通过检查每个i来计数,因为一旦i确定了,j也就唯一确定了,因为ai ≠ i。

时间复杂度

O(N)

题解代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    int same = 0;
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
        a[i] -= 1;
        if (a[i] == i) {
            same += 1;
        }
    }
    long long ans = (long long)same * (same - 1) / 2;
    for (int i = 0; i < n; ++i) {
        if (a[i] > i and a[a[i]] == i) {
            ans += 1;
        }
    }
    cout << ans << '\n';
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值