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;
}