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\n",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一起玩呀~

浙公网安备 33010602011771号