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;
}


相关文章
|
2月前
|
人工智能 测试技术 BI
Codeforces Round 942 (Div. 2)
Codeforces Round 942 (Div. 2)
|
6月前
Codeforces Round #729 (Div. 2)
【6月更文挑战第4天】在这两个编程问题中,B. Plus and Multiply 要求判断通过加法和乘法操作数组是否能形成目标数 `n`。思路是形如 `x^a + yb = n` 的表达式,如果满足则能构造。C. Strange Function 关注的是找到最小正整数 `x` 使得 `x` 不是 `i` 的因子,计算这些值的和模 `10^9+7`。对于每个 `i`,偶数时 `f(i)` 是 3,奇数时是 2,利用因子与最大公约数计算周期性求和。
36 1
Codeforces Round #192 (Div. 2) (329A)C.Purification
Codeforces Round #192 (Div. 2) (329A)C.Purification
48 0
|
人工智能 算法 BI
Codeforces Round #179 (Div. 2)A、B、C、D
我们每次加进来的点相当于k,首先需要进行一个双重循环找到k点和所有点之间的最短路径;然后就以k点位判断节点更新之前的k-1个点,时间复杂度降到O(n^3),而暴力解法每次都要进行floyd,时间复杂度为O(n^4);相比之下前述解法考虑到了floyd算法的性质,更好了运用了算法的内质。
57 0
|
机器学习/深度学习
Codeforces Round #742 (Div. 2)
Codeforces Round #742 (Div. 2)
58 0
|
机器学习/深度学习 人工智能
Codeforces Round 889 (Div. 2)
Codeforces Round 889 (Div. 2)
166 0
|
人工智能 索引
Codeforces Round 806 (Div. 4)
Codeforces Round 806 (Div. 4)A~G
115 0
Codeforces Round 640 (Div. 4)
Codeforces Round 640 (Div. 4)A~G
99 0
Codeforces Round #644 (Div. 3)(A~G)
Codeforces Round #644 (Div. 3)(A~G)
124 0