Hogy lehetne megvalósítani C++-ban?
Az lenne a problémám, hogy van egy példafeladat feladat:
Volt-e olyan hogy úgy veszítettünk, hogy előző k nap mindig nyertünk?
Erre megfelelő a következő kód:
#include <iostream>
#include <vector>
using namespace std;
bool elozo(vector<int> v,int i,int k);
int main()
{
vector<int> v;
int n=0;
cout << "n: ";
cin >> n;
cout << endl;
v.resize(n);
for(int i=0; i<n; i++){
cout << "v[" << i << "]: ";
cin >> v[i];
cout << endl;
}
int k=0;
cout << "k: ";
cin >> k;
bool h=false;
int i=k+1;
while (!h && i<=n){
h=(v[i]<0 && elozo(v,i,k));
i++;
}
if (h){
cout << "False" << endl;
} else{
cout << "True" << endl;
}
return 0;
}
bool elozo(vector<int> v,int i,int k) {
bool h=true;
int j=i-k;
while (h && j<=i-1)
{
h=(v[j]>0);
j++;
}
return h;
}
És nekem a feladatom ez:
Volt-e olyan, hogy úgy nyertünk, hogy előző k nap mindig nyertünk?
Erre így írtam át a fenti kódot:
#include <iostream>
#include <vector>
using namespace std;
bool elozo(vector<int> v,int i,int k);
int main()
{
vector<int> v;
int n=0;
cout << "n: ";
cin >> n;
cout << endl;
v.resize(n);
for(int i=0; i<n; i++){
cout << "v[" << i << "]: ";
cin >> v[i];
cout << endl;
}
int k=0;
cout << "k: ";
cin >> k;
bool h=false;
int i=k+1;
while (!h && i<=n){
h=(v[i]>0 && elozo(v,i,k));
i++;
}
if (h){
cout << "False" << endl;
} else{
cout << "True" << endl;
}
return 0;
}
bool elozo(vector<int> v,int i,int k) {
bool h=true;
int j=i-k;
while (h && j<=i-1)
{
h=(v[j]<0);
j++;
}
return h;
}
De míg az első kód működött, ez nem hajlandó a helyes megoldásra. Gondolom az én logikám nem jó. De tényleg nem jövök rá :/
Előre is köszönöm a segítséget.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
És nekem a feladatom ez:
Volt-e olyan, hogy úgy nyertünk, hogy előző k nap mindig veszítettünk?
Már a példafeladat sem jó szerintem.
Ha a main-ben a h-t sikerül true-ra állítani, azaz teljesült a feltétel vmelyik indexen akkor leáll és kiírja hogy False
Fel van cserélve a kimenet.
Ek. ha úgy tudom a vectort 0-tól indexeljük, tehát a main-ben i k-tól megy <n-ig, nem pedig k+1-től <=n-ig
Plusz elég pazarló a megoldás, elég lenne egyszer végigmenni a számokon és számontartani hogy hányszor történt vmi (nyerés/vesztés) zsinórban, ill azt hogy épp melyikről van szó, ha váltás van akkor pedig megnézni hogy a neked kellő irányba történt-e, és a számláló >= k -e. Ha igen, végeztünk, ha nem számláló reset.
Én így csinálnám inkább (a te feladatodra):
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
bool elozo(vector<int> v,int i,int k);
int main()
{
vector<int> v;
int n=0;
cout << "n: ";
cin >> n;
cout << endl;
v.resize(n);
for(int i=0; i<n; i++){
cout << "v[" << i << "]: ";
cin >> v[i];
cout << endl;
}
int k=0;
cout << "k: ";
cin >> k;
bool state = false, result = false;
int count = 0;
for (int i = 0; i < n; ++i) {
bool newstate = (v[i] > 0); //nyertunk-e
if (newstate != state) { //valtas
if (newstate && count >= k) { //vart eredmeny
result = true;
break;
}
count = 0;
}
++count;
}
if (result){
cout << "True" << endl;
} else{
cout << "False" << endl;
}
return 0;
}
A mintafeladat pedig nálam úgy néz ki, hogy a "vart eredmeny" sorban !newstate van
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!