• AtCoder Beginner Contest 345 A - E 题解


    A - Leftrightarrow

    思路

    判断第一个字符是否为\texttt{<},最后一个字符是否为\texttt{>},都满足的话,再判断中间字符是否都为\texttt{=}

    代码

    1. #include
    2. using namespace std;
    3. #define int long long
    4. bool check(string s){
    5. int n=s.size();
    6. if(s[0]!='<') return false;
    7. if(s[n-1]!='>') return false;
    8. for(int i=1;i-1;i++)
    9. if(s[i]!='=') return false;
    10. return true;
    11. }
    12. signed main() {
    13. ios::sync_with_stdio(0);
    14. cin.tie(0), cout.tie(0);
    15. string s;
    16. cin>>s;
    17. cout<<(check(s)?"Yes":"No")<
    18. return 0;
    19. }

    B - Integer Division Returns

    思路

    首先,\left\lceil \dfrac{a}{b} \right\rceil = \left\lfloor \dfrac{a+b-1}{b} \right\rfloor,所以答案可由\left\lfloor \dfrac{X+9}{10} \right\rfloor得到。

    但是C++是向0取整的(正数向下取整,负数向上取整),所以X为负数且不整除时,答案需要加一。

    代码

    1. #include
    2. using namespace std;
    3. typedef long long LL;
    4. int main(){
    5. LL n;
    6. cin>>n;
    7. LL ans=(n+9)/10;
    8. if((n+9)<0&&(n+9)%10!=0) ans--;
    9. cout<
    10. return 0;
    11. }

    C - One Time Swap

    思路

    篇幅问题,直接看官方题解

    注意要开long long

    代码

    1. #include
    2. using namespace std;
    3. typedef long long LL;
    4. LL cnt[26];
    5. int main(){
    6. LL n,ans=0;
    7. bool flag=false;
    8. string s;
    9. cin>>s;
    10. n=s.size();
    11. for(int i=0;i'a']++;
    12. ans=n*n;
    13. for(int i=0;i<26;i++){
    14. ans-=cnt[i]*cnt[i];
    15. if(cnt[i]>1) flag=true;
    16. }
    17. cout<2+flag<
    18. return 0;
    19. }

    D - Tiling

    思路

    由于数据范围很小,我们考虑暴力搜索。

    C_{i,j}表示第$i$行第$j$个格子被哪一块瓷砖占用(没有被占用为-1)

    为了表示哪些瓷砖可用,可以设二进制数t,第$i$位为1表示第i块瓷砖可用。

    由于瓷砖可以旋转(可以竖着放,也可以横着放),因此搜索时,每块瓷砖有两种情况(除了正方形)。

    为了方便编写,我从dfs中分离出两个函数,第一个函数尝试放置瓷砖并判断是否可行。

    第二个函数用于回溯操作(由于第一个函数会改变$C$,所以无论是否可行都要复原)。

    注意要判断C_{i,j}是不是当前瓷砖,否则出现重叠时,会影响其他正常放置的瓷砖。

    1. #include
    2. using namespace std;
    3. const int N = 12;
    4. int a[N],b[N],c[N][N];
    5. int n,h,w;
    6. bool ans;
    7. // 以(x,y)为左上角,贴一块长为a宽为b的瓷砖(编号id),判断是否可行
    8. bool placeTile(int x, int y, int a, int b, int id){
    9. bool can=true;
    10. for(int i=x;i
    11. for(int j=y;j
    12. if(i// 没有出界限
    13. if(c[i][j]==-1) c[i][j]=id; // 可以放,做标记
    14. else can=false; // 已经被占用,不能放这块瓷砖
    15. }else can=false; // 超过边界
    16. }
    17. return can;
    18. }
    19. // 回溯时的操作
    20. void doBacktrace(int x, int y, int a, int b, int id){
    21. for(int i=x;i
    22. for(int j=y;j
    23. if(i-1;
    24. }
    25. }
    26. void dfs(int unused, int x, int y){
    27. // 找到下一个没贴瓷砖的位置
    28. while(c[x][y]>=0){
    29. y++;
    30. if(y>=w) x++,y=0;
    31. if(x>=h) break;
    32. }
    33. // 贴完了
    34. if(x>=h){
    35. ans=true;
    36. return;
    37. }
    38. // 尝试贴所有未使用的瓷砖
    39. for(int i=0;i
    40. if(unused&(1<// 未使用
    41. bool can=placeTile(x,y,a[i],b[i],i);
    42. if(can) dfs(unused^(1<// 继续搜索
    43. doBacktrace(x,y,a[i],b[i],i); // 回溯还原
    44. // 尝试横着放
    45. if(a[i]!=b[i]){ // 不是正方形
    46. bool can=placeTile(x,y,b[i],a[i],i);
    47. if(can) dfs(unused^(1<
    48. doBacktrace(x,y,b[i],a[i],i);
    49. }
    50. }
    51. }
    52. }
    53. int main(){
    54. cin>>n>>h>>w;
    55. for(int i=0;i>a[i]>>b[i];
    56. for(int i=0;i
    57. for(int j=0;j-1;
    58. ans=false;
    59. dfs((1<-1,0,0);
    60. cout<<(ans?"Yes":"No")<
    61. return 0;
    62. }

    E - Colorful Subsequence

    未完待续

  • 相关阅读:
    element-plus 表格-定位到指定行
    VectorDraw开发者框架(VDF)
    魔性洗脑神曲掀起模仿热潮,品牌为何热衷“打歌”?
    在数据增强、蒸馏剪枝下ERNIE3.0分类模型性能提升
    OpenCV从入门到精通实战(四)——答题卡识别判卷系统
    SpringFramework 之EnableCaching
    线程并发安全问题解决方案
    静态链接库(Lib) 与 动态链接库(DLL)
    Synopsys新思科技2023“向新力”秋季校园招聘内推
    番茄小说推文和番茄短剧推广授权怎么申请
  • 原文地址:https://blog.csdn.net/sblsf/article/details/136787400