码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 82 (Rated for Div. 2)

时间:2020-02-19 00:48:57      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:href   scan   line   cpp   sum   set   eof   i++   rate   

前面题看了懒得写了 直接从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\n");
            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\n",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\n");
        else printf("YES\n");       
    }
    return 0;
}

Number of Components

题解

别慌

废话

Educational Codeforces Round 82 (Rated for Div. 2)

标签:href   scan   line   cpp   sum   set   eof   i++   rate   

原文地址:https://www.cnblogs.com/FYH-SSGSS/p/12329347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!