2021.11.18训练

B - Express Mail Taking

题意:

接收邮件,有n个邮箱,编号为1~n,相邻的两个邮箱之间的距离为1,其中编号为k的比较特殊,用于输入密码,打开邮箱门,初始位置在邮箱1,一共有m封邮件需要收取,取完后回到邮箱1,求该过程的最短路径。
注意: 并不是到达k柜输入口令后就可以依次取出所有快递,而是每取走一个快递就需要返回k柜解锁下一个柜子。

思路:

贪心。将m封邮件距离初始位置的距离从小到大编号为1~m,先处理距离最远的邮件m,再去取邮件m-1,要使路径最短此时的方案为:
      从邮件m的位置出发,先去k柜输密码,然后再返回邮件m-1的位置取件。
      代码描述为:abs(a[i+1]-k)+abs(a[i]-k);

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

///B
int t;
ll n,m,k;
ll a[1000005];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d %d %d",&n,&m,&k);
        ll ans=0;
        for(int i=1;i<=m;i++){
            scanf("%d",&a[i]);
        }
        sort(a+1,a+m+1);
        if (a[m]<k) ans=abs(a[m]-k)*2+a[m]-1;
        else ans=a[m]-1;
        for(int i=m-1;i>=1;i--){
            ans+=abs(a[i+1]-k)+abs(a[i]-k);
        }
        printf("%lld\n",ans+a[1]-1);

    }
    return 0;
}

E - CCPC Training Class

题意

找字符串中出现次数最多的字符。

思路

利用count函数得到26个的字母在字符串出现的次数。
核心代码:
int t=count(s.begin(),s.end(),c);
ans=max(ans,t);
PS:count函数的用法:count(初始位置下标,结束下标,查找元素);

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

///E
int t;
string s;

int main(){
    ios::sync_with_stdio(0);
    cin>>t;
    for(int i=1;i<=t;i++){
        cin>>s;
        int ans=0;
        for(int j=0;j<=25;j++){
            char c='a'+j;
            int t=count(s.begin(),s.end(),c);
            ans=max(ans,t);
        }
        cout<<"Case #"<<i<<": "<<ans<<endl;
    }
    return 0;
}



F - Reports

题意

给定一个01序列,判断相邻两个数是否相同。

思路

因为序列由0,1组成,所以若相邻两个数和为1,则两个数值不同。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
///H
int t;
int a[50],n;
int main(){
    ios::sync_with_stdio(0);
    cin>>t;
    while (t--){
        cin>>n;
        int flag=1;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        for (int i=0;i<n-1;i++){
            if (a[i]+a[i+1]!=1){
                flag=0;
                break;
            }
        }
        if (flag) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}


G - 3x3 Convolution

Cn,n=An,n*K1,1

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;


///G
int t,n;
int a[55][55],k[3][3];
int main(){
    ios::sync_with_stdio(0);
    cin>>t;
    while(t--){
        cin>>n;
        int flag=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin>>a[i][j];

            }
        }
        for(int i=1;i<=3;i++){
            for(int j=1;j<=3;j++){
                cin>>k[i][j];
                if(k[i][j]!=0) flag++;
            }
        }
        if(k[1][1]!=0&&flag==1){

            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                   cout<<a[i][j];
                   if(j!=n) cout<<" ";
                   else cout<<"\n";
                }
            }
        }else{
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                   cout<<"0";
                   if(j!=n) cout<<" ";
                   else cout<<"\n";
                }
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值