c语言编程求n个男生m个女生三人一组,且每组男生女生至少有一个最多能组成多少组

*^~^ 2019-12-08 06:58:37
应该怎么写呢?大致思路是什么?
...全文
724 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2019-12-09
  • 打赏
  • 举报
回复
引用 9 楼 寻开心 的回复:
int main()
{
int m,n;
cin >>m >> n;
if (m<n) swap(m,n);
if ( m>=2*n) { cout<<n<<endl; return 0; }
cout << m-n + (2*n-m)/3*2 + (2 == (2*n-m)%3 )<< endl;
return 0;
}
你的算法不太对
假设输入 10 15
你的代码输出 8
结果应该是
1男2女4对
1女2男3对
男入队 10
女入队 11
总共7队


寻开心 2019-12-09
  • 打赏
  • 举报
回复
贪心那个就不是o(1) 是 o(n)
要是o(n)至于费这个劲吗
lin5161678 2019-12-09
  • 打赏
  • 举报
回复
引用 12 楼 纵使微芒如烟 的回复:
看了下楼上,还是我的方法清爽大方
清爽的错
和我错的一模一样
纵使微芒如烟 2019-12-09
  • 打赏
  • 举报
回复
看了下楼上,还是我的方法清爽大方
纵使微芒如烟 2019-12-09
  • 打赏
  • 举报
回复
贪心算法,在少的里面取1,多的里面取2。递归。 然后可以数学课归纳总结,复杂度O(1)
纵使微芒如烟 2019-12-09
  • 打赏
  • 举报
回复
引用 14 楼 寻开心 的回复:
贪心那个就不是o(1) 是 o(n) 要是o(n)至于费这个劲吗
找一下规律做个优化
寻开心 2019-12-09
  • 打赏
  • 举报
回复
10 15 是能凑成8组的 10+15=25个人
5 10 这是5组 (1:2) * 5
3 3 这是2组 (1:2 + 2:1)
2 2 这里可以再凑出一组 1:2 or 2:1
合计8组*3 = 24人
lin5161678 2019-12-08
  • 打赏
  • 举报
回复
引用 7 楼 寻开心 的回复:
用你那个解释不通 5 6 的情况
6/2 + ( 5-6/2>1 = 4 4*3=12人 > 5+6=11人 不行的


算法是不用3:3减法的,可以这样来:

if ( m<n ) swap(m,n) // 解决假定的m>2的情况

if ( m>=2*n ) cout << n; 结束。 这个预先处理掉

接下来用用到m-n=k了
n中拿出k,m中拿出2k后, 男女数目平等了
平等后按照3:3处理,这个一个除法就解决
剩余就是1:1 和 2:2 情况了

可能存在的疑问是n中能不能拿出来k或者m中能不能拿出2k个人数了,这两个命题是等价的
可以证明,是能拿出的,方法是反证:
拿不出来,也就是是 n -(m-n)< 0 则有。2n-m<0 也就是m>2n. 这是不可能的

再证明上面办法得到的组是最大的
对照上面的处理流程, 得到的组数能保证剩余的人数是1或者2
也就是3:3消去后的剩余情况,剩余1:1的,只有2个人没有组。 剩余2:2的,还可以组一个,剩余只有一个人没有组
所以就是最优解

这样就是O(1)的算法啦
我的思路的确有问题
还是应该用3:3的思路

void test(int n, int m)
{
if(n > m)
{
int t = n;
n = m;
m = t;
}
if(n*2 <= m)
{
printf("%d\n", n);
return;
}

int sum = n/3*2;
n %= 3;
m -= sum/2*3;
if(n == 2)
{
if( m >= 4 )
sum += 2;
else
++sum;
}
if(n == 1)
{
if(m >= 2)
++sum;
}
printf("%d\n", sum);

}
寻开心 2019-12-08
  • 打赏
  • 举报
回复

int main()
{
int m,n;
cin >>m >> n;
if (m<n) swap(m,n);
if ( m>=2*n) { cout<<n<<endl; return 0; }
cout << m-n + (2*n-m)/3*2 + (2 == (2*n-m)%3 )<< endl;
return 0;
}
寻开心 2019-12-08
  • 打赏
  • 举报
回复
swap解决假定 m>n 的情况, 更正
寻开心 2019-12-08
  • 打赏
  • 举报
回复
用你那个解释不通 5 6 的情况
6/2 + ( 5-6/2>1 = 4 4*3=12人 > 5+6=11人 不行的


算法是不用3:3减法的,可以这样来:

if ( m<n ) swap(m,n) // 解决假定的m>2的情况

if ( m>=2*n ) cout << n; 结束。 这个预先处理掉

接下来用用到m-n=k了
n中拿出k,m中拿出2k后, 男女数目平等了
平等后按照3:3处理,这个一个除法就解决
剩余就是1:1 和 2:2 情况了

可能存在的疑问是n中能不能拿出来k或者m中能不能拿出2k个人数了,这两个命题是等价的
可以证明,是能拿出的,方法是反证:
拿不出来,也就是是 n -(m-n)< 0 则有。2n-m<0 也就是m>2n. 这是不可能的

再证明上面办法得到的组是最大的
对照上面的处理流程, 得到的组数能保证剩余的人数是1或者2
也就是3:3消去后的剩余情况,剩余1:1的,只有2个人没有组。 剩余2:2的,还可以组一个,剩余只有一个人没有组
所以就是最优解

这样就是O(1)的算法啦
*^~^ 2019-12-08
  • 打赏
  • 举报
回复
请问m/2 + (n-m/2) > 1是什么意思?
lin5161678 2019-12-08
  • 打赏
  • 举报
回复
引用 4 楼 寻开心 的回复:
3男3女成两组的模式。
逐步扣除。
直到出现剩余的m和n,有m>2n或者 n>2m的情况出现
或者m和n都不超过3的情况
这是一个O(1)的题目
不要用O(n)处理
一般会超时
寻开心 2019-12-08
  • 打赏
  • 举报
回复
3男3女成两组的模式。
逐步扣除。
直到出现剩余的m和n,有m>2n或者 n>2m的情况出现
或者m和n都不超过3的情况
lin5161678 2019-12-08
  • 打赏
  • 举报
回复
哦 理解错了
应该这么看
m n表示人数
假设 n存小数 m存大数
如果 2*n <= m
结果就直接是 n
否则
m/2 + (n-m/2) > 1
*^~^ 2019-12-08
  • 打赏
  • 举报
回复
它的答案用例是
输入
2(测试数据的个数)
2 1
2 6
输出
1
2
用你给的公式好像不对呢
lin5161678 2019-12-08
  • 打赏
  • 举报
回复
目测
m*n*(n-1+m-1)

33,323

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