Educational Codeforces Round 116

Link

好!

上分了!

Educational Codeforces Round 116

好吧讲正题啦(没切 D 真是太不爽了)

A:AB Balance

题意:给出一个只包含 A B 的字符串 \(S\) ,要求用最小的步数使其变成合法。
合法:字符串 \(S\) 所包含的 AB 和 BA 个数相同。

考虑将 AB 视作 +1 , 将 BA 视作 -1 ,那么就是要求整串的和是 0 ,所以 合法 当且仅当 开头和结尾相同。

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
const int N=110;
int T,n;
char s[N];
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%s",s+1);
        n=strlen(s+1);
        if(s[1]!=s[n])s[1]=(s[1]=='a'?'b':'a');//完全可以直接写成 s[1]=s[n]
        printf("%s\n",s+1);
    }

    return 0;
}

B:Update Files

题意:有 \(n\) 个电脑,每次可以将至多 \(m\) 个电脑的数据转移到另外 \(m\) 个电脑里,不能同时接收两个或同时接收发送,问最少用多少次可以把所有数据放到一个电脑里。

每次把最左边的 \(m\) 个放到最右边 \(m\) 个去,这一定是最优的,剩余个数少于 \(2m\) 时把 \(m\) 缩一下即可。

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
int T;
ll n,ans,m;
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%lld%lld",&n,&m);
		ans=0;
		while(n>1){
			m=min(m,n/2);
			ans+=n/m-1;
			n=n%m+m;
		}
		printf("%lld\n",ans);
	}

	return 0;
}

C:Banknotes

大概也是一个SB题。。。给出几种钞票和最大总张数 \(m\) ,问最小的不能表示的数,保证最小面额为 1 ,且每种面额都是 10 的幂。

贪心放就好。

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
int n,a[20],T,m,mi[20];
ll ans;
int main(){
	mi[0]=1;
	fo(i,1,9)mi[i]=mi[i-1]*10;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		fo(i,1,n)scanf("%d",&a[i]);
		ans=0;
		fo(i,1,n){
			if(i==n || mi[a[i+1]-a[i]]-1>m){
				ans+=(ll)mi[a[i]]*(m+1);
				break;
			}else{
				ans+=mi[a[i+1]]-mi[a[i]];
				m-=(mi[a[i+1]-a[i]]-1);
			}
		}
		printf("%lld\n",ans);
	}

	return 0;
}

E:Arena

一场战斗由多个回合组成,每个回合每个英雄对其他所有英雄造成 1 点伤害,回合结束后生命值 < 1$ 的死去。
给出 \(n\) 、 \(k\) ,表示一共有 \(n\) 个英雄,每个英雄的血量上限为 \(k\) ,给每个英雄分配初始生命值,问最后无人获胜(即没有人独自存活)的方案数。

考虑 DP ,设 \(f_{i,j}\) 为 \(n=i , k=j\) 时的答案,转移考虑枚举本轮死了多少英雄。

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
const int N=510;
const int mod=998244353;
int n,m;
ll f[N][N],g[N][N],fac[N],ifac[N];
ll power(ll x,int n){
	ll a=1;
	while(n){
		if(n&1)a=a*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return a;
}
ll C(int n,int m){
	return fac[n] *ifac[m] %mod *ifac[n-m] %mod;
}
int main(){
	scanf("%d%d",&n,&m);
	fac[0]=1;
	fo(i,1,n)fac[i]=fac[i-1]*i%mod;
	ifac[n]=power(fac[n],mod-2);
	fd(i,n,1)ifac[i-1]=ifac[i]*i%mod;
	fo(i,1,m){
		g[i][0]=1;
		fo(j,1,n){
			g[i][j]=g[i][j-1]*i%mod;
		}
	}
	f[0][0]=1;
	fo(i,2,n){
		fo(j,0,i-1)f[i][j]=g[j][i];
		fo(j,i,m){
			fo(k,0,i){
				// if(k==i-1)continue;
				f[i][j]=(f[i][j] + f[i-k][j-i+1]*g[i-1][k]%mod * C(i,k) % mod)%mod;
			}
			f[i][j]=(f[i][j] + g[i-1][i])%mod;
		}
	}
	printf("%lld\n",f[n][m]);

	return 0;
}

呜呜呜没切 D 真是太可惜了呜呜呜

上一篇:umijs 设置请求代理


下一篇:FFT/NTT/FWT重学or新学?