2021暑假每日一题 week4 完结

Posted 辉小歌

tags:

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

3781. 乘车问题【难度: 简单 / 知识点: 模拟】

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

3782. 点【难度: 中 / 知识点: 数学 推式子】


#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
LL x[N],y[N],sumx,sumy;
int main(void)
{
    int n;cin>>n;
    for(int i=0;i<n;i++) cin>>x[i]>>y[i],sumx+=x[i],sumy+=y[i];
    LL sum=0; 
    for(int i=0;i<n;i++)
    {
        sum+=n*(x[i]*x[i]+y[i]*y[i]);
    }
    sum-=sumx*sumx+sumy*sumy;
    cout<<sum<<endl;
    return 0;
}

3783. 第 k 个除数【难度: 一般 / 知识点: 数学 求因子】


能够整除n,指的是n%x==0 x 既可以整除n

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
vector<LL>ve;
int main(void)
{
    LL n,k; cin>>n>>k;
    for(LL i=1;i*i<=n;i++)
    {
        if(n%i==0) 
        {
            ve.push_back(i);
            if(n/i!=i) ve.push_back(n/i);
        }
    }
    sort(ve.begin(),ve.end());
    if(k<=ve.size()) cout<<ve[k-1];
    else puts("-1");
    return 0;
}

3784. 交换相邻元素【难度: 一般 / 知识点: 思维题】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n;
string s;
int main(void)
{
    cin>>n;
    vector<int>ve(n+1,0);
    for(int i=1;i<=n;i++) cin>>ve[i];
    cin>>s;
    s="0"+s;
    for(int i=1;i<n;i++)
    {
        if(s[i]=='0'&&ve[i]!=i)//如果当前位置是0且不是对应的位置,则一定不行
        {
            puts("NO");
            return 0;
        }
        if(s[i]=='1')
        {
            int minv=1e9;
            int maxv=-1e9;
            int j=i;
            while(s[j]=='1')
            {
                minv=min(minv,ve[j]);
                maxv=max(maxv,ve[j]);
                j++;
            }
            minv=min(minv,ve[j]);
            maxv=max(maxv,ve[j]);
            if(maxv-minv!=j-i)//不是连续的
            {
                puts("NO");
                return 0;
            }
            i=j;
        }
    }
    puts("YES");
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n;
string s;
int main(void)
{
    cin>>n;
    vector<int>ve(n+1,0);
    for(int i=1;i<=n;i++) cin>>ve[i];
    cin>>s;
    s="0"+s;
    for(int i=1,t=0;i<n;i++)
    {
        t=max(t,ve[i]);
        if(s[i]=='0'&&t!=i)//如果当前位置是0,且当前的最大值不是对应的位置,则一定不行
        {
            puts("NO");
            return 0;
        }
    }
    puts("YES");
    return 0;
}

3785. 战舰 【难度: 一般 / 知识点: 枚举】


题目问的意思是,所有的合法方案中,哪个格子占了最多的次数。

直接枚举每一个格子,求每个格子占用的次数。

#include<bits/stdc++.h>
using namespace std;
char s[105][105];
int n,k,ans,x=1,y=1;
int main(void)
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(s[i][j]=='#') continue;
            
            int l=j,r=j;
            while(l>=1&&s[i][l]=='.'&&j-l+1<=k) l--;
            while(r<=n&&s[i][r]=='.'&&r-j+1<=k) r++;
           
            int t=0;
            if(r-l-k>0)t+=r-l-k; 
            
            l=i,r=i;
            while(l>=1&&s[l][j]=='.'&&i-l+1<=k) l--;
            while(r<=n&&s[r][j]=='.'&&r-i+1<=k) r++;
            if(r-l-k>0) t+=r-l-k;//r-l-1  -k+1 加1是这个格子本身就占了一格
            if(t>ans)
            {
                ans=t;
                x=i,y=j;
            }
        }
    }
    cout<<x<<" "<<y;
    return 0;
}

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

2021暑假每日一题 week2 完结

2021暑假每日一题 week5 完结

2021暑假每日一题 week9 完结

2021暑假每日一题 week1 完结

2021暑假每日一题 week6 完结

2021暑假每日一题 week8 未完结