Problem Statement |
|||||||||||||
We have balls of K different colors. The colors are numbered 0 through K-1, and the number of balls of color i is X[i]. We want to divide the balls into as few packages as possible. Each package must contain between 1 and K balls, inclusive. Additionally, each package must be either a "normal set" (all balls in the package have the same color), or a "variety set" (no two balls have the same color). You are given the int K. You are also given ints A, B, C, and D. Use these to generate the array X using the following pseudocode: X[0] = A for i = 1 to K-1: X[i] = (X[i-1] * B + C) % D + 1 Compute and return the smallest possible number of packages. |
|||||||||||||
Definition |
|||||||||||||
|
|||||||||||||
Limits |
|||||||||||||
|
|||||||||||||
Notes |
|||||||||||||
- | You can assume that the answer will fit into a signed 32-bit integer. | ||||||||||||
Constraints |
|||||||||||||
- | K will be between 1 and 100,000, inclusive. | ||||||||||||
- | B, C and D will be between 1 and 1,000,000,000, inclusive. | ||||||||||||
- | A will be between 1 and D, inclusive. | ||||||||||||
Examples |
|||||||||||||
0) | |||||||||||||
|
|||||||||||||
1) | |||||||||||||
|
|||||||||||||
2) | |||||||||||||
|
|||||||||||||
3) | |||||||||||||
|
郁闷了 记得昨天就是这思路写的 硬是没过去样例 今天打了一遍直接A了
尽量的让每个背包装满 先把除得进的加上 再选一个最优的方案放余数 方案两种 要么全相同要么全不同 选一个最优的
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<cmath> 7 using namespace std; 8 #define LL long long 9 #define N 100010 10 #define INF 1e9 11 LL x[N]; 12 int f[N]; 13 class PackingBallsDiv1 14 { 15 public : 16 int minPacks(int K, int A, int B, int C, int D) 17 { 18 int i; 19 x[0] = A; 20 for(i = 1; i < K ; i++) 21 x[i] = (x[i-1]*B+C)%D+1; 22 LL s=0; 23 for(i = 0; i < K ; i++) 24 { 25 s+=x[i]/K; 26 x[i] = x[i]%K;f[x[i]]++; 27 } 28 LL ans = INF; 29 sort(x,x+K); 30 for(i = 0; i < K ; i++) 31 { 32 ans = min(ans,x[i]+s+K-i-1); 33 } 34 return ans; 35 } 36 };