问题D:虚空之力
问题描述
樱满集注射了第二支虚空基因组,重新夺回了王之力,而hx073269则想为王的诞生献上礼炮!
有一串长度为n的小写字母组成的字符串,hx073269可以从中挑选‘k’ ‘i’ ‘n’ ‘g’四个字符组成一支礼炮,或者从中挑选‘k’ ‘i’ ‘n’ ‘g’ ‘i’ ‘n’ ‘g’七个字符组成两支礼炮。请问hx073269为王的诞生最多能献上多少礼炮?
输入
第一行一个正整数n,表示字符串长度,n<=10^7。
第二行一串只含有小写字母的字符串。
输出
输出hx073269为王的诞生能献上的最多礼炮数。
样例输入
4
king
样例输出
1
#include <stdio.h>
int main(void){
int min(int a,int b);//声明min函数,便于比较大小
int t,k=0,i=0,n=0,g=0,x,y;
char a;
while(~scanf("%d",&t)){
getchar();//吞掉回车键
while(t--){
scanf("%c",&a);
if(a=='k') k++;
else if(a=='i') i++;
else if(a=='n') n++;
else if(a=='g') g++;//只分别记录k,i,n,g的数量
}
x=min(k,i); x=min(x,n); x=min(x,g);
k-=x; i-=x; n-=x; g-=x;//先寻找k,i,n,g中最小的那个
if(i==0||n==0||g==0) printf("%d\n",x);//只要i,n,g中有一个是最小即此时为0的时候,说明最多能献上这么多的礼炮
else if(k==0){
y=min(i,n);y=min(y,g);y=min(k+x,y);
printf("%d\n",y+x);
}
/*如果i,n,g都不为0而且k为0的话,则容易想出还能由一个k与两个i,n,g组成两个礼炮,而取最小值是由于此时i,n,g可能率先为0,也有可能是k不能全部用来组成两个礼炮*/
k=0;i=0;n=0;g=0;//防止上一轮的数据对下一轮造成影响
}
return 0;
}
int min(int a,int b){
if(a>b) return b;
else return a;
}//定义使用到的min函数
AC代码如上(如有错误,欢迎指正)