hdu4811 2013ACM/ICPC亚洲区南京站 Ball
题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=4811
思路一:
对于球数量 < 3 的情况,特判就好了
然后分四种情况讨论:
1.数量为0的球只有一个
两种情况
1.a = 0, b = 1, c >= 2 (当然对于a 可以是三种任意颜色,结果都一样)
找规律发现
ans = 3 * sum - 6
2.a = 0, b >= 2, c >= 2 (同样对于a 可以是三种任意颜色,结果都一样)
找规律发现
ans = 4 * sum - 10;
2.数量为0的球只有两个
找规律发现
ans = 2 * sum - 3;
3.数量为0的球有三个
这种很简单 ans = 0
4.数量为0的球有0个
3种情况
1. 球的数量为 a = 1, b = 1, c >= 2
ans = 4 * sum - 10;
2.球的数量为 a = 1, b >= 2, c >= 2
ans = 5*sum - 15;
3.球的数量为 a = 1, b = 1, c = 1;
ans = 3;
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
ll a, b, c;
while (~scanf("%lld %lld %lld", &a, &b, &c))
{
ll ans = 0;
ll sum = a + b + c; // 球的总数
if (sum == 0) ans = 0;
else if (a == sum || b == sum || c == sum) // .数量为0的球只有两个
{
if (sum == 1) ans = 0;
else
ans = 2*sum - 3;
}
else if (a == 0|| b == 0 || c == 0) // .数量为0的球只有一个
{
if (a != 1 && b!=1 && c!= 1){
if (sum == 2)
{
ans = 1;
}
else if (sum == 3)
ans = 3;
else ans = 4 * sum - 10; // ans = 4 * sum - 10;
}
else{
if (sum == 2)
{
ans = 1;
}
else if (sum == 3)
ans = 3;
else ans = 3 * sum - 6; //1.a = 0, b = 1, c >= 2
}
}
else if (a && b && c)
{
if (a >= 2 && b >= 2 && c >= 2)
{
ans = 15 + (sum - 6) * 6;
}
else if ((a <2 && b <2 && c >= 2)||(b <2 && a >=2 && c <2)||(b >=2 && c <2 && a < 2))
{
ans = 4 * sum - 10;
}
else if ((a <2 && b >=2 && c >= 2)||(b <2 && a >=2 && c >=2)||(b >=2 && c <2 && a >= 2))
{
ans = 5 * sum - 15;
}
else if (a < 2 && b < 2 && c < 2)
{
ans = 3;
}
}
printf("%lld\n", ans);
}
}
思路2 贪心
将个颜色的球,少于于两个的都取,多余两个的只取两个。可求出这些球的每次放球的最大加分s,则从最开始放球加0分,然后每次放球加的分比前一次多1,当放的球等于s-1时,其后便每次放球多加s分。
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <string> #include <algorithm> #include <queue> #include <set> using namespace std; typedef long long ll; int main() { ll a[3]; while (~scanf("%lld %lld %lld", &a[0], &a[1], &a[2])) { ll s = 0; for (ll i = 0; i < 3; i++) { if (a[i] < 2) { s += a[i]; } else s += 2; } ll sum = a[0] + a[1] + a[2]; ll ans = 0; for (ll i = 0; i < s; i++) { ans += i; } if (sum > s) { ans += (sum - s) * s; } printf("%lld\n", ans); } }