hdu-5646 DZY Loves Partition(贪心) DZY Loves Partition
题目链接:
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 323 Accepted Submission(s): 127
Problem Description
DZY loves partitioning numbers. He wants to know whether it is possible to partition 7.
Input
First line contains 9)
Output
For each testcase, if such partition does not exist, please output 7.
Sample Input
4
3 4
3 2
9 3
666666 2
Sample Output
-1
2
24
110888111
题意:
把n拆成k个互不相同的正整数,并使其乘积最大,问这个乘积最大是多少;
思路:首先判断是否能拆分,能拆分的话把这些平分,并使其成递增的数组,再把n/k剩下的n%k分给剩下的数,k为odd是从最大的数往前n%k个数分别+1;k位even时先把k/2个小点数从大到小分别+1,还有多的话在把剩下的大的k/2个数从大到小+1;最后求得的积就是结果;
AC代码:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const long long mod=1e9+7; int t; long long n,k,a[200000]; int main() { scanf("%d",&t); while(t--) { cin>>n>>k; long long x=n/k; if(k*(k+1)/2>n) { printf("-1 "); } else { if(k%2) { for(int i=k/2;i>0;i--) { a[i]=x-(k/2-i+1); } for(int i=k/2+1;i<=k;i++) { a[i]=x+(i-k/2-1); } int m=n%k; for(int i=k;m>0;m--,i--) { a[i]++; } } else { for(int i=k/2;i>0;i--) { a[i]=x-(k/2-i+1); } for(int i=k/2+1;i<=k;i++) { a[i]=x+(i-k/2); } int m=n%k; for(int i=k/2;i&&m;i--,m--) { a[i]++; } if(m>0) { for(int i=k;i>k/2&&m;i--,m--) { a[i]++; } } } long long ans=a[1]; for(int i=2;i<=k;i++) { ans*=a[i]; ans%=mod; } cout<<ans<<" "; } } return 0; }