文章目录
- 牛客周赛 Round 67
- 题目链接:
- A.排序危机
- 代码:
- B.小歪商店故事:卷
- 代码:
- 小苯的计算式
- 代码:
- D.K
- 代码:
牛客周赛 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/d∗b;那么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 ;
}
前四题的难度都不是很大,认真写一下都能写出来。后两题暂时还没写,等有朝一日可能会补上。