3 public class gen_stress_javacert
{
5 public static void main(String
[] args
) throws Exception
{
6 new gen_stress_javacert().go();
9 void go() throws Exception
{
22 Pair(int wi
, int ni
) {
28 public String
toString() {
29 return wi
+ " " + ni
+ " " + (100.0*(ni
- wi
) / ni
);
34 List
<List
<Pair
>> llpall
= new ArrayList
<List
<Pair
>>();
35 List
<List
<Pair
>> llp
= new ArrayList
<List
<Pair
>>();
39 Random rnd
= new Random();
56 private void checkOne() {
59 soldiff
= Integer
.MAX_VALUE
;
60 long time
= System
.currentTimeMillis();
61 timelimit
= time
+ 10000L;
62 int steps
= find(0, 0, 0, Integer
.MAX_VALUE
, Integer
.MIN_VALUE
);
63 time
= System
.currentTimeMillis() - time
;
64 assert soldiff
< Integer
.MAX_VALUE
;
65 if (steps
> maxsteps
) {
67 System
.out
.printf("%d %d %d%n", k
, n
, m
);
68 for (int i
= 0; i
< m
; i
++) {
69 System
.out
.printf("%d %d %d%n", p
[i
], wi
[i
], ni
[i
]);
71 System
.out
.printf("%d steps in %d ms%n", steps
, time
);
74 System
.out
.println(".");
80 private void randomSol() {
83 int epr
= rnd
.nextInt(20);
84 for (int i
= 0; i
< m
; i
++) {
86 ni
[i
] = rem
== 0 ? n
- ns
:
87 rnd
.nextInt(10) > epr ? Math
.min(n
- ns
- rem
, Math
.round(n
/ m
)) :
88 1 + rnd
.nextInt(n
- ns
- rem
);
89 wi
[i
] = rnd
.nextInt(ni
[i
] + 1);
90 p
[i
] = (int)Math
.round(100.0 * (ni
[i
] - wi
[i
]) / ni
[i
]);
99 private void selectPairs() {
101 for (int i
= 0; i
< m
; i
++) {
102 llp
.add(llpall
.get(p
[i
]));
106 private void prebuildPairs() {
107 for (int i
= 0; i
<= n
; i
++) {
108 llpall
.add(new ArrayList
<Pair
>());
110 for (int ni
= 1; ni
<= n
; ni
++) {
111 for (int wi
= 0; wi
<= ni
; wi
++) {
112 int ppp
= 100 * (ni
- wi
);
113 int pp
= (2 * ppp
+ ni
) / (2 * ni
);
114 if (2 * ppp
% ni
== 0 && 2 * ppp
/ ni
% 2 == 1 && pp
% 2 == 1)
116 llpall
.get(pp
).add(new Pair(wi
, ni
));
121 private void presortPairs() {
122 final double mid
= n
/ m
;
123 for (int i
= 0; i
<= n
; i
++) {
124 Collections
.sort(llpall
.get(i
), new Comparator
<Pair
>() {
125 public int compare(Pair p1
, Pair p2
) {
126 double d1
= Math
.abs(p1
.ni
- mid
);
127 double d2
= Math
.abs(p2
.ni
- mid
);
128 return Double
.compare(d1
, d2
);
134 int find(int i
, int ws
, int ns
, int minni
, int maxni
) {
135 if (ns
> n
|| ws
> w
)
137 int diff
= maxni
- minni
;
141 if (ns
< n
|| ws
< w
)
146 if (System
.currentTimeMillis() > timelimit
)
149 for (Pair p
: llp
.get(i
)) {
150 res
+= find(i
+ 1, ws
+ p
.wi
, ns
+ p
.ni
, Math
.min(minni
, p
.ni
), Math
.max(maxni
, p
.ni
));