IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> AtCoder ABC215简易题解 -> 正文阅读

[数据结构与算法]AtCoder ABC215简易题解

#链接
https://atcoder.jp/contests/abc215/tasks

A 题

链接

https://atcoder.jp/contests/abc215/tasks/abc215_a

题解

签到水题。
给一个字符串,判断是否是 Hello,World!。

AC代码

#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long LL;
typedef pair<LL, LL> PLL;
 
const LL INF=4e18;
const int MAXN=1e6+10;
 
int main() {
#if 0
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
#endif
#if 0
    freopen("00.in", "r", stdin);
    freopen("00.out", "w", stdout);
#endif
    string s;
    getline(cin, s);
    if (s=="Hello,World!") {
        cout<<"AC\n";
    } else {
        cout<<"WA\n";
    }
 
    return 0;
}

B 题

链接

https://atcoder.jp/contests/abc215/tasks/abc215_b

题解

给一个 n n n,找最大的整数 k k k,满足 2 k ≤ n 2^k \leq n 2kn
由于本题的 n n n 很小,只有 1 0 18 10^{18} 1018,因此可以使用暴力求解。

AC 代码

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<LL, LL> PLL;

const LL INF=4e18;
const int MAXN=1e6+10;

int main() {
#if 1
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
#endif
#if 0
    freopen("00.in", "r", stdin);
    freopen("00.out", "w", stdout);
#endif
    LL n;
    cin>>n;
    LL k=0;
    LL ans=1;
    while (ans<=n) {
        k++;
        ans*=2;
    }
    cout<<k-1<<"\n";

    return 0;
}

C题

链接

https://atcoder.jp/contests/abc215/tasks/abc215_c

题解

给一个字符串 S S S,求第 K K K 小的字典序字符串。
本题的 S S S 长度只有 8 8 8,也就意味着最多是 8 ! = 40 , 320 8!=40,320 8!=40,320 种答案。因此,我们只需要列出所有的全排列,然后输出第 K K K 小的即可。
最简单的方法就是使用 STL 的 next_permutation() 函数。当然也可以使用 dfs 来解。

AC代码

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<LL, LL> PLL;

const LL INF=4e18;
const int MAXN=1e5+10;
string ans[MAXN];

int main() {
#if 1
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
#endif
#if 0
    freopen("00.in", "r", stdin);
    freopen("00.out", "w", stdout);
#endif
    string s;
    LL K;
    cin>>s>>K;
    sort(s.begin(), s.end());

    LL cnt=0;
    do {
        ans[++cnt]=s;
        //cout<<s<<"\n";
    } while (next_permutation(s.begin(), s.end()));
    //cout<<cnt<<"\n";
    cout<<ans[K]<<"\n";
    return 0;
}

D题

链接

https://atcoder.jp/contests/abc215/tasks/abc215_d

题解

N N N 个正整数 A 1 , ? A 2 , ? … , ? A N A_1,\ A_2,\ \dots,\ A_N A1?,?A2?,?,?AN?,找出所有从 1 1 1 k k k,满足 gcd ( A i , k ) = 1 \text{gcd}(A_i, k)=1 gcd(Ai?,k)=1
本题要求找出任意一个 k k k 和数组 A A A 的所有元素互质。
如果本题使用暴力求解,即枚举所有的 1 ~ m 1 \sim m 1m 中的所有数据,使得其满足题目要求。但是由于 n , ? m n,\ m n,?m 的大小为 1 0 5 10^5 105,这个算法的时间复杂度为 O ( m ? n ) O(m*n) O(m?n),因此最大情况需要计算 1 0 5 ? 1 0 5 = 1 0 10 10^5 *10^5=10^{10} 105?105=1010,这样的计算量即使是 2 2 2s 也是要超时的。
注意到本题的 A i A_i Ai? 取值范围是 1 ~ 1 0 5 1 \sim 10^5 1105,也就是说这个值域非常小。所以我们可以先用筛法筛出 1 0 5 10^5 105 中所有质数。然后再遍历 m m m

AC代码

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<LL, LL> PLL;
const int MAXN=1e5+10;
vector<bool> exist(MAXN, false);//数据i是否出现
vector<bool> ispri(MAXN, true);//数据i是否是质数

