首页 > 其他 > 详细

Codeforces Global Round 7

时间:2020-03-21 02:09:21      阅读:68      评论:0      收藏:0      [点我收藏+]

    地址:http://codeforces.com/contest/1326

技术分享图片

 

 

     题意:给定n,输出一个长度为n的数字,满足以下条件:1:>0  2:各个位上不出现0  3:不能整除自己的任意一位。

     解析:被这题给坑了一下。想不通我的33......7为什么不行,可能太长的话有被7整除的危险,并不能保证万无一失。所以我们需要一个能保证万无一失的通用方法。一个是2333.....3,或是5333.......3。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        if(n==1)
            cout<<"-1"<<endl;
        else
        {
            cout<<"2";
            for(int i=1;i<n;i++)
                cout<<"3";
                cout<<endl;
        }
    }
}

技术分享图片

 

技术分享图片

 

 

     题意:有点小绕,大致就是我画的这个意思。

技术分享图片

 

 

     很明显,题意中有讲,x1=0固定。则a1=b1,直接规定maxx=a1,用这个maxx来维护数组a[]的i-1之前的最大值。ai=bi+maxx,然后更新maxx=max(maxx,bi+maxx);这个顺序不要错。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll b[maxn];
ll a[maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>b[i];
    int x;
    a[1]=b[1];
    ll maxx=a[1];
    for(int i=2;i<=n;i++)
    {
        a[i]=b[i]+maxx;
        maxx=max(maxx,b[i]+maxx);
    }
    for(int i=1;i<=n;i++)
    {
        if(i<n)
            cout<<a[i]<<" ";
        else
            cout<<a[i]<<endl;
    }
}

技术分享图片

 

技术分享图片

 

 

     题意:也是绕的一批,我这个英语渣压根就没看懂,靠队友才搞懂。

         就是更定一个数量n的数组以及一个k对这个数组进行分块,{|...|,|...|}k是多少,大括号里面就有几个|...|集合,里面是L,R,均为下标。集合之间不能有重叠,要保证全覆盖数组。可以把每个|...|里的最大值提出来,k个最大值相加,得到一个数。目的是找出这个最大数来,以及可以弄出这个数的分块方式有几种。

    解析:既然是k个集合,那么要想保证各个最大值加起来最大,那么就要把前k个大的数做为每个集合里的最大值。以此为基准进行分块操作。再画个图看看:假设k=3

技术分享图片

 

 

     三角号表示分界线可放的地方,是不是还是不明白怎么算?没关系,举个例子:有前k大数 a,b。a与b挨着,那么分界线只能插在a上,1种,i+1-i=1,所以根据这个数目就是它们坐标之差。总之就是,记录前k大数的各个坐标之差,乘起来就好了。记得题意里说结果要mod 998244353

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int main()
{
    int n,k;
    cin>>n>>k;
    ll ans=1;
    int idx=-1;
    int x=0;
    ll sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        if(x>=n-k+1)
        {
            sum+=x;
            if(idx!=-1)
            {
                ans=(ans*(i-idx))%998244353;
            //    cout<<i-idx<<endl;
            }
            idx=i;
        }
    }
    cout<<sum<<" "<<ans<<endl;
}

 

Codeforces Global Round 7

原文:https://www.cnblogs.com/liyexin/p/12535868.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!