暑假杭电多校第一场,这一场是贪心场,很多贪心的题目,但是自己太菜,姿势挫死了,把自己都写吐了。。。
2018 Multi-University Training Contest 1
HDU6298.Maximum Multiple
题目意思就是给你一个n,找出来三个数x,y,z, 使得n=x+y+z,而且x,y,z都是n的因数,并且x*y*z为最大值,让你输出来x*y*z的最大值。如果没有满足条件的情况就输出-1。
由1=1/2+1/3+1/6=1/3+1/3+1/3=1/2+1/4+1/4,所以只需要判断n能否被3和4整除就可以,但是自己智障,判的是能否被2和3整除,简直是蠢到南天门的操作,当时想的就是能被4整除的肯定也能被2整除,我直接判2就可以,但是并没有想反过来是不是成立的,这是个充分不必要条件啊,能被2整除的不一定能被4整除啊,eg:10,mdzz。。。
其他的没什么,这是个水题,但是我们卡了。。。
代码:
1 //1001-数学思维题 脑子是个好东西可惜我没有。
2 #include<iostream>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<algorithm>
7 #include<cctype>
8 #include<cstdlib>
9 #include<queue>
10 #include<vector>
11 #include<map>
12 #include<stack>
13 #include<set>
14 using namespace std;
15 typedef long long ll;
16 const int maxn=1e5+10;
17
18 int main()
19 {
20 int t;
21 while(~scanf("%d",&t)){
22 while(t--){
23 int n;
24 ll ans=-1;
25 scanf("%d",&n);//1=1/2+1/3+1/6=1/3+1/3+1/3=1/2+1/4+1/4
26 if(n%4==0&&n%3==0) ans=(1ll)*(n/2)*(n/3)*(n/6);
27 if(n%4==0) ans=max(ans,(1ll)*(n/2)*(n/4)*(n/4));
28 if(n%3==0) ans=max(ans,(1ll)*(n/3)*(n/3)*(n/3));
29 cout<<ans<<endl;
30 }
31 }
32 }
来源:oschina
链接:https://my.oschina.net/u/4306388/blog/3892418