-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
195 lines (158 loc) · 5.65 KB
/
main.cpp
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*
L'entrée représente une liste de temps et une distance qui correspond au record pour cette course.
Nous participons à une course de bateaux jouets, dont le fonctionnement est le suivant :
Ils ont un bouton, chaque milliseconde que l'on reste appuyé dessus augmente leur vitesse d'1 millimètre/s.
Prenons comme exemple une course qui dure 5 ms. Nous avons plusieurs possibilités :
- On reste appuyer 0ms --> il a une vitesse de 0mm/s pour les 5ms suivantes --> distance parcourue: 0 mm.
- On reste appuyer 1ms --> il a une vitesse de 1mm/s pour les 4ms suivantes --> distance parcourue: 4 mm.
- On reste appuyer 2ms --> il a une vitesse de 2mm/s pour les 3ms suivantes --> distance parcourue: 6 mm.
- On reste appuyer 3ms --> il a une vitesse de 3mm/s pour les 2ms suivantes --> distance parcourue: 6 mm.
- On reste appuyer 4ms --> il a une vitesse de 4mm/s pour les 1ms suivantes --> distance parcourue: 4 mm.
- On reste appuyer 5ms --> il a une vitesse de 5mm/s pour les 0ms suivantes --> distance parcourue: 0 mm.
Pour la partie 1, l'objectif est de trouver, pour chaque course, le nombre de possibilités qui nous font battre le
record.
La réponse attendue est le produit du nombre de possibilités pour chaque course.
Dans la partie 2, nous nous rendons compte que nous avons mal lu l'entrée et qu'il y a une seule course avec la
concaténation des temps et de la distance pour le record.
Par exemple, pour:
Time: 7 15 30
Distance: 9 40 200
devient :
Time: 71530
Distance: 940200
Dans ces conditions, combien avons-nous de possibilités pour battre le record ?
*/
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <Utils/MeasureExecutionTime.cpp>
#include <Utils/SplitString.cpp>
using namespace std;
// Structure représentant une course de bateau jouet
struct Race
{
int time; // Temps de la course en millisecondes
int distance; // Distance correspondant au record en millimètres
};
vector<Race> races;
int parseInput()
{
MEASURE_FUNCTION_EXECUTION_TIME
string filename = "input.txt";
ifstream file(filename);
if (!file.is_open())
{
cerr << "Erreur : impossible d'ouvrir le fichier " << filename;
return 1;
}
string line;
vector<int> t;
vector<int> d;
while (getline(file, line))
{
vector<string> splitedInput = splitString(splitString(line, ":")[1], " ");
bool time = t.size() == 0;
for (string s : splitedInput)
{
if (time)
{
t.push_back(stoi(s));
}
else
{
d.push_back(stoi(s));
}
}
}
file.close();
for (int i = 0; i < t.size(); i++)
{
races.push_back({t[i], d[i]});
}
return 0;
}
int processP1()
{
MEASURE_FUNCTION_EXECUTION_TIME
// Variable pour stocker le produit final
int product = 1;
// Parcours de chaque course dans le vecteur races
for (Race &r : races)
{
// Variable pour compter le nombre de façons de battre le record pour la course actuelle
int countWin = 0;
// Itération sur chaque possible temps d'appui sur le bouton
for (int timePush = 0; timePush < r.time; timePush++)
{
// Calcul du temps de mouvement restant après l'appui sur le bouton
int timeMove = r.time - timePush;
// Calcul de la distance parcourue avec la vitesse résultante
int d = timeMove * timePush;
// Vérification si la distance parcourue dépasse le record
if (d > r.distance)
{
countWin++;
}
// Si la condition n'est plus satisfaite et countWin n'est pas 0, on sort de la boucle
else if (countWin != 0)
{
break;
}
}
// Multiplication du produit partiel par le nombre de façons de battre le record pour la course actuelle
product *= countWin;
}
// Retour du produit final
return product;
}
int processP2()
{
MEASURE_FUNCTION_EXECUTION_TIME
// Variables pour stocker les chaînes de caractères représentant le temps et la distance
string timeS = "";
string distanceS = "";
// Concaténation des temps et des distances pour chaque course
for (Race &r : races)
{
timeS += to_string(r.time);
distanceS += to_string(r.distance);
}
// Conversion des chaînes en nombres long long
long long time = stoll(timeS);
long long distance = stoll(distanceS);
// Variable pour compter le nombre de façons de battre le record
int countWin = 0;
// Itération sur chaque possible temps d'appui sur le bouton
for (long long timePush = 0; timePush < time; timePush++)
{
// Calcul du temps de mouvement restant après l'appui sur le bouton
long long timeMove = time - timePush;
// Calcul de la distance parcourue avec la vitesse résultante
long long d = timeMove * timePush;
// Vérification si la distance parcourue dépasse le record combiné de toutes les courses
if (d > distance)
{
countWin++;
}
// Si la condition n'est plus satisfaite et countWin n'est pas 0, on sort de la boucle
else if (countWin != 0)
{
break;
}
}
// Retour du nombre de façons de battre le record
return countWin;
}
int main()
{
if (parseInput() == 1)
{
return 1;
}
int part1 = processP1();
int part2 = processP2();
cout << "\nPart1: " << part1 << '\n';
cout << "Part2: " << part2 << '\n';
return 0;
}