AtCoder Beginner Contest 167 Solution

前言

難得一次ak ABC.
但是隻剩10分鐘,可憐.
手速和對普及算法的熟練程度都有待提高啊…

正題

AA

考察string的基本運用.(這樣寫更短)

int main() {
	string s,t;
	cin>>s>>t;
	for(char c='a';c<='z';c++)
		if(s+c==t) puts("Yes"),exit(0);
	puts("No"); 
	return 0;
}

BB

入門的貪心

int a,b,c,k,ans;

int main() {
	qr(a); qr(b); qr(c); qr(k);
	if(k<=a) ans=k;
	else {
		ans=a;
		k-=a;
		if(k>b) ans-=k-b;
	}
	pr2(ans);
	return 0;
}

CC

暴力dfsdfs.

int n,m,t,ans,c[N],a[N][N],b[N];

void dfs(int x,int s) {
	if(s>=ans) return ;
	if(x>n) {
		for(int i=1;i<=m;i++) if(b[i]<t) return ;
		ans=s; 
		return ;
	}
	dfs(x+1,s);
	for(int i=1;i<=m;i++) b[i]+=a[x][i];
	dfs(x+1,s+c[x]);
	for(int i=1;i<=m;i++) b[i]-=a[x][i];
}

int main() {
	qr(n); qr(m); qr(t);
	for(int i=1;i<=n;i++) {
		qr(c[i]);
		for(int j=1;j<=m;j++) qr(a[i][j]),b[j]+=a[i][j];
	}
	for(int j=1;j<=m;j++) if(b[j]<t) puts("-1"),exit(0);
	ans=1e9; memset(b,0,sizeof b); dfs(1,0); pr2(ans);
	return 0;
}

DD

我被坑了一次.
一開始打了一個認爲1號點一定在環的打法->WA.

其實本題就是找一下循環節.
在進環之前特判一下即可.

int n,a[N],v[N],cnt,f[N];
ll k;

int main() {
	qr(n);qr(k);for(int i=1;i<=n;i++) qr(a[i]);
	int x=1;
	do {
		v[x]=1;
		if(cnt==k) pr2(x),exit(0);
		f[cnt++]=x;
		x=a[x];
	} while(!v[x]);
	k-=cnt; cnt=0;
	do {
		v[x]=2;
		f[cnt++]=x;
		x=a[x];
	} while(!(v[x]&2));
	pr2(f[k%cnt]);
	return 0;
}

EE

組合數學裸題,但是不知爲啥我會先去跑去做F這麼噁心的題目.
ans=i=0kmCn1k(m1)n1kans=\sum_{i=0}^k mC_{n-1}^k*(m-1)^{n-1-k}
理解:m,i,n1km1m是第一個數的方案,i表示相同的相鄰數的個數,剩下的n-1-k個數的方案爲m-1

int n,m,k;
ll jc[N],inv[N],p[N],ans;

ll power(ll a,ll b=mod-2) {
	ll c=1;
	while(b) {
		if(b&1) c=c*a%mod;
		b /= 2; a=a*a%mod;
	}
	return c;
}

ll C(int x,int y) {return jc[x]*inv[y]%mod*inv[x-y]%mod;}


int main() {
	qr(n); qr(m); qr(k);
	jc[0]=1;for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;
	inv[n]=power(jc[n]);for(int i=n;i;i--) inv[i-1]=inv[i]*i%mod;
	p[0]=1;for(int i=1;i<=n;i++) p[i]=p[i-1]*(m-1)%mod;
	
	for(int i=0;i<=k;i++)
		(ans += C(n-1,i)*p[n-1-i]) %= mod;
	pr2(ans*m%mod);
	return 0;
}

FF

比賽的時候打了個假的算法還過了,AT數據是真心水。

感謝評論區的師兄指出我原來代碼的錯誤貪心。

類似題目

本題只比上面這個題目多了個模擬棧。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6+10;

struct rec {
	int x,y;
} a[N],b[N];
int la,lb;

bool cmp1(rec a,rec b) {return a.x<b.x;}
bool cmp2(rec a,rec b) {return a.y>b.y;}

int n,s0,s1,m;
char s[N];

int main() {
	scanf("%d",&n);
	for(int i=1,l,r;i<=n;i++) {
		scanf("%s",s+1); l=r=0;
		for(int j=1;s[j];j++)
			if(s[j]=='(') l++;
			else if(l) l--;
			else r++;
		//-r +l
		if(r<l) a[++la]=(rec){r,l};
		else b[++lb]=(rec){r,l};
		s0+=r; s1+=l;
	}
	if(s0^s1) return puts("No"),0;
	sort(a+1,a+la+1,cmp1);
	sort(b+1,b+lb+1,cmp2);
	for(int i=1;i<=la;i++) {
		if(m<a[i].x) return puts("No"),0;
		m-=a[i].x-a[i].y;
	}
	for(int i=1;i<=lb;i++) {
		if(m<b[i].x) return puts("No"),0;
		m-=b[i].x-b[i].y;
	}
	puts("Yes"); return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章