#include #include #include #include using namespace std; typedef struct tuple{ int64_t diff; uint64_t cnt; }TUPLE; int main(int argc, char** argv){ TUPLE tuples[70000]; uint64_t p[70000]; //TUPLE max; uint64_t D, M; cin >> D; uint64_t max; while(D > 0) { max = 0; cin >> M; for(int i = 0; i < D; ++i) { cin >> p[i]; } tuples[0].diff = 0; tuples[0].cnt = M/p[0]; for(int i = 1; i < D ; ++i) { int nakup = M/p[i-1]; if((p[i]-p[i-1])*nakup > ((p[i]*p[i-1])+tuples[i-1].diff)*tuples[i-1].cnt) { tuples[i].diff = p[i]-p[i-1]; tuples[i].cnt = nakup; } else { tuples[i].diff = tuples[i-1].diff + (p[i]-p[i-1]); tuples[i].cnt = tuples[i-1].cnt; } if(max < tuples[i].cnt*tuples[i].diff) max = tuples[i].cnt*tuples[i].diff; } cout << max << endl; cin >> D; } #if 0 int D, M, n; int min, max, min_old; int rozdil; int p[70000]; int mainRozdil=-1; int mainMin; int profit = 0; mainRozdil = max = min = rozdil = 0; scanf("%d", &D); while(D > 0){ profit = mainRozdil = max = min = rozdil = 0; scanf("%d", &M); for(int i = 0; i < D; ++i){ scanf("%d", &n); p[i] = n; } for(int j = 0; j < D; ++j){ if(p[j] rozdil){ max = i; rozdil = p[i] - p[min]; } }*/ for(int i = min + 1; i < D; ++i) { if((M/p[min])*(p[i]-p[min]) > profit) { profit = (M/p[min])*(p[i]-p[min]); } } /* if(mainRozdil < rozdil) { mainRozdil = rozdil; mainMin = min; }*/ } //printf("Rozdil: %d ; Min: %d ; M: %d\n",mainRozdil,p[mainMin],M); //printf("%d\n",(M/p[mainMin])*mainRozdil); printf("%d\n", profit); scanf("%d", &D); } #endif return 0; }