• Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)


    题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks

    题意:

    给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数。

    问合法的x有多少个。题目保证这k个数完全不同。

    题解:

    显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了。

    这里 x+a,x+b,x+c是递增的。这里我把这个序列叫做A序列

    然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我们确定了A序列的第一个数,那么就可以确定一个x,然后用二分来判断这个x能不能使得B序列中每个数出现,如果能,就把这个x放进容器。

    然后就可以枚举每个A序列的数作为开头。

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;++i)
     3 using namespace std;
     4 
     5 const int N=2007;
     6 int n,k,a[N],b[N];
     7 set<int>st;
     8 
     9 int main(){
    10     scanf("%d%d",&n,&k);
    11     F(i,1,n)scanf("%d",a+i),a[i]+=a[i-1];
    12     sort(a+1,a+1+n);
    13     F(i,1,k)scanf("%d",b+i);
    14     sort(b+1,b+1+k);
    15     F(i,1,n)
    16     {
    17         int flag=1,x=b[1]-a[i];
    18         F(j,1,k)
    19         {
    20             int tmp=b[j]-x;
    21             int idx=lower_bound(a+i,a+n+1,tmp)-a;
    22             if(idx>n||a[idx]!=tmp ){flag=0;break;}
    23         }
    24         if(flag)st.insert(a[i]);
    25     }
    26     printf("%d
    ",(int)st.size());
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    剑指offer-用两个栈实现队列
    Java数组判空的正确打开方式
    浏览器输入URL后后的过程
    HTTP状态码
    HTTP和HTTPS
    北京好未来公司linux面试题
    三剑客 -- sed
    三剑客 -- grep
    shell脚本
    自动化 -- expect
  • 原文地址:https://www.cnblogs.com/bin-gege/p/7173119.html
Copyright © 2020-2023  润新知