首页 > 其他 > 详细

Codeforces Round #638 (Div. 2)

时间:2020-05-02 17:43:34      阅读:33      评论:0      收藏:0      [点我收藏+]

题目链接:http://codeforces.com/contest/1348

A

思路:分成两部分,一部分里面的和先置为最大的2^n,然后另一部分置为2^(n-1),然后将1~n-2拆分,前一半分到2^n那部分去,剩余的另一半分给2^(n-1)那部分

技术分享图片
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef double db;
typedef long long ll;
ll qmi(int m, int k)
{
    int res = 1, t = m;
    while (k)
    {
        if (k&1) res = res * t;
        t = t * t;
        k >>= 1;
    }
    return res;
}
int main()
{
    #ifdef ONLINE_JUDGE
    #else
        freopen("in.txt","r",stdin);
    #endif
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        if(n==2)
        {
            printf("2\n");
            continue;
        }
        ll a[50],b=0,c=0;
        for(int i=1;i<=n;i++)
        {
            a[i]=qmi(2, i);
        }
        b=a[n];
        c=a[n-1];
        for(int i=1;i<=(n-2)/2;i++)
        {
            b+=a[i];
        }
        for(int i=(n-2)/2+1;i<=(n-2);i++)
        {
            c+=a[i];
        }
        printf("%lld\n",abs(b-c));
    }
     return 0;
}
View Code

B

思路:既然要求每k个子序列的和都一致,那么先求出不同数的个数,如果比k大,那么肯定不存在输出“-1”,存在的话找出k个数输出n遍即可,如果不同数的个数小于k,记不同数的数组为b,长度为len ,那么在后面添加k-len个b[0]即可,输出n遍

技术分享图片
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef double db;
typedef long long ll;
const int maxn=2e5+10;
int main()
{
    #ifdef ONLINE_JUDGE
    #else
        freopen("in.txt","r",stdin);
    #endif
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        int a[105];
        for(int i=0;i<n;i++)
            scanf("%d",a+i);
        map<int,int>m;
        for(int i=0;i<n;i++)
            m[a[i]]++;
        if(k<m.size())
            printf("-1\n");
        else{
            printf("%d\n",n*k);
            int b[maxn];
            int ops=0;
            for(auto ss:m){
                b[ops++]=ss.first;
            }
            int num=ops;
            for(int i=0;i<k-num;i++)
            {
                b[ops++]=b[0];
            }
            for(int i=0;i<=n-2;i++)
            {
                for(int j=0;j<ops;j++)
                {
                    printf("%d ",b[j]);
                }
            }
            for(int j=0;j<ops;j++)
            {
                if(j==ops-1)
                    printf("%d\n",b[j]);
                else
                    printf("%d ",b[j]);
          }
        }
    }
     return 0;
}
View Code

 

Codeforces Round #638 (Div. 2)

原文:https://www.cnblogs.com/Vampire6/p/12818158.html

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