A题。
无非是变成1或者2,所以K组中对照位置比较1和2的个数,改变个数少的。
# include <stdio.h>
int arr[110];
int main()
{
int n,k,i,j,ans,a,b;
while(~scanf("%d%d",&n,&k))
{
ans = 0;
for(i = 0;i < n;i ++)
scanf("%d",&arr[i]);
for(i = 0;i < k;i ++)
{
a = b = 0;
for(j = 0;j < n/k;j ++)
{
if(arr[j*k+i] == 1)
a += 1;
else
b += 1;
}
if(a > b)
ans += b;
else
ans += a;
}
printf("%d\n",ans);
}
return 0;
}
B题。
先求出最大公约数,然后用a,b除以最大公约数,看他们的商是否为2、3、5组成。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int gcd(int a,int b)
{
return a%b==0?b:gcd(b,a%b);
}
int main()
{
int a,b,ans,i,j,val,flag;
while(~scanf("%d%d",&a,&b))
{
flag = 1;
if(a == b)
ans = 0;
else
{
ans =0;
j=gcd(a,b);
val=a/j;
while(val!=1)
{
if(val%2==0)val/=2;
else if(val%3==0)val/=3;
else if(val%5==0)val/=5;
else
{
flag = 0;
break;
}
ans += 1;
}
val=b/j;
while(val!=1)
{
if(val%2==0)val/=2;
else if(val%3==0)val/=3;
else if(val%5==0)val/=5;
else
{
flag = 0;
break;
}
ans += 1;
}
}
if(flag)printf("%d\n",ans);
else if(flag == 0)printf("-1\n");
else puts("0");
}
return 0;
}
C题。
注意边界条件,没注意边界,导致wa了。
#include<stdio.h>
#include<string.h>
char ch[110];
int main()
{
int nb,ns,nc,pb,ps,pc;
int i,len,b,s,c,num;
long long int ans,p,count;
while(~scanf("%s",ch))
{
scanf("%d%d%d",&nb,&ns,&nc);
scanf("%d%d%d",&pb,&ps,&pc);
scanf("%I64d",&p);
len = strlen(ch);
b=s=c=0;
for(i=0;i<len;i++)
{
if(ch[i]=='B')b+=1;
if(ch[i]=='S')s+=1;
if(ch[i]=='C')c+=1;
}
ans = 100000000;
if(b)
{
num=nb/b;
if(num<ans) ans = num;
}
else nb = 0;
if(s)
{
num = ns/s;
if(num<ans) ans = num;
}
else ns = 0;
if(c)
{
num = nc/c;
if(num<ans) ans = num;
}
else nc = 0;
nb-=ans*b,nc-=ans*c,ns-=ans*s;
for(i=0;;i++)
{
if(nb==0&&nc==0&&ns==0)break;
if(nb>=b)nb-=b;
else p-=(b-nb)*pb,nb=0;
if(nc>=c)nc-=c;
else p-=(c-nc)*pc,nc=0;
if(ns>=s)ns-=s;
else p-=(s-ns)*ps,ns=0;
if(p<0)break;
}
ans += i;
if(p>0)
{
count = 0;
count = p/(b*pb+s*ps+c*pc);
ans += count;
p -= count*(b*pb+s*ps+c*pc);
}
printf("%I64d\n",ans);
getchar();
memset(ch,0,sizeof(ch));
}
return 0;
}