题目来源:牛客
从题目可知,5种工具分别需要
木棍 | 钻石 |
2 | 3 |
2 | 2 |
2 | 1 |
2 | 3 |
1 | 2 |
其中 木棍2 钻石1 和 木棍1 钻石2 可以算是所需材料最少的,如果能够合成其他种类工具,那也一定可以合成该两种中的一种或两种,所以求合成工具数量的最大值,可以直接计算只合成该两种情况的工具。
//错误示例
#include<stdio.h>
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
int n, m, ans = 0;
scanf("%d%d", &n, &m);
//如果两种情况各一次,需3个木棍3个钻石,且产了2个工具
if(n >= 3 && m >= 3)
{
int x = n / 3;
int y = m / 3;
if(x > y)
{
ans += (y*2);
n -= y*3;
m -= y*3;
}
else
{
ans += (x*2);
n -= x*3;
m -= x*3;
}
}
if(n < m)
{
while(m >= 0 && n >= 0)
{
n -= 1;
m -= 2;
if(m >= 0 && n >= 0)
ans ++;
}
}
else
{
while(n >= 0 && m >= 0)
{
m -= 1;
n -= 2;
if(n >= 0 && m >= 0)
ans ++;
}
}
printf("%d\n", ans);
}
}
按照自己起初的想法,先计算两种情况混合能生产多少,在计算剩余的可以产多少个。
之后发现题目所给例子可以过,但是提交之后的例子一个也过不去。
???
结束之后看了其他大佬的答案,直接!!!
//正确答案
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
int n, m;
scanf("%d%d", &n, &m);
printf("%d\n", min(min(n, m), (n+m)/3));
}
}
可见 n, m, (n + m)/3 的最小值即为答案。
n | 全是1 2情况 |
m | 全是2 1情况 |
(n+m) / 3 | 1 2和2 1混合 |
这个思路直接让我醍醐灌顶恍然大悟自愧不如连连赞叹......
也发现了自己写的答案问题所在,首先就考虑了混合的情况,如果单纯只有一种工具的话,答案当然错误。
比如5 10时全部采用1 2的情况,可得数量为5。
而我自己写的得到数量为4。
总结!!!
找规律,考虑全面!