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;
}