自学内容网 自学内容网

牛客周赛 Round 67

牛客周赛 Round 67

题目链接:

点击跳转牛客
  前段时间由于在干些其他的事情,一直没有再学习算法,从暑假到现在都没有再写过博客了,导致有些操作都已经不会了。从现在开始将会慢慢的捡起来算法,后续也会继续更新博客。
  刚才写了一下最近的一场牛客周赛,题目难度不大,但是我写的速度不是很好,确实一段时间跟没有学习算法有着很大的关系。这场比赛就当做是练手来写了。

A.排序危机

  给出一串字符串,将小写字母,大写字母,数字按照字符串中出现的位置进行排序,例如: D 1 d A 1 a 4 M 5 m 14 E e D1dA1a4M5m14Ee D1dA1a4M5m14Ee排序完变成 d a m e 114514 D A M E dame114514DAME dame114514DAME
  思考一下就可以有思路,可以遍历这个字符串,然后用string给各部分加起来,后续再输出即可

代码:

void Solve () {
int n;cin>>n;
string s;cin>>s;
string s1,s2,s3;
for (int i=0;s[i];i++) {
if (s[i]>='a'&&s[i]<='z') s1+=s[i];
else if (s[i]>='A'&&s[i]<='Z') s2+=s[i];
else s3 += s[i];
}
cout<<s1<<s3<<s2;
return ;
}

B.小歪商店故事:卷

  可以用数学公式推演一下,就可以得到 a < c / d ∗ b a<c/d*b a<c/db;那么a的值就可以算出来。注意题目是样儿大于,所以会出现小数的情况,但是不能用double,double的范围没有那么大,会爆double的,这里用long long,再加上取模的思想。

代码:

void Solve () {
    int n;cin>>n;
    for (int i=1;i<=n;i++) {
        cin>>a[i]>>b[i]>>c[i]>>d[i];
    }
    for (int i=1;i<=n;i++) {
        int x = (c[i]*b[i]/d[i]);
        if ((c[i]*b[i])%d[i]==0) x--;
        cout<<a[i]-x<<' ';
    }
    return ;
}

小苯的计算式

  根据题目的条件,我们可以知道,等号的长度和加号的长度已经是确定的,然后C的值也是确定的,那么我们就可以知道A和B的长度之和是多少,那我们就可以直接从0到C遍历,再用数学函数log来判断二者的长度之和是不是符合我们算出来的条件。

代码:

int len;
int check (int x,int y) {
int k1,k2;
if (x==0) k1=1;
else k1 = log10(x)+1;
if (y==0) k2=1;
else k2 = log10(y)+1;
if (k1+k2==len) return 1;
return 0;
}

void Solve () {
int n;string C;
cin>>n>>C;
len = C.size();
len = n-len-2;
int ans = 0;
int c = atoi(C.c_str());
for (int i=0;i<=c;i++) {
int t = c-i;
if (check(i,t)) {
ans++;
}
}
cout<<ans;
return ;
}

D.K

  因为是最长的不一样区间,所以k个这样的区间都是最长的,k个区间长度一致。在长度为n的区间中找到k个最长的区间。我们可以举例子 1 , 2 , 3 , 4 , 5 , 6 1,2,3,4,5,6 1,2,3,4,5,6这个区间的最长区间只有1个, 1 , 2 , 3 , 4 , 5 , 1 1,2,3,4,5,1 1,2,3,4,5,1这个区间的最长区间就有两个。根据题目所给出的样例我们可以发现,一个数字隔了几个数字还会再次出现,所以我们就可以想到将会是重复构造一段相同的序列。上手模拟一下长度为6的序列,我们可以发现当k为3时,可以构造序列 1 , 2 , 3 , 4 , 1 , 2 1,2,3,4,1,2 1,2,3,4,1,2。k为4时,可以构造序列 1 , 2 , 3 , 1 , 2 , 3 1,2,3,1,2,3 1,2,3,1,2,3.我们发现最大值为n-k+1,然后循环补充序列中空缺的位置。可以结合代码理解

代码:

void Solve () {
int n,k;cin>>n>>k;
if (n<k) {
cout<<"NO"<<'\n';
return;
}
cout<<"YES"<<'\n';
int t = n-k+1;int pos = 1;
for (int i=1;i<=t;i++) cout<<i<<' ';
for (int i=1;i<=n-t;i++) {
if (pos%t==0) cout<<t<<' ';
// cout<<i%t<<' ';
else cout<<pos%t<<' ';
pos++;
}
return ;
}

前四题的难度都不是很大,认真写一下都能写出来。后两题暂时还没写,等有朝一日可能会补上。


原文地址:https://blog.csdn.net/a13997460860/article/details/143720022

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!