标签:href scan line cpp sum set eof i++ rate
前面题看了懒得写了 直接从D开始
贪心,用\(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;
}
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;
}
别慌
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