2021夏季每日一题 week5 完结

Posted 辉小歌

tags:

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

3636. 数组延伸 【难度: 一般 / 知识点: 思维 模拟 压缩】


题目详解

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int t,n,x;
long long int a;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n>>x;
        queue< pair<int,int> >q;
        long long int ans=0;
        for(int i=0;i<n;i++)  cin>>a,ans+=a,q.push({a,1});
        int k=1;
        while(q.size())
        {
            auto temp=q.front(); q.pop();
            if(temp.first%x==0)
            {
                   ans+=(temp.first)*(temp.second);
                    q.push({(temp.first)/x,(temp.second)*x});//压缩
            }
            else break;
            k++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

3646. 分水果 【难度: 一般 / 知识点: 二进制枚举】

#include<bits/stdc++.h>
using namespace std;
int a[7][3]=
{
    {0,0,1},
    {0,1,0},
    {0,1,1},
    {1,0,0},
    {1,0,1},
    {1,1,0},
    {1,1,1}
};
int b[3],c[3],t,ans;
int main(void)
{
    cin>>t;
    while(t--)
    {
        int ans=0;
        for(int i=0;i<3;i++) cin>>b[i];
        for(int i=0;i<1<<7;i++)
        {
            int cnt=0;
            memcpy(c,b,sizeof b);
            bool flag=true;
            for(int j=0;j<7;j++)
            {
                if(i>>j&1)
                {
                    for(int k=0;k<3;k++) c[k]-=a[j][k];
                    cnt++;
                }
            }
            for(int j=0;j<3;j++) if(c[j]<0) flag=false;
            if(flag) ans=max(ans,cnt);
        }
        cout<<ans<<endl;
    }
}

3655. 楼层 【难度: 简单 / 知识点: 模拟】

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n,x; cin>>n>>x;
        int l=1,r=2;
        int k=1;
        while(1)
        {
            if(n>=l&&n<=r) break;
            l=r+1,r=k*x+2;
            k++;
        }
        cout<<k<<endl;
    }
    return 0;
}

3663. 打印数字菱形 【难度: 一般 / 知识点: 曼哈顿距离 规律】

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n;
int main(void)
{
    cin>>n; n=(n+1)*2;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(j==0) continue;
            if(i==0) continue;
            if(abs(i-n/2)+abs(j-n/2)==n/2-1) cout<<"0 ";
            else if(abs(i-n/2)+abs(j-n/2)<n/2)cout<<n/2-abs(i-n/2)-abs(j-n/2)-1<<" ";
            else cout<<"  ";
        }
        if(i)cout<<endl;
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int n; cin>>n;
    for(int i=0;i<n*2+1;i++)
    {
        for(int j=0;j<n*2+1;j++)
        {
            int t=abs(i-n)+abs(j-n);
            if(t<n+1) cout<<abs(n+1-t)-1<<" ";
            else cout<<"  ";
        }
        cout<<endl;
    }
    return 0;
}

3664. 数组补全 【难度: 一般 / 知识点: 贪心】


题目详解

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int n,k,p,x,y;
int main(void)
{
    cin>>n>>k>>p>>x>>y;
    int l=0,r=0,sum=x;//统计左边有多少个数,右边有多少个数,sum是剩余的总和
    for(int i=0;i<k;i++)
    {
        cin>>a[i];
        if(a[i]<y) l++;
        else r++;
        sum-=a[i];
    } 
    if(l>n/2)//左边的个数大于一半了
    {
        cout<<-1;
        return 0;
    }
    else if(r>=(n+1)/2)//右边的个数大于一半了,直接补左边即可
    {
        l=(n-k);
        r=0;
    }
    else//左右都需要加
    {
        l=n/2-l;
        r=(n+1)/2-r;
    }
    for(int i=y;i<=p;i++)
    {
        for(int j=1;j<=y;j++)
        {
            if(l*j+i*r<=sum)
            {
                for(int k=1;k<=l;k++) cout<<j<<" ";
                for(int k=1;k<=r;k++) cout<<i<<" ";
                return 0;
            }
        }
    }
    cout<<-1;
    return 0;
}

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

2021春季每日一题week5 未完结

2021夏季每日一题 week7 完结

2021夏季每日一题 week6 完结

2021夏季每日一题 week4 完结

2021夏季每日一题 week3 完结

2021夏季每日一题 week2 未完结