首页 > 其他分享 >AtCoder Beginner Contest 264部分题解(a~d)

AtCoder Beginner Contest 264部分题解(a~d)

时间:2022-08-14 22:12:03浏览次数:48  
标签:AtCoder cout Beginner int 题解 矩阵 cin pos IOS

A题

题目大意:打印“atcoder"中从第l个到第r个字母

参考代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int l,r;
string s="atcoder";
signed main()
{
    IOS;
    cin>>l>>r;
    for(int i=l-1;i<=r-1;i++)
    cout<<s[i];
    return 0;
}

B题:

题目大意:

 

给定一张这种图,求第r,c个是白色还是黑色

 

 解法:白色表示0,黑色表示1,将数组打表(可能15x15有点多但是好在上下是对称分布的,打完中间和上面的复制就可以了),然后输出a[r][c]是0还是1就可了

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 int r,c;
 6 int a[20][20]={
 7     {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//1
 8     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//2
 9     {1,0,1,1,1,1,1,1,1,1,1,1,1,0,1},//3
10     {1,0,1,0,0,0,0,0,0,0,0,0,1,0,1},//4
11     {1,0,1,0,1,1,1,1,1,1,1,0,1,0,1},//5
12     {1,0,1,0,1,0,0,0,0,0,1,0,1,0,1},//6
13     {1,0,1,0,1,0,1,1,1,0,1,0,1,0,1},//7
14     {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},//8
15     {1,0,1,0,1,0,1,1,1,0,1,0,1,0,1},//9
16     {1,0,1,0,1,0,0,0,0,0,1,0,1,0,1},//10
17     {1,0,1,0,1,1,1,1,1,1,1,0,1,0,1},//11
18     {1,0,1,0,0,0,0,0,0,0,0,0,1,0,1},//12
19     {1,0,1,1,1,1,1,1,1,1,1,1,1,0,1},//13
20     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//14
21     {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//15
22     
23 };
24 signed main()
25 {
26     IOS;
27     cin>>r>>c;
28     r=r-1;
29     c=c-1;
30     if(a[r][c]==1)
31     cout<<"black"<<endl;
32     else
33     cout<<"white"<<endl;
34     return 0;
35 }

官方给的题解好像更为简单:

只要判定距离中心块的距离是奇数还是偶数就可以了

#include <iostream>
using namespace std;

int main(void)
{
  int r, c;
  cin >> r >> c;
  
  if(max(abs(r-8), abs(c-8)) % 2) cout << "black" << endl;
  else cout << "white" << endl;
  
  return 0;
} 

C题:

题目大意:

给定两个矩阵A,B,需要在执行一系列操作后使得矩阵A 和矩阵B相等

你可以执行的操作是删除某一行或者是某一列

就比如:

4 5

矩阵A :
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20

 

2 3

矩阵B:
6 8 9
16 18 19

可以删除矩阵A的1,2行,删除矩阵A 的2,5列就可以使得矩阵A 和矩阵B相等

解法:

要匹配与矩阵A和b相等,对行枚举有2^h1中方案,对列枚举有2^w1种方案,

对此,我们以二进制状态来表示这个行或者是列是否被选中不删或者是删除:

我们以底部开始如果当前位是0表示删除当前行,当前位是1表示不删除当前行

比如:

我们要从4行里删除1,3行,就可以表示0101

而这种方案以二进制来讲有0000....000,000...00001.....00000...111,1111111,

以十进制来表示就是0,1,2,.....2^h1-1种方案

同样,列也是如此

所以说,我们就可以写两个for来分别扫描行与列,判断选中的行列的元素是否与匹配的矩阵的行列元素相等

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 const int N=20;
 6 int h1,w1;
 7 int h2,w2;
 8 int a[N][N];
 9 int b[N][N];
10 signed main()
11 {
12     IOS;
13     /*cin>>x>>n;
14     ansl=x&(1<<n-1);
15     cout<<ansl;*/
16     cin>>h1>>w1;
17     for(int i=1;i<=h1;i++)
18     {
19         for(int j=1;j<=w1;j++)
20         cin>>a[i][j];
21     }
22     cin>>h2>>w2;
23     for(int i=1;i<=h2;i++)
24     {
25         for(int j=1;j<=w2;j++)
26         cin>>b[i][j];
27     }
28     for(int i=0;i<(1<<h1);i++)//对行枚举
29     {
30         for(int j=0;j<(1<<w1);j++)//对列枚举
31         {
32             vector<int>h,w;
33             for(int k=1;k<=h1;k++)
34             if((i&(1<<(k-1)))==0)//判断后k位置是不是0,也就是说不被删除
35             h.push_back(k);//放入不被删除的行列中
36             for(int k=1;k<=w1;k++)
37             if((j&(1<<(k-1)))==0)
38             w.push_back(k);
39             if(h.size()!=h2||w.size()!=w2)//判断不被删除的行列的个数和匹配矩阵的行列是否相等
40             continue;
41             bool flag=true;
42             for(int n=1;n<=h2;n++)
43             {
44                 for(int m=1;m<=w2;m++)
45                 {
46                     if(a[h[n-1]][w[m-1]]!=b[n][m])//进行匹配
47                     {
48                         flag=false;
49                         break;
50                     }
51                 }
52             }
53             if(flag)
54             {
55                 cout<<"Yes"<<endl;
56                 return 0;
57             }
58         }
59     }
60     cout<<"No"<<endl;//如果从头到位都没有匹配的,就说明不能满足匹配矩阵
61     return 0;
62 }

D题:

题目大意,给定一个字符串,可以对相邻两个字符位置互换,要求将这个字符串转化成"atcoder"的最小步数

解法:

可以对每个位置的字母进行枚举,从a到r分别查找在给定字符串中的位置,然后从此位置开始往前一直交换,同时统计步数

然后从t在查找到给定字符串的位置交换到第2位,因为第一位已经交换成了a,同时统计步数,

一直到e,

r是可以不被统计的,因为前6位都确定了,所以说r的位置也就确定了

参考代码:

 1 //atcoder
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 #define int long long 
 5 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 6 string s;
 7 int cnt;
 8 signed main()
 9 {
10     IOS;
11     getline(cin,s);
12     int pos=s.find('a');
13     for(int i=pos;i>0;i--)
14     {
15         swap(s[i-1],s[i]);
16         cnt++;
17     }
18      pos=s.find('t');
19     for(int i=pos;i>1;i--)
20     {
21         swap(s[i],s[i-1]);
22         cnt++;
23     }
24      pos=s.find('c');
25     for(int i=pos;i>2;i--)
26     {
27         swap(s[i],s[i-1]);
28         cnt++;
29     }
30      pos=s.find('o');
31     for(int i=pos;i>3;i--)
32     {
33         swap(s[i],s[i-1]);
34         cnt++;
35     }
36      pos=s.find('d');
37     for(int i=pos;i>4;i--)
38     {
39         swap(s[i],s[i-1]);
40         cnt++;
41     }
42      pos=s.find('e');
43     for(int i=pos;i>5;i--)
44     {
45         swap(s[i],s[i-1]);
46         cnt++;
47     }
48     cout<<cnt<<endl;
49     return 0;
50 }

 

不过貌似官方给定题解更好一些:

将当前字符串视为一个顶点,用bfs来统计多少次操作可以使得当前字符串和atcoder相等

offical code:

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main(){
 6   string s;
 7   cin >> s;
 8   
 9   map<string,int> mp;
10   queue<string> q;
11   
12   mp[s]=0;
13   q.push(s);
14   
15   while(!q.empty()){
16     string current=q.front();q.pop();
17     if(current=="atcoder"){
18       cout << mp[current] << "\n";
19       return 0;
20     }
21     
22     for(int i=1;i<7;i++){
23       string next=current;
24       swap(next[i-1],next[i]);
25       if(mp.find(next)==mp.end()){
26         q.push(next);
27         mp[next]=mp[current]+1;
28       }
29     }
30   }
31   return 0;
32 }

 

标签:AtCoder,cout,Beginner,int,题解,矩阵,cin,pos,IOS
From: https://www.cnblogs.com/LQS-blog/p/16586521.html

相关文章

  • 【问题解决】解决使用aliyuncdn加速的域名证书不同步问题
    今天登录上博客发现好家伙资源链全挂了,进去一看发现是证书到期了,但是我回服务器查看证书发现证书已经更新而且是有效状态,清缓存一类的都尝试过了,依旧不行,然后网上找到了一......
  • AcWing周赛62-64 中比较有意思的小题题解
    AcWing周赛62-64(选讲)感觉比较思维4502.集合操作https://www.acwing.com/problem/content/4505/根据题意,肯定要使得所取的最大值最大,平均值最小。又因为每次放进来的的......
  • Atcoder Grand Contest 025 E - Walking on a Tree(欧拉回路)
    Atcoder题面传送门打个表发现答案等于每条边被覆盖的次数与\(2\)取min之和,考虑如何构造这个上界。首先考虑树是以\(1\)为中心的菊花图,且任意\(A_i,B_i\ne1\)的......
  • 【杂题乱写】AtCoder dp 26题
    AtCoderdp26题原比赛链接洛谷题单链接A-Frog1题目已然给出了转移方程,设\(dp_i\)为到第\(i\)块石头的最小代价。转移方程:\[dp_i=\min(dp_{i-1}+|h_i-h_{i-1}......
  • freee Programming Contest 2022(AtCoder Beginner Contest 264)A-E
    freeeProgrammingContest2022(AtCoderBeginnerContest264)https://atcoder.jp/contests/abc264FG待补A-"atcoder".substr()输出atcoder第L位和第R位上的字符#in......
  • AtCoder Beginner Contest 264
    比赛链接AtCoderBeginnerContest264E.Blackout2给出很多点(\(n+m\leq2\times10^5\)),有发电站和城市,以及很多边(\(e\leq5\times10^5\)),有\(q\)次删边操作,求每次......
  • T265119 拯救公主--题解
    题目描述公主索菲亚被关在一个有大小一样的方格构成的四四方方的迷宫里面,索菲亚就站在其中一个方格子上,拯救方案是这样的:要用一些地砖把公主所在的方格子之外的格子都铺上......
  • CF1712题解(E,F)
    E题意是让你求满足\(lcm(i,j,k)\geqi+j+k\)的三元组个数。我们通常都有一个直观感觉,lcm应该是各数之积级别的,换句话说,不满足\(lcm(i,j,k)\geqi+j+k\)的三元组个数......
  • LeetCode Pow(x, n)算法题解 All In One
    LeetCodePow(x,n)算法题解AllInOnejs/ts实现Pow(x,n)50.Pow(x,n)https://leetcode.cn/problems/powx-n/https://www.youtube.com/watch?v=ZTACajQOb2Er......
  • AtCoder Beginner Contest 264
    E-Blackout2离线+并查集。注意到只有删边操作,而删边操作其实不是很好维护。由于没有强制在线,所以可以离线一下然后逆序考虑,这样删边就变成了加边,这就用并查集就足以维......