2021暑假每日一题 week7 完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021暑假每日一题 week7 完结相关的知识,希望对你有一定的参考价值。

3806. 最小化字符串【难度: 一般 / 知识点: 贪心】


如果一个字母后的字母小于当前的字母,则删除该字母。
如果都不满足则只能删除最后一个

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n; cin>>n;
        string s; cin>>s;
        int index=0;
        for(int i=1;i<s.size();i++)
        {
            if(s[i]<s[i-1]) 
            {
                index=i;
                break;
            }
        }
        string ans;
        if(index)
        {
            ans=s.substr(0,index-1);
            ans+=s.substr(index);
        }
        else  ans=s.substr(0,n-1);
        cout<<ans<<endl;
    }
    return 0;
}

3807. 构造字符串【难度: 简单 / 知识点: 贪心】


就是说在出现次数最少的字符串中,找到一个最大的最小值。
那么我们就要尽可能的平均分配,这样最小值才会尽可能的大

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n,k; cin>>n>>k;
        string ans;
        for(int i=1;i<=n/k;i++)
        {
            for(int j=0;j<k;j++)
            {
                ans+='a'+j;
            }
        }
        for(int i=0;i<n%k;i++) ans+='a'+i;
        cout<<ans<<endl;
    }
    return 0;
}

3808. 画正方形【难度: 一般 / 知识点: 思维】


题目的意思其实就是 xy>=n 且 x+y 要尽可能的小。
故在满足 x
y>=n 的条件下 让 x和y尽可能的接近

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n; cin>>n;
        int x=1,y=1;
        while(x*y<n)
        {
            if(x>=y) y++;//让它们尽可能的平分
            else x++;
        }
        cout<<x+y<<endl;
    }
    return 0;
}

3809. 修改数组【难度: 一般 / 知识点: 贪心 枚举】

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N],n;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        cin>>n;
        int temp=0;
        for(int i=0;i<n;i++) cin>>a[i],temp=max(temp,a[i]);
        int ans=1e9,index=0;
        for(int i=1;i<=temp;i++)//枚举答案
        {
            int sum=0;
            for(int j=0;j<n;j++)
            {
                if(abs(a[j]-i)<=1) continue;
                else sum+=abs(a[j]-i)-1;
            }
            if(sum<ans) ans=sum,index=i;
        }
        cout<<index<<" "<<ans<<endl;
    }
    return 0;
}

3810. 最长连续休息时间【难度: 一般 / 知识点: 模拟 断环成链】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*4+10;
int a[N],n,t;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i],a[i+n]=a[i];
        int cnt=0;
        int ans=0;
        for(int i=0;i<2*n;i++)
        {
            if(a[i]==1) cnt++;
            else cnt=0;
            ans=max(ans,cnt);
        }
        cout<<ans<<endl;
    }
    return 0;
}

以上是关于2021暑假每日一题 week7 完结的主要内容,如果未能解决你的问题,请参考以下文章

2021夏季每日一题 week7 完结

寒假每日一题(入门组)week7 完结

2021暑假每日一题 week2 完结

2021暑假每日一题 week5 完结

2021暑假每日一题 week9 完结

2021暑假每日一题 week1 完结