AtCoder Beginner Contest 284(A~E)

比赛名称:AtCoder Beginner Contest 284

比赛链接:AtCoder Beginner Contest 284

A - Sequence of Strings 

输入若干字符串,再把这些字符串按输入顺序倒序输出

#include <bits/stdc++.h>
using namespace std;
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  cin >> n;
  vector<string> s(n);
  for(string &i : s) cin >> i;
  for(int i = n - 1; i >= 0; i--) cout << s[i] << "\n";
  return 0;
}

B - Multi Test Cases 

问数组内有多少个奇数

#include <bits/stdc++.h>
using namespace std;
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t;
  cin >> t;
  while(t--){
    int n;
    cin >> n;
    vector<int> a(n);
    int ans = 0;
    for(int &ai:a){
      cin >> ai;
      ans += ai & 1;
    }
    cout << ans <<"\n";
  }
  return 0;
}

C - Count Connected Components

题意问一个图中有多少个连通块。

dfs即可

#include <bits/stdc++.h>
using namespace std;
int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, m;
  cin >> n >> m;

  vector<vector<int>> g(n);
  vector<bool> vis(n);

  for (int i = 0; i < m; i++){
    int a, b;
    cin >> a >> b, a--, b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }

  auto dfs = [&] (auto dfs, int x){
    if(vis[x]) return;
    vis[x] = 1;
    for(auto i : g[x]) {
      dfs(dfs, i);
    }
  };

  int ans = 0;
  for (int i = 0; i < n; i++){
    if (vis[i] == 0){
      dfs(dfs, i);
      ans++;
    }
  }
  
  cout << ans << endl;
  return 0;
}

D - Happy New Year 2023

一个数N,N能被分解为N=p^{2}q,其中pq均为质数。

其中1\leqslant N\leqslant 9\times 10^{18}

我们可以先把质数筛出来,然后再去找p和q

根据范围我们只需要筛出3e6左右范围的质数即可

#include <bits/stdc++.h>
#define int long long
const int N = 1e7 + 9;
bool vis[N];
int p[N], cnt;

void get_primes(int x){
  for (int i = 2; i <= x; i++) {
    if (!vis[i]) p[cnt++] = i;
    for (int j = 0; p[j] <= x / i; j++){
      vis[i * p[j]] = true;
      if (i % p[j] == 0) break;
    }
  }
}
 
signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  get_primes(1e7);

  int t;
  std::cin >> t;

  while(t--){
    int n;
    std::cin >> n;
    for(auto pi : p){
      if(n % pi == 0){ 
        int q = n / pi;
        int x = sqrt(q);
        int y = x * x; 
        if(y == q) {
          std::cout << x << " " << pi << "\n";
          break;
        }
      }
      if(n % (pi * pi) == 0){ 
        std::cout << pi << " " << n / (pi * pi) << "\n";
        break;
      }
    }
  }
  return 0;
}

E - Count Simple Paths

问有多少个从节点1开始的简单路径。

 注意坑点:min(K,10^{6})

#include <bits/stdc++.h>
using namespace std;
 
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, m;
  cin >> n >> m;
 
  vector<vector<int>> g(n);
  vector<bool> vis(n);
 
  for(int i = 0; i < m; i++){
    int a, b;
    cin >> a >> b, a--, b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
 
  int min = 1000000;
  int ans = 0;
 
  auto dfs = [&] (auto dfs, int x){
    if(vis[x]) return;
    ans++;
    if(ans == min) {
      cout << ans << "\n";
      exit(0);
    }
    vis[x] = 1;
    for(auto i : g[x]) {
      dfs(dfs, i);
    }
    vis[x] = 0;
  };
 
  dfs(dfs, 0);
 
  cout << ans << "\n";
  return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值