Codeforces Round #719 (Div. 3)(A-E)

简介: 算法

A. Do Not Be Distracted!


题意:如果一个字符串中一个字母间断出现,那么老师会怀疑,判断老师是否怀疑。

思路:闭着眼睛敲比速度:)

 #include<bits/stdc++.h>
 using namespace std;
int main()
{
    int n,i,j,t;
    cin>>t;
    while(t--){
        int n;
        map<char ,int >mo;
        string s1;
        cin>>n;cin>>s1;
        int flag=0;
        for(i=0;i<n;i++){
            if(i!=0){
                if(mo[s1[i]]!=0){
                    if(s1[i-1]==s1[i]){
                        continue;
                    }
                    else {
                        flag=1;
                    }
                }
            }
                        mo[s1[i]]++;
        }
        if(flag==1) {
            scNO;
        }
        else {
            scYES;
        }
    }
    return 0;
}


B. Ordinary Numbers

题意:求1-n中有几个数里只有一种数字。

思路:1-10 1 2 3 4 5 6 7 8 9

11-100 11 22 33 44 55 66 77 88 99

然后就继续这么搞,先判断位数,然后再判断当前位大小就行,模拟搞

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,i,j,t;
    cin>>t;
    while(t--){
        cin>>n;
        int d1=n,cnt=0;
        while(d1!=0){
            d1/=10;
            cnt++;
        }
        int ans=0;
        ans+=max(0,cnt-1)*9;
        for(j=1;j<=9;j++){
            int mm=j;
            for(i=0;i<cnt-1;i++){
                   mm*=10;mm+=j;
            }
            if(n>=mm) ans++;
            else break;
        }
        cout<<ans<<endl;
    }
}


C. Not Adjacent Matrix


题意:给你一个数字n,要求你用n^2个数去建一个正方形边长为n,且一个数上下左右与之相连的数二者差要大于1

思路:不难发现规律其实就是先把奇数列出来再列偶数,然后顺序输出就行比如:

1 3 5

7 9 2

4 6 8

顺便吐槽一下今晚排队那么久,:(导致我最后D过完之后才发现C没过:(

 #include<bits/stdc++.h>
 using namespace std;
int a[102][105];
int main()
{
    int n,i,j,t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int d1=n*n,m1=-1;
        int ji=d1%2==0?d1-1:d1;
        int flag=0,m2=2;
        int ou=d1%2==0?d1:d1-1;
        if(n==2){
            cout<<-1<<endl;
            continue;
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                  if(m1==ji) flag=1;
                  if(flag==0){
                     m1+=2;
                    a[i][j]=m1;
                  }
                  if(flag==1){
                    a[i][j]=m2;
                    m2+=2;
                  }
            }
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n-1;j++){
                cout<<a[i][j]<<" ";
            }
            cout<<a[i][j]<<endl;
        }
    }
}


D. Same Differences


题意:给你一个数组求满足下面条件的有多少对。3.png

思路:把上面的式子转化一下改为aj-j=ai-i,就可以发现其实只要求这个数和它的下标差有多少对,然后求个等差就行.


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+1000;
struct node {
    int a,b;
}mo[maxn];
signed main()
{
    int t,n,i,j;
    cin>>t;
    while(t--){
        cin>>n;
        map<int ,int >m1;
        for(i=1;i<=n;i++){
            cin>>mo[i].a;
            mo[i].b=i-mo[i].a;
            m1[mo[i].b]++;
        }
        int ans=0;
        for(i=1;i<=n;i++){
            int d1=m1[mo[i].b];
            m1[mo[i].b]=0;
         //   cout<<d1<<"*"<<endl;
            ans+=(d1-1)+((d1-1)*(d1-2))/2;
        }
        cout<<ans<<endl;
    }
}


E. Arranging The Sheep


题意:‘*’代表羊,‘.’代表草地,给你一个字符串,要求把所有的羊放在一排

思路:这题思路挺巧妙的,下面的1就是代表羊哈,x就是草地,其实可以发现我要想办法把1并在一起,可以把已经连续的一段1或者连续的一段x合并,而合并其实只有两种情况,一种是从把右边的一段并在左边,一种是把左边的并在右边,可以先从头到尾把每一段合并操作的花费求出来,再倒着求一遍,然后取最小值。

4.png

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+100;
int sum1[maxn];
int sum2[maxn];
signed main()
{
    string s1;
    int t,i,j,n;
    cin>>t;
    while(t--){
        cin>>n>>s1;
        int ans1=0,ans2=0,cnt1=0,cnt2=0,flag=0,cc=0,ccc=0;
        for(i=0;i<n;i++){
            if(s1[i]=='*'){
                if(flag==1){
                    flag=0;
                    ans1+=(cnt1)*cnt2;
                    int dd=cnt1*cnt2;
                    sum1[cc++]=dd;
                }
                cnt1++;
                cnt2=0;
            }
            else {
                if(cnt1>0){
                    flag=1;
                }
                cnt2++;
            }
        }
        reverse(s1.begin(),s1.end());
        cnt1=0,cnt2=0,flag=0;
          for(i=0;i<n;i++){
            if(s1[i]=='*'){
                if(flag==1){
                    flag=0;
                    ans2+=(cnt1)*cnt2;
                    int dd=cnt1*cnt2;
                    sum2[ccc++]=dd;
                }
                cnt1++;
                cnt2=0;
            }
            else {
                if(cnt1>0){
                    flag=1;
                }
                cnt2++;
            }
        }
        int ans3=0;
        for(i=0;i<cc;i++){
            ans3+=min(sum1[i],sum2[cc-1-i]);
        }
            cout<<ans3<<endl;
       }
    return 0;
}


相关文章
|
开发框架 Unix Linux
深度探索:Qt CMake工程编译后的自动打包策略
深度探索:Qt CMake工程编译后的自动打包策略
677 0
|
JSON 数据格式
VSCode无法写入用户设置 请打开用户设置并清除错误或警告, 然后重式
VSCode无法写入用户设置 请打开用户设置并清除错误或警告, 然后重式
|
10月前
|
移动开发 小程序 Linux
PHP仿WX即时聊天源码,支持视频语音聊天
PHP仿WX即时聊天源码,支持视频语音聊天
372 65
|
11月前
|
SQL 监控 算法
为Go应用无侵入地添加任意代码
这篇文章旨在提供技术深度和实践指南,帮助开发者理解并应用这项创新技术来提高Golang应用的监控与服务治理能力。在接下来的部分,我们将通过一些实际案例,进一步展示如何在不同场景中应用这项技术,提供更多实践启示。
|
12月前
|
算法
MATLAB符号计算
【10月更文挑战第9天】MATLAB不仅擅长数值计算,还具备强大的符号计算功能,支持代数运算、方程求解、微积分等。本文介绍如何使用MATLAB的符号工具箱进行符号变量定义、方程求解、微分积分及矩阵运算,并通过多个实际应用案例展示了其在机械系统、电路分析、经济优化和物理运动学等领域的应用。此外,文章还提供了符号计算的最佳实践和未来展望。
|
存储 前端开发 数据处理
|
JSON 移动开发 监控
快递单号物流轨迹方案介绍——内附物流API对接指南
什么是物流轨迹,有什么用,今天来详细聊一聊
4318 2
快递单号物流轨迹方案介绍——内附物流API对接指南
|
Oracle jenkins 持续交付
新的centos7.9安装jenkins(二)
新的centos7.9安装jenkins(二)
143 1
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
688 0
|
算法 数据可视化 数据挖掘
CRAN任务视图:贝叶斯推断R包综述
CRAN任务视图:贝叶斯推断R包综述
731 0