#include <iostream>
#include <vector>
using namespace std;
int N, K;
bool megvan = 0;
vector<int> dalok;
vector<int> idopont;
void beolvas() {
for (int i = 1; i <= N; i++) {
cin >> dalok[i];
}
for (int i = 1; i <= K; i++) {
cin >> idopont[i];
}
}
void csel(int ido, int dal, int foosszeg, int osszeg) {
if (megvan) return;
if (dal > N) {
dal = 1;
osszeg = 0;
}
if (foosszeg == idopont[ido]) {
cout << dal << " ";
if (ido == K) {
megvan = 1;
return;
}
csel(ido + 1, dal, foosszeg, osszeg);
} else if (osszeg == dalok[dal]) {
csel(ido, dal + 1, foosszeg, 0);
} else {
csel(ido, dal, foosszeg + 1, osszeg + 1);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> K;
dalok.resize(N + 1);
idopont.resize(K + 1);
beolvas();
csel(1, 1, 0, 0);
return 0;
}
Magyarázat a javításokról:
A csel függvényben a dal > N esetet előre helyeztem, hogy elkerüljem az indexelési hibát (dalok[dal] elérése dal > N esetén).
Amikor elérjük egy időpontot (foosszeg == idopont[ido]), a rekurzióban megtartottam az osszeg értéket (nem állítottam vissza 0-ra), hogy a dal folytatódjon ahelyett, hogy újraindulna.
Ez biztosítja, hogy a szimuláció helyesen működjön: a dalok sorrendben játszódnak le (ciklikusan, ha szükséges), és minden időpontnál kiírjuk az aktuális dal indexét.
#include <iostream>
#include <vector>
using namespace std;
int N,K;
bool megvan=0;
vector<int>dalok;
vector<int>idopont;
void beolvas(){
for(int i=1;i<=N;i++){
cin>>dalok[i];
}
for(int i=1;i<=K;i++){
cin>>idopont[i];
}
}
void csel(int ido,int dal,int foosszeg,int osszeg){
if(megvan)return ;
if(dal>N){
dal=1;
osszeg=0;
}
if(foosszeg==idopont[ido]){
cout<<dal<<" ";
if(ido==K){megvan=1;return;}
csel(ido+1,dal,foosszeg,osszeg);
}
else if(osszeg==dalok[dal]){
csel(ido,dal+1,foosszeg,0);
}
else{
csel(ido,dal,foosszeg+1,osszeg+1);
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>N>>K;
dalok.resize(N+1);
idopont.resize(K+1);
beolvas();
csel(1,1,0,0);
} ezzel a strukturaval hogy lehet gyorsabb a programom
Read more
Copy message
Edit message
cpp
Copy code
#include <iostream>
#include <vector>
#include <numeric> // accumulate-hez
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, K;
cin >> N >> K;
vector<int> dalok(N + 1);
for (int i = 1; i <= N; i++) {
cin >> dalok[i];
}
vector<int> idopont(K + 1);
for (int i = 1; i <= K; i++) {
cin >> idopont[i];
}
// Számítsuk ki a teljes ciklus hosszát
int total = 0;
for (int i = 1; i <= N; i++) {
total += dalok[i];
}
// Kumulált hossz vektor: cum[0] = 0, cum[1] = dalok[1], ..., cum[N] = total
vector<int> cum(N + 1, 0);
for (int i = 1; i <= N; i++) {
cum[i] = cum[i - 1] + dalok[i];
}
// Minden időpontnál számítsuk ki a dalt
for (int i = 1; i <= K; i++) {
int t = idopont[i];
if (t == 0) {
// Ha t=0, feltételezzük, hogy az első dal előtt vagyunk, de valószínűleg nem fordul elő
cout << 1 << " ";
continue;
}
// Pozíció a ciklusban: 1-től total-ig
int pos = ((t - 1) % total) + 1;
// Bináris keresés a cum vektorban, hogy melyik dalban vagyunk
// Keressük a legnagyobb i-t, ahol cum[i-1] < pos <= cum[i]
int low = 1, high = N;
int dal = 1;
while (low <= high) {
int mid = (low + high) / 2;
if (cum[mid - 1] < pos && pos <= cum[mid]) {
dal = mid;
break;
} else if (pos <= cum[mid - 1]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
cout << dal << " ";
}
cout << endl; // Opcionális: új sor a végén
return 0;
}
Forditási hiba
open /var/local/lib/isolate/421/box/a.out: no such file or directory
main.cpp:54:1: error: 'Magyar\U000000e1zat' does not name a type
54 | Magyarázat a javításokról:
| ^~~~~~~~~~
main.cpp:66:5: error: redefinition of 'int N'
66 | int N,K;
| ^
main.cpp:6:5: note: 'int N' previously declared here
6 | int N, K;
| ^
main.cpp:66:7: error: redefinition of 'int K'
66 | int N,K;
| ^
main.cpp:6:8: note: 'int K' previously declared here
6 | int N, K;
| ^
main.cpp:67:6: error: redefinition of 'bool megvan'
67 | bool megvan=0;
| ^~~~~~
main.cpp:7:6: note: 'bool megvan' previously defined here
7 | bool megvan = 0;
| ^~~~~~
main.cpp:68:12: error: redefinition of 'std::vector<int> dalok'
68 | vector<int>dalok;
| ^~~~~
main.cpp:8:13: note: 'std::vector<int> dalok' previously declared here
8 | vector<int> dalok;
| ^~~~~
main.cpp:69:12: error: redefinition of 'std::vector<int> idopont'
69 | vector<int>idopont;
| ^~~~~~~
main.cpp:9:13: note: 'std::vector<int> idopont' previously declared here
9 | vector<int> idopont;
| ^~~~~~~
main.cpp:72:6: error: redefinition of 'void beolvas()'
72 | void beolvas(){
| ^~~~~~~
main.cpp:11:6: note: 'void beolvas()' previously defined here
11 | void beolvas() {
| ^~~~~~~
main.cpp:85:6: error: redefinition of 'void csel(int, int, int, int)'
85 | void csel(int ido,int dal,int foosszeg,int osszeg){
| ^~~~
main.cpp:20:6: note: 'void csel(int, int, int, int)' previously defined here
20 | void csel(int ido, int dal, int foosszeg, int osszeg) {
| ^~~~
main.cpp:105:5: error: redefinition of 'int main()'
105 | int main()
| ^~~~
main.cpp:40:5: note: 'int main()' previously defined here
40 | int main() {
| ^~~~
main.cpp:119:3: error: 'ezzel' does not name a type
119 | } ezzel a strukturaval hogy lehet gyorsabb a programom
| ^~~~~
main.cpp...