题目描述:
在ACM竞赛中,一支队伍由三名队员组成,现在有N+M名学生,其中有N名学生擅长算法,剩下M名学生擅长编程,这些学生要参加ACM竞赛,他们的教练要求每支队伍至少有一名擅长算法和一名擅长编程的学生,那么这些学生最多可以组成多少支队伍?
输入: 输入两个整数M,N,其中1<N,M<10000000
输出:最多可以组成的队伍数
分析:一支队伍中有一名擅长算法和一名擅长编程的,剩下的这名同学该怎样选择就成了本题的关键。
我们从0开始建立队伍,首先选择一名擅长算法的和一名擅长编程的,然后剩下一名选择这两种学生剩下人数多的那一种的学生。
思路:1.从第一支队伍开始。选择一名擅长算法的和一名擅长编程的。
2.剩下的一名学生选择当前剩下人数多的那种学生。一支队伍完成。
3.然后又回去执行第一步,直到总人数不足3人或者一种学生为0结束。
Java代码实现:
在线运行代码(提示:请在运行前输入两整数,例如 23 34)
import java.util.Scanner;
public class CalculateTeam
{
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
int N,M;
N=scanner.nextInt(); //输入N,M
M=scanner.nextInt();
int n=N,m=M;
int sumTeam=0;//队伍数
if(N<0||M<0||N>10000000||M>10000000)
{
System.out.println("数据不合法");
}
else
{
while (!(m+n<3||m==0||n==0)) // 如果剩余总人数小于3人或任意一种学生没有剩下时退出循环
{
m--;
n--;
if(n>m) //选择剩下人数多的那种学生作为队伍的第三个人
{
n--;
}
else
{
m--;
}
sumTeam++;
}
System.out.println(sumTeam); //输出最大队数
}
}
}
C++实现:
在线运行代码(提示:请在运行前输入两整数,例如 23 34)
#include <stdio.h>
int main()
{
int N,M;
scanf("%d %d",&N,&M);
int n=N,m=M;
int sumTeam=0;//队伍数
if(N<0||M<0||N>10000000||M>10000000)
{
printf("数据不合法");
}
else
{
while (!(m+n<3||m==0||n==0)) // 如果剩余总人数小于3人或任意一种学生没有剩下时退出循环
{
m--;
n--;
if(n>m) //选择剩下人数多的那种学生作为队伍的第三个人
{
n--;
}
else
{
m--;
}
sumTeam++;
}
printf("%d",sumTeam); //输出最大队数
}
return 0;
}