int main() {
#if 1
   ios::sync_with_stdio(0);
   cin.tie(0);
   cout.tie(0);
#endif
#if 0
    freopen("00.in", "r", stdin);
    freopen("00.out", "w", stdout);
#endif
   LL n,m;
   cin>>n>>m;

   //筛法初始化
   ispri[0]=ispri[1]=false;//质数

   for (LL i=1; i<=n; i++) {
      LL val;
      cin>>val;
      exist[val]=true;
   }

   //找出范围内所有质数
   for (LL i=2; i<MAXN; i++) {
      if (!ispri[i]) {
         exist[i]=false;
         continue;
      }
      for (LL j=i; j<MAXN; j+=i) {
         ispri[j]=false;
         if (exist[j]) {
            exist[i]=true;
            break;
         }
      }
   }

   //遍历可能的结果
   vector<bool> possible(m+1, true);
   possible[0]=false;
   for (LL i=2; i<=m; i++) {
      if (!exist[i]) {
         continue;
      }
      for (LL j=i; j<=m; j+=i) {
         possible[j]=false;
      }
   }

   LL cnt=0;
   for (LL i=1; i<=m; i++) {
      if (possible[i]) {
         cnt++;
      }
   }
   cout<<cnt<<"\n";
   for (LL i=1; i<=m; i++) {
      if (possible[i]) {
         cout<<i<<"\n";
      }
   }

   return 0;
}

E题

链接

https://atcoder.jp/contests/abc215/tasks/abc215_e

题解

这题是竞赛后完成的。阅读完后,这题是一个 bit DP 题目。惨,bit DP 早就忘记了。还好,本题算 bit DP 的模板题,直接套用模板即可。
对应的状态方程如下:
d p [ i ] [ u ] [ j ] = d p [ i ? 1 ] [ u ] [ j ] dp[i][u][j]=dp[i-1][u][j] dp[i][u][j]=dp[i?1][u][j]
其中: i i i 表示竞赛的编号, u u u 表示所有的集合, j j j 表示竞赛的种类。

AC代码

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN=1024;
LL dp[MAXN][MAXN][12];

const LL MOD=998244353;

int main(){
#if 1
   ios::sync_with_stdio(0);
   cin.tie(0);
   cout.tie(0);
#endif
   LL n;
   string s;
   cin>>n>>s;

   for(LL i=1;i<=n;i++){
      LL x=s[i-1]-'A';
      for(LL u=0; u<MAXN;u++){
         for(LL j=0;j<10;j++){
            dp[i][u][j]=dp[i-1][u][j];
            if(j==x){
               dp[i][u][j]+=dp[i-1][u][j];
               dp[i][u][j]%=MOD;
            }
         }
      }

      for(LL v=0;v<MAXN;v++){
         if(v&(1<<x)){
            continue;
         }
         for(LL j=0;j<10;j++){
            dp[i][v|(1<<x)][x]+=dp[i-1][v][j];
            dp[i][v|(1<<x)][x]%=MOD;
         }
      }

      dp[i][(1<<x)][x]++;
      dp[i][(1<<x)][x]%=MOD;
   }

   LL res=0;
   for(LL u=0;u<MAXN;u++){
      for(LL j=0;j<10;j++){
         res+=dp[n][u][j];
         res%=MOD;
      }
   }
   cout << res << '\n';

   return 0;
}

F题

链接

https://atcoder.jp/contests/abc215/tasks/abc215_f

题解

吐槽一下,F 题竟然比 E 题简单。
题目要求我们找所有最大问题的最小值,直接使用二分答案即可。
根据题目可知: min ( ∣ x i ? y i ∣ , ? ∣ x j ? y j ∣ ) ≥ K → ∣ x i ? y i ∣ ≥ K ?&&? ∣ x j ? y j ∣ ≥ K \text{min}(|x_i-y_i|,\ |x_j-y_j|) \geq K \rightarrow |x_i-y_i| \geq K\ \text{\&\&}\ |x_j-y_j| \geq K min(xi??yi?,?xj??yj?)Kxi??yi?K?&&?xj??yj?K

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> PLL;
const LL INF=4e18;

int main(){
#if 1
   ios::sync_with_stdio(0);
   cin.tie(0);
   cout.tie(0);
#endif
   LL n; 
   cin >> n;
   vector<PLL> v(n);
   for (LL i = 0; i < n; i++) {
      cin >> v[i].first >> v[i].second;
   }
   sort(v.begin(), v.end());

   LL ok = 0, ng = INF;
   while(ng - ok > 1){
      LL md = (ok + ng)/2;
      queue<PLL> que;
      bool able = false;
      LL mi = INF, ma = 0;
      for (auto p:v){
         while(!que.empty()){
            if(que.front().first > p.first - md) {
               break;
            }
            mi = min(mi, que.front().second); 
            ma = max(ma, que.front().second);
            que.pop();
         }
         if(mi <= p.second - md || ma >= p.second + md) {
            able=true;
         }
         que.push(p);
      }
      if(able) {
         ok = md;
      } else {
         ng = md;
      }
   }
   cout << ok << endl;
   return 0;
}

总结

我太难了,所有的东西都忘记了。人生艰难,连 ABC 都没法 AK 了。惨。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:45:16  更:2021-08-22 13:46:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:44:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码