AtCoder Beginner Contest 192

https://atcoder.jp/contests/abc192/tasks

/*果然还是我太菜了qwq*/

D

当长度为1时需要特判一下,因为以任何大于该数为底的值都为该数。

长度大于1时直接二分就行。

/*
*/
char s[100];
int ma,len;
ll m;
bool check(ll x)
{
	ll now=0;
	rep(i,1,len)
	{
		if(m<s[i]-'0')return 0;
		if(now>(m-(s[i]-'0'))/x)return 0;
		now=now*x+s[i]-'0';
//		pdd(i,now);
	}
	return 1;
}
void solve()
{
	sc(s+1);
	slld(m);
	len=strlen(s+1);
	rep(i,1,len)ma=max(ma,s[i]-'0');
	if(len==1)
	{
		if(m>=ma)puts("1");
		else puts("0");
		return;
	}
	ll l=ma+1,r=m,ans=0;
	while(l<=r)
	{
		ll mid=(l+r)>>1;
		if(check(mid))l=mid+1,ans=mid-ma;
		else r=mid-1;
//		plld(mid);
	}
	plld(ans);
}
int main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(0);
    int T=1;
//    sd(T);
    while(T--)solve(); 
}

  

E

迪杰斯特拉

给你一个无向图

每条边有两个参数t,k代表经过这条边需要的时间t和时间为k的倍数时才可以通过

/*
*/
struct node{
	int to,nex;
	ll t,k;
}a[maxn<<1];
int n,m,head[maxn],cnt,x,y;
ll d[maxn];
void add(int fro,int to,ll t,ll k)
{
	a[++cnt].to=to;
	a[cnt].t=t;
	a[cnt].k=k;
	a[cnt].nex=head[fro];
	head[fro]=cnt;
}
void bfs()
{
	d[x]=0;
	priority_queue<PLI,deque<PLI >,greater<PLI > >pq;
	pq.push(mk(0,x));
	while(!pq.empty())
	{
		PLI p=pq.top();
		pq.pop();
		ll val=p.fi;
		int cur=p.se;
		if(cur==y)return;
		for(int i=head[cur];i;i=a[i].nex)
		{
			int to=a[i].to;
			ll t=a[i].t,k=a[i].k;
			ll tmp=val%k;
			if(!tmp)tmp=k;
			tmp=k-tmp;
			if(d[to]>val+tmp+t)
			{
				d[to]=val+tmp+t;
				pq.push(mk(d[to],to));
			}
		}
	}
}
void solve()
{
	sdd(n,m);sdd(x,y);
	rep(i,1,n)d[i]=1e18;
	rep(i,1,m)
	{
		int u,v;
		ll t,k;
		scanf("%d%d%lld%lld",&u,&v,&t,&k);
		add(u,v,t,k);
		add(v,u,t,k);
	}
	bfs();
	if(d[y]==1e18)d[y]=-1;
	plld(d[y]);
}
int main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(0);
    int T=1;
//    sd(T);
    while(T--)solve(); 
}

  

F

这题。。。比赛时debug半天都没过,而且还wa30,结果没想到是f的锅。

/*
n种材料 第i种能力为ai
从中选择大于等于1种材料混合它们
混合k种的话 能力为总的能力
每秒增加k能力 增加的是离散的不是连续的
最早什么时候能获得准确x能力
是可以获得x能力的 
*/
int n,a[109],f[109];
//选择i件物品必须sum[i]%i==f[i] 
ll x,res,sum; 
int tmp[109][109];
void solve()
{
	sd(n);slld(x);
	rep(i,1,n)sd(a[i]),sum+=a[i];
	if(sum==x)
	{
		puts("0");
		return;	
	} 
	rep(i,1,n)f[i]=x%i;
	sort(a+1,a+1+n);
	res=x-a[n];
	rep(i,2,n)//选i个 
	{
		memset(tmp,-1,sizeof tmp);
		tmp[0][0]=0;
		rep(j,1,n)//排到当前 
		{
			dep(ii,min(i-1,j-1),0)//前边选了ii个的和 
			rep(k,0,i-1)
			{
				if(tmp[ii][k]==-1)continue;
				tmp[ii+1][(k+a[j])%i]=max(tmp[ii+1][(k+a[j])%i],tmp[ii][k]+a[j]);
			}
		}
		if(tmp[i][f[i]]!=-1)res=min(res,(x-tmp[i][f[i]])/i);//,
//		printf("%d %lld
",i,(x-tmp[i][f[i]])/i);
	}
	plld(res);
}
int main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(0);
    int T=1;
//    sd(T);
    while(T--)solve(); 
}

  

欢迎加我qq1165750856一起玩呀~
原文地址:https://www.cnblogs.com/HHHEN/p/14424615.html