AtCoder Beginner Contest 371题解 A-E

A题
简单列举每一个情况然后输出答案即可。

 #include<bits/stdc++.h>

 using namespace std;

 int main(){

     char a,b,c;

     cin>>a>>b>>c;

     for(int i=0;i<=2;i++){

         

     

         

     

     if(a=='<'&&c=='<'){

         cout<<'B'<<endl;

         break;

         

     }

      if(a=='<'&&b=='>'){

         cout<<'A'<<endl;

          break;

     }

      if(a=='>'&&b=='<'){

         cout<<'A'<<endl;

          break;

     }

     

      if(a=='>'&&c=='>'){

         cout<<'B'<<endl;

          break;

     }

      if(b=='<'&&c=='>'){

         cout<<'C'<<endl;

          break;

     }

      if(b=='>'&&c=='<'){

         cout<<'C'<<endl;

          break;

     }

     

     

 }

 }
B题 开一个数组存储是否为儿子,如果是判断是否为第一个,如果不是则输出No,本题有点过载代码写的不太好。

#include<bits/stdc++.h>

using namespace std;

typedef pair<int,char>PII;



 

int main(){

    int n,m;

    cin>>n>>m;

    int b[105]={0};

   

    vector<PII>a(m+1);

   

    for(int i=1;i<=m;i++){

       cin>>a[i].first;

       cin>>a[i].second;

        if(a[i].second=='M'){

           int p=a[i].first;

           

            b[p]=1;

           

        }

       

       

       

    }

    for(int i=1;i<=m;i++){

      if(a[i].second=='M'){

     int t=a[i].first;    

          if(b[t]==0){

              cout<<"No"<<endl;

             continue;

             

             

             

          }

      else {

         

     

        cout<<"Yes"<<endl;

           

            b[t]=0;

           

           

            }

           

           

        }

        else {

            cout<<"No"<<endl;

           

        }

       

       

       

    }

    return 0;

   

   

   

   

}

C题
本题题意比较难懂 但是放在C题肯定不会很难,点数较少,可用邻接矩阵查找是否有边,是双射所以都要存,本题可以用全排列模拟一编就可以,函数next_permutation是可以把一个列的全排列方法全部算出一遍,首先必须数列要有序,然后模拟一遍代码就可以

int ans=max;
   do{
        int res=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i==j) continue;
                if(g[i][j]!=h[p[i]][p[j]]){
                    res+=w[p[i]][p[j]];
                }
            }
        }
       
        ans=min(ans,res/2);
    }while(next_permutation(p+1,p+1+n));

D题
由于坐标是10的九次方级别,但是数量是10的五次方,所以要把坐标离散化,然后求前缀和,最后用二分来解决答案。

for(int i=1;i<=n;i++){
        cin>>x[i];
    }
    for(int i=1;i<=n;i++){
        int a;


        cin>>;

;
        sum[i]=sum[i-1]+a;


    }
    cin>>q;
    while(q--){
        int l,r;
        cin>>l>>r;
        int L=lower_bound(x+1,x+1+n,l)-x; int R=upper_bound(x+1,x+1+n,r)-x-1;
        if(L>R){
            cout<<0<<endl;
        }else{
            L--;
            if(L<0) L=0;
            cout<<sum[R]-sum[L]<<endl;
        }

}

E题

这个题主要是要把重复的地方想办法换一种思路转化,假如2,3,2里f一到二和一到三里有两个二而第一个2的作用在R等于2之前有用 但到了3就是另一个2发挥的作用 了 所以求 f(l,r)的之和就是求每一个数在他自己的区间发挥作用的数量

cin>>a[i];

pos[a[i].push_back(i);

for(int i=1;i<=n;i++){

int last=0;

for(auto j:pos[i])res+=(j-last)*(n-j+i),last=j;

cout<<res;

AtCoder Beginner Contest 134 是一场 AtCoder 的入门级比赛,以下是每道题的简要题解: A - Dodecagon 题目描述:已知一个正十二边形的边长,求它的面积。 解题思路:正十二边形的内角为 $150^\circ$,因此可以将正十二边形拆分为 12 个等腰三角形,通过三角形面积公式计算面积即可。 B - Golden Apple 题目描述:有 $N$ 个苹果和 $D$ 个盘子,每个盘子最多可以装下 $2D+1$ 个苹果,求最少需要多少个盘子才能装下所有的苹果。 解题思路:每个盘子最多可以装下 $2D+1$ 个苹果,因此可以将苹果平均分配到每个盘子中,可以得到最少需要 $\lceil \frac{N}{2D+1} \rceil$ 个盘子。 C - Exception Handling 题目描述:给定一个长度为 $N$ 的整数序列 $a$,求除了第 $i$ 个数以外的最大值。 解题思路:可以使用两个变量 $m_1$ 和 $m_2$ 分别记录最大值和次大值。遍历整个序列,当当前数不是第 $i$ 个数时,更新最大值和次大值。因此,最后的结果应该是 $m_1$ 或 $m_2$ 中较小的一个。 D - Preparing Boxes 题目描述:有 $N$ 个盒子和 $M$ 个物品,第 $i$ 个盒子可以放入 $a_i$ 个物品,每个物品只能放在一个盒子中。现在需要将所有的物品放入盒子中,每次操作可以将一个盒子内的物品全部取出并分配到其他盒子中,求最少需要多少次操作才能完成任务。 解题思路:首先可以计算出所有盒子中物品的总数 $S$,然后判断是否存在一个盒子的物品数量大于 $\lceil \frac{S}{2} \rceil$,如果存在,则无法完成任务。否则,可以用贪心的思想,每次从物品数量最多的盒子中取出一个物品,放入物品数量最少的盒子中。因为每次操作都会使得物品数量最多的盒子的物品数量减少,而物品数量最少的盒子的物品数量不变或增加,因此这种贪心策略可以保证最少需要的操作次数最小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值