Gym101102ABEFH--2016 ACM Amman Collegiate Programming Contest

2016 ACM Amman Collegiate Programming Contest


题目链接:http://codeforces.com/gym/101102/

A. Coins

Problem: A,B各有n,m枚硬币,两人合作支付价值W元,且两人各自支付的差<=K,求方案书

Solution: 背包问题 dp[0(1))] [i]+=dp[0(1)] [i-a[j] (b[j])]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
ll t,n,m,k,w,dp[2][16000],nx,mx,ans=0;
int main() {
	scanf("%d",&t);
	while(t--) {
		ans=0;
		memset(dp,0,sizeof(dp));
		scanf("%lld%lld%lld%lld",&n,&m,&k,&w);
		dp[0][0]=dp[1][0]=1;
		for(int i=1; i<=n; i++) {
			scanf("%d",&nx);
			for(int j=w; j>=nx; j--) {
				dp[0][j]=(dp[0][j]+dp[0][j-nx])%MOD;
			}
		}
		for(int i=1; i<=m; i++) {
			scanf("%d",&mx);
			for(int j=w; j>=mx; j--) {
				dp[1][j]=(dp[1][j]+dp[1][j-mx])%MOD;
			}
		}
		for(int i=0; i<=w; i++) {
			if(abs(i-(w-i))<=k) {
				ans=(ans+dp[0][i]*dp[1][w-i])%MOD;
			}
		}
		printf("%lld\n",ans);
	}
}

B. The Little Match Girl

Problem: n位数(数字由火柴组成),通过移动火柴得到的最大的n位数

Solution: 记录总用火柴数,数字由大至小拼火柴,注意一个数字至多和至少需要几根火柴

#include<bits/stdc++.h>
using namespace std;
int t,n;
string s;
int use[10]={6,2,5,5,4,5,6,3,7,6};
int main(){
	scanf("%d",&t);
	int mx=7,mi=2;
	while(t--){
		int sum=0;
		scanf("%d",&n);
		cin>>s;
		for(int i=0;i<n;i++){
			sum+=use[s[i]-'0'];
		}
		for(int i=0;i<n;i++){
			for(int j=9;j>=0;j--){
				if((sum-use[j]<=mx*(n-i-1))&&(sum-use[j]>=mi*(n-i-1))){
					s[i]='0'+j;
					sum-=use[j];
					break; 
				}
			}
		}
		cout<<s<<endl;
	}
	return 0;
	
}

E. Ya Rajaie and Books

Problem: n本书,至少几个书架(5本/每)

Solution: 水

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,t;
int main() {
	scanf("%lld",&t);
	while(t--) {
		scanf("%lld",&n);
		if(n%5==0) {
			cout<<(n/5)<<endl;
			continue;
		}
		cout<<(n/5+1)<<endl;
	}
	return 0;
}

F. Exchange

Problem: 求字符串,原字符串互换两种字母后使得字典序最小

Solution: 找最早可以交换的字符

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,a[26];
char s[100005];
int main() {
	scanf("%d",&t);
	while(t--) {
		int c1=-1,c2=-1;
		memset(a,0,sizeof(a));
		scanf("%s",s);
		int len=strlen(s);
		for(int i=0; i<len; i++) a[s[i]-'a']=1;
		for(int i=0; i<len; i++) {
			if(a[s[i]-'a']){
				int pos=-1;
				for(int j=0; j<s[i]-'a'; j++) {
					if(a[j]) {
						pos=j;
						break;
					}
				}
				if(pos<0)  a[s[i]-'a']=0;
				else{
					c1=s[i]-'a';
					c2=pos;
					break;
				}  
			}
		}
		for(int i=0; i<len; i++) {
			if(s[i]-'a'==c1) s[i]=c2+'a';
			else if(s[i]-'a'==c2) s[i]=c1+'a';
		}
		printf("%s\n",s);
	}
	return 0;
}

H. Cinema

Problem: 是否有连续的空位给自己和朋友做

Solution: 求最大的连续空位,是否大于k+1

#include<bits/stdc++.h>
using namespace std;
int t,c,k,cnt=0,ans=0;
string s;
int main(){
	scanf("%d",&t);
	while(t--){
		cnt=0;
		ans=0;
		scanf("%d%d",&c,&k);
		cin>>s;
		for(int i=0;i<c;i++){
			if(s[i]=='0'){
				cnt++;
			} else{
				cnt=0;
			}
			ans=max(cnt,ans); 
		}
		if(ans>=k+1){
			cout<<"yes"<<endl; 
		}else{
			cout<<"no"<<endl;
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值