#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
int bitFactor(unsigned long long int bit) {
int i=0;
unsigned long long int p;
if (bit <= 1) return (int)bit;
do {
p = pow(2, i++);
} while(p < bit);
p = pow(2, i-2);
return 1 + bitFactor(bit % p);
}
bool reassignJumps(unsigned long long int *&jumps, unsigned long long int limit, int size) {
for (int i=0; i<size; i++) {
if (jumps[i]+size-i-1 >= limit) {
if (i == 0) return false;
jumps[i-1]++;
jumps[i] = jumps[i-1]+1;
for (int j=i+1; j<size; j++) {
jumps[j] = jumps[j-1]+1;
}
return true;
}
}
jumps[size-1]++;
return true;
}
int main(int argc, char const *argv[]) {
bool finish = false;
int numberOfSeconds;
unsigned long long int bitLimit, i, iterations=0, *jumps;
long long int *rates, sum, sumTmp;
if (!scanf("%d %llu", &numberOfSeconds, &bitLimit)) return 1;
rates = (long long int *) malloc(numberOfSeconds * sizeof(long long int));
jumps = (unsigned long long int *) malloc(numberOfSeconds * sizeof(unsigned long long int));
for (i=0; i<numberOfSeconds; i++) {
if (!scanf("%lli", &rates[i])) return 1;
jumps[i] = i==0 ? 0 : jumps[i-1]+1;
}
while (true) {
sumTmp = 0;
for (int i=0; i<numberOfSeconds; i++) {
sumTmp += rates[i]*bitFactor(jumps[i]);
}
if (iterations == 0 || sumTmp > sum) sum = sumTmp;
iterations++;
if (!reassignJumps(jumps, bitLimit, numberOfSeconds)) break;
}
printf("%lli %llu", sum, iterations);
free(rates);
free(jumps);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include <stdio.h> #include <stdlib.h> #include <math.h> using namespace std; int bitFactor(unsigned long long int bit) { int i=0; unsigned long long int p; if (bit <= 1) return (int)bit; do { p = pow(2, i++); } while(p < bit); p = pow(2, i-2); return 1 + bitFactor(bit % p); } bool reassignJumps(unsigned long long int *&jumps, unsigned long long int limit, int size) { for (int i=0; i<size; i++) { if (jumps[i]+size-i-1 >= limit) { if (i == 0) return false; jumps[i-1]++; jumps[i] = jumps[i-1]+1; for (int j=i+1; j<size; j++) { jumps[j] = jumps[j-1]+1; } return true; } } jumps[size-1]++; return true; } int main(int argc, char const *argv[]) { bool finish = false; int numberOfSeconds; unsigned long long int bitLimit, i, iterations=0, *jumps; long long int *rates, sum, sumTmp; if (!scanf("%d %llu", &numberOfSeconds, &bitLimit)) return 1; rates = (long long int *) malloc(numberOfSeconds * sizeof(long long int)); jumps = (unsigned long long int *) malloc(numberOfSeconds * sizeof(unsigned long long int)); for (i=0; i<numberOfSeconds; i++) { if (!scanf("%lli", &rates[i])) return 1; jumps[i] = i==0 ? 0 : jumps[i-1]+1; } while (true) { sumTmp = 0; for (int i=0; i<numberOfSeconds; i++) { sumTmp += rates[i]*bitFactor(jumps[i]); } if (iterations == 0 || sumTmp > sum) sum = sumTmp; iterations++; if (!reassignJumps(jumps, bitLimit, numberOfSeconds)) break; } printf("%lli %llu", sum, iterations); free(rates); free(jumps); return 0; } |
English