Educational Codeforces Round 82 (Rated for Div. 2)

Posted fyh-ssgss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 82 (Rated for Div. 2)相关的知识,希望对你有一定的参考价值。

前面题看了懒得写了 直接从D开始

D.Fill The Bag

题解

贪心,用(have[i]) 数组记录(2^i) 有多少个,然后对于这个(n) ,从最低位开始处理,因为每一位最多只需要1个,那么当前有的我们直接用上即可,剩下没有用上的,我们把(2^i) 合并到(2^{i+1}) 去,注意个数要除以2.如果对于当前位没有1的,那我们只能通过往后找数,拆分来获得这个数了,很显然拆离他最近的那个数最优,在拆的时候,比如我们要拆(2^j) ,目前需要(2^i) ,在过程中会产生(2^{j-1},2^{j-2},...,2^{i+1}) ,都要相应的加上。

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
inline LL read()
{
    LL x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int T,m,have[70];
LL n,t,sum;
int main()
{
    T=read();
    while(T--)
    {
        mem(have,0);
        n=read();m=read();
        LL ans=0; sum=0;
        for(int i=1;i<=m;i++)
        {
            t=read();
            sum+=t;
            int cnt=-1;
            while(t)cnt++,t>>=1;
            have[cnt]++;
        }
        if(sum<n)
        {
            printf("-1
");
            continue;
        }
        int i=0;
        while(n)
        {
            if(n&1ll)
            { 
                if(have[i])have[i]--;
                else
                {
                    for(int j=i+1;j<60;j++)
                        if(have[j])
                        {
                            have[j]--;
                            while(j>i)have[--j]++,ans++;
                            break;
                        }
                }
            }
            have[i+1]+=have[i]/2;
            n>>=1ll;i++;
        }
        printf("%lld
",ans);
    }
    return 0;
}

Erase Subsequences

题解

shit为什么我写的题解全没了!!!!

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
const int maxl=410;
int T;
char s[maxl],t[maxl];
int dp[maxl][maxl];
int main()
{
    T=read();
    while(T--)
    {
        scanf("%s%s",s+1,t+1);
        int l1=strlen(s+1),l2=strlen(t+1);
        bool ok=0;
        for(int k=1;k<=l2 && !ok;k++)//第一段范围1~k,第二段k+1~l2 
        {
            mem(dp,-1);//dp[i][j]表示s匹配到i,第一段匹配到j时候第二段的最远匹配
            for(int i=0;i<=l1;i++)dp[i][0]=0;
            for(int i=0;i<l1;i++)
                for(int j=0;j<=k;j++) 
                {
                    if(dp[i][j]==-1)continue;
                    dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
                    if(s[i+1]==t[j+1])dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]);
                    if(s[i+1]==t[dp[i][j]+1+k])dp[i+1][j]=max(dp[i+1][j],dp[i][j]+1); 
                }
            for(int i=0;i<=l1;i++)if(dp[i][k]==l2-k)ok=1;
        }
        if(!ok)printf("NO
");
        else printf("YES
");       
    }
    return 0;
}

Number of Components

题解

别慌

废话

以上是关于Educational Codeforces Round 82 (Rated for Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27