Skocz do zawartości

[C++] Zadanie "Śpiew" z VI OIG


Recommended Posts

Stwprzyłem coś takiego:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <string>

using namespace std;

int main()
{
	int iloscOsob;
	scanf("%d", &iloscOsob);
	char stan[1000000];
	scanf("%s", &stan);
	int buffer = 0;
	int out = 0;
	for (int i = 0; i < iloscOsob; i++)
	{
		if (stan[i] == 'Z')
		{
			if (buffer == 2)
			{
				buffer = 0;
				out++;
			}
			else
			{
				buffer++;
			}
		}
		else if (buffer && stan[i] == 'W')
		{
			out++;
			buffer = 0;
		}
	}
	if (buffer)
	{
		out++;
		buffer = 0;
	}
	printf("%i", out);
	printf("\n");
}

jako rozwiązanie zadania:

http://main.edu.pl/pl/archive/oig/6/spi

Niestety:

Informacja o zgłoszeniu
Zadanie: 	  spi/Śpiew
Użytkownik: 	  Chumanista
Rozwiązanie: 	  spi.cpp
Data zgłoszenia:  2013-09-01 18:53:40
Status: 	  OK
Raport

Użytkownik: 	Chumanista
Data: 	        2013-06-13 14:41:39
Wynik: 	        190
Komentarz: 	6th Junior Polish Olympiad in Informatics, Etap I
Zadanie: 	spi/Śpiew
Data: 	        2013-09-01 18:53:51
Wynik: 	        90/100
Pliki: 	        rozwiązanie

 Test 	  Wynik 	        Czas/Limit      Punkty
 0  	  OK              	0.00s/1.00s 	0/0
 1a  	  OK                	0.00s/1.00s 	9/9
 1b  	  OK                 	0.00s/1.00s
 1ocen    OK             	0.00s/1.00s 	0/0
 2  	  OK               	0.00s/1.00s 	9/9
 2ocen    OK 	                0.00s/1.00s 	0/0
 3  	  OK 	                0.00s/1.00s 	9/9
 3ocen    OK 	                0.00s/1.00s 	0/0
 4  	  OK 	                0.00s/1.00s 	9/9
 4ocen    Zła odpowiedź 1 	0.02s/1.00s 	0/0
 5  	  OK 	                0.00s/1.00s 	9/9
 6  	  OK 	                0.00s/1.00s 	9/9
 7  	  OK 	                0.00s/1.00s 	9/9
 8  	  OK 	                0.00s/1.00s 	9/9
 9  	  OK 	                0.00s/1.00s 	9/9
 10  	  OK 	                0.00s/1.00s 	9/9
 11a  	  OK 	                0.01s/1.00s 	0/10
 11b  	  Zła odpowiedź 2 	0.01s/1.00s

1 wiersz 1: wczytano '499968', a oczekiwano '500000'
2 wiersz 1: wczytano '499968', a oczekiwano '500000'


Proszę o pomoc.

Edytowane przez Chumanista
Link to post
Share on other sites

Siema,

to byl moj kod :

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <string>

using namespace std;

int main()
{
    int iloscOsob;
    scanf("%d", &iloscOsob);
    char stan[1200000];
    scanf("%s", &stan);    
    int buffer = 0;
    int out = 0;
    for (int i = 0; i < iloscOsob; i++)
    {
        if (stan[i] == 'Z')
        {
            buffer++;
            if (buffer==3)
            {
                out++;
                buffer=0;
            }
        }
        if (stan[i]== 'W')
        {
            if (buffer)
            {
                out++;
                buffer=0;
            }
        }
    }
    if (buffer)
    {
        out++;
    }
    printf("%i", out);
    printf("\n");
}

tez mial 90/100

po zwiekszeniu rozmiaru tablicy przeszlo na 100/100

 

Pozdrawiam

  • Popieram 1
Link to post
Share on other sites

Kolejne zadanie:

http://main.edu.pl/pl/archive/oig/6/skr

i znowu problemy.

kod:


#include<iostream>

bool contains(int a [], int b, int length)
{
	for (int i = 0; i < length; i++)
		if (a[i] == b)
			return true;
	return false;
}
static inline void sum(int a [], int b [])
{
	for (int i = 0; i < 1000000; i++)
	{
		if (!(contains(a, b[i], 1000000)))
			for (int j = 0; j < 1000000; j++)
				if (a[j] == 0)
				{
					a[j] = b[i];
					break;
				}
	}
		
}
int main()
{
	int iloscSkrzatow, czasDoSnu;
	scanf("%i", &iloscSkrzatow);
	int target = iloscSkrzatow;
	scanf("%i", &czasDoSnu);
	int safe[1000000];
	safe[0] = 1;
	for (int i = 0; i < czasDoSnu; i++)
	{
		int length;
		scanf("%i", &length);
		int unsafe[1000000];
		int safeT[1000000];
		for (int j = 0; j < length; j++)
			scanf("%i", &unsafe[j]);
		for (int k = 0; k < iloscSkrzatow; k++)
			for (int j = 0; j < length; j++)
				if (!(contains(unsafe, j + 1, length)))
					for (int l = 0; l < 1000000; l++)
						if (safeT[l] == 0)
						{
							safeT[l] = j;
							break;
						}
		for (int m = 0; m < 1000000; m++)
			if (safeT[m] != 0 && contains(safe, safeT[m], 1000000))
			{
				sum(safe, safeT);
				break;
			}
			else if (safe[m] == 0)
				break;
		if (contains(safe, target, 1000000))
		{
			printf("%i\n", i);
			return 0;
		}
	}
	printf("%i\n", czasDoSnu);
	return 0;
}

Wyniki:

Informacja o zgłoszeniu
Zadanie: 	skr/Skrzaty
Użytkownik: 	Chumanista
Data zgłoszenia: 	2013-09-03 18:45:16
Status: 	Test przykładowy: zła odpowiedź
Raport

Użytkownik: 	Chumanista
Data: 	2013-09-03 18:00:00
Wynik: 	0
Komentarz: 	6th Junior Polish Olympiad in Informatics, Etap II
Zadanie: 	skr/Skrzaty
Data: 	2013-09-03 18:46:05
Wynik: 	0/100
Pliki: 	rozwiązanie

Test 	Wynik 	                Czas/Limit 	Punkty
 0  	 Zła odpowiedź1 	0.01s/1.00s 	0/0
 0b  	 Zła odpowiedź2 	0.00s/1.00s 	0/0
 0c  	 OK                   	0.08s/1.00s 	0/0
 1a  	 Zła odpowiedź3 	0.01s/1.00s 	0/20
 1b  	 OK 	0.02s/1.00s
 2a  	 Zła odpowiedź4 	0.20s/1.00s 	0/20
 2b  	 Zła odpowiedź5 	0.19s/1.00s
 2c  	 Zła odpowiedź6 	0.54s/1.00s
 2d  	 Zła odpowiedź7 	0.31s/1.00s
 3a  	 Program wywłaszczony 	--/1.00s 	0/20
 3b  	 Program wywłaszczony 	--/1.00s
 3c  	 Program wywłaszczony 	--/1.00s
 3d  	 Program wywłaszczony 	--/1.00s
 3e  	 Zła odpowiedź8 	0.02s/1.00s
 4a  	 Program wywłaszczony 	--/2.00s 	0/20
 4b  	 Program wywłaszczony 	--/1.00s
 4c  	 Program wywłaszczony 	--/1.00s
 4d  	 Program wywłaszczony 	--/1.00s
 4e  	 Program wywłaszczony 	--/6.00s
 4f  	 Program wywłaszczony 	--/2.00s
 4g  	 Program wywłaszczony 	--/2.00s
 4h  	 Program wywłaszczony 	--/1.00s
 4i  	 Program wywłaszczony 	--/1.00s
 4j  	 Program wywłaszczony 	--/3.00s
 4k  	 Program wywłaszczony 	--/2.00s
 5a  	 Program wywłaszczony 	--/4.00s 	0/20
 5b  	 Program wywłaszczony 	--/3.00s
 5c  	 Program wywłaszczony 	--/4.00s
 5d  	 Program wywłaszczony 	--/3.00s
 5e  	 Program wywłaszczony 	--/5.00s
 5f  	 Program wywłaszczony 	--/4.00s
 5g  	 Program wywłaszczony 	--/4.00s
 5h  	 Program wywłaszczony 	--/4.00s
 5i  	 Program wywłaszczony 	--/3.00s
 5j  	 Program wywłaszczony 	--/5.00s
 5k  	 Program wywłaszczony 	--/3.00s
 5l  	 Program wywłaszczony 	--/5.00s

1 wiersz 1: wczytano '0', a oczekiwano '2'
2 wiersz 1: wczytano '2', a oczekiwano '0'
3 wiersz 1: wczytano '0', a oczekiwano '6'
4 wiersz 1: wczytano '30', a oczekiwano '14'
5 wiersz 1: wczytano '38', a oczekiwano '23'
6 wiersz 1: wczytano '54', a oczekiwano '51'
7 wiersz 1: wczytano '60', a oczekiwano '40'
8 wiersz 1: wczytano '10', a oczekiwano '0'

Pomożecie?

Link to post
Share on other sites

W pierwszym wierszu standardowego wejścia znajdują się dwie liczby całkowite http://main.edu.pl/pl/images/OIG6/skr-tex.6.png i http://main.edu.pl/pl/images/OIG6/skr-tex.7.png (http://main.edu.pl/pl/images/OIG6/skr-tex.8.png) oznaczające odpowiednio liczbę skrzatów oraz liczbę godzin pozostałych do czasu, aż Bitol zaśnie. W następnych http://main.edu.pl/pl/images/OIG6/skr-tex.9.png wierszach znajdują się opisy grup stanowisk obserwowanych przez smoka w kolejnych godzinach, po jednym w wierszu. Na opis http://main.edu.pl/pl/images/OIG6/skr-tex.10.png-tej grupy stanowisk składa się liczba całkowita http://main.edu.pl/pl/images/OIG6/skr-tex.11.png (http://main.edu.pl/pl/images/OIG6/skr-tex.12.png) oznaczająca liczbę obserwowanych stanowisk oraz http://main.edu.pl/pl/images/OIG6/skr-tex.13.png uporządkowanych rosnąco liczb całkowitych ze zbioru http://main.edu.pl/pl/images/OIG6/skr-tex.14.png oznaczających numery obserwowanych stanowisk. Wszystkie liczby w wierszu poodzielane są pojedynczymi odstępami.

Możesz założyć, że http://main.edu.pl/pl/images/OIG6/skr-tex.15.png

 

To co zaznaczylem na czerwono nie jestem w stanie pojac i sobie wyobrazic :cry:

Link to post
Share on other sites

Wejście:

 

[liczba skrzatów oraz numer docelowego] [czas do zaśnięcia]

kolejne [czas do zaśnięcia] wierszy ma format:

[ilość liczb w tym wierszu - 1] [numer stanowiska przez które nie można przejść w danej godzinie 1] ... [numer stanowiska przez które nie można przejść w danej godzinie ileśtam]

Link to post
Share on other sites

Dziękuję, śpiew rozwiązałem już damno.

Mój aktualny kod do skrzatów:

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstdlib>

using namespace std;

void inline vadd(vector<bool> &a, vector<bool> &b)
{

}
int main(void)
{
	int iloscSkrzatow, czasDoSnu;
	scanf("%i", &iloscSkrzatow);
	scanf("%i", &czasDoSnu);
	vector<bool> safe;
	safe.resize(iloscSkrzatow, false);
	safe[0] = true;
	for (int i = 0; i < czasDoSnu; i++)
	{
		int length;
		scanf("%i", &length);
		vector<bool> safeT;
		safeT.resize(iloscSkrzatow, true);
		for (int j = 0; j < length; j++)
		{
			int temp;
			scanf("%i", &temp);
			safeT[temp - 1] = false;
		}
		for (unsigned int m = 0; m < iloscSkrzatow; m++)
		{
			if (safe[m] && safeT[m])
			{
				for (unsigned int i = 0; i < iloscSkrzatow; i++)
					safe[i] = safeT[i] || safe[i];
				break;
			}
		}
		if (safe[iloscSkrzatow - 1])
		{
			printf("%i\n", i);
			//system("pause");				//DEBUG
			return 0;
		}
	}
	printf("%i\n", czasDoSnu);
	//system("pause");						//DEBUG
}
Link to post
Share on other sites

Ja to rozumiem tak.

Mamy macierz n*n. I nasz skrzat_1 chce się z pozycji 1*1 dostać do skrzat_2 który znajduje się na pozycji 6*6. Ale może przejść w kroku jedną kratkę na którą nie patrzy smok. Smok zmienia oglądaną przez siebie kratkę co krok.

 

Dobrze to zrozumiałem?

Link to post
Share on other sites

Nie.

Mamy listę 1xn.

Nasz skrzat chce dostać się z 1 do n.

smok w każdej turze ogląda część kratek.

Tu rozwiązanie na 80%:

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stdint.h>

using namespace std;

static inline void setTrue(uint64_t *a, int pos)
{
	a[pos / 64] |= (uint64_t) 1 << (pos % 64);
}
static inline void setFalse(uint64_t *a, int pos)
{
	a[pos / 64] &= ~((uint64_t) 1 << (pos % 64));
}
static inline int getState(uint64_t *a, int pos)
{
	return (a[pos / 64] & (uint64_t)1 << (pos % 64)) >> pos % 64;
}
static inline void getAndSet(uint64_t *get, int pos, uint64_t *set)
{
	set[pos / 64] |= (uint64_t) (get[pos / 64] & (uint64_t) 1 << (pos % 64));
}
int main(void)
{
	int iloscSkrzatow, czasDoSnu;
	scanf("%i", &iloscSkrzatow);
	scanf("%i", &czasDoSnu);
	uint64_t *safe = new uint64_t[iloscSkrzatow / 64 + 1]();
	for (int a = 0; a < iloscSkrzatow / 64 + 1; a++)
	{
		safe[a] = 0;
	}
	setTrue(safe, 0);
	for (int i = 0; i < czasDoSnu; i++)
	{
		int length;
		scanf("%i", &length);
		uint64_t *safeT = new uint64_t[iloscSkrzatow / 64 + 1]();
		for (int b = 0; b < iloscSkrzatow / 64 + 1; b++)
		{
			safeT[b] = 18446744073709551615ll;
		}
		for (int j = 0; j < length; j++)
		{
			int temp;
			scanf("%i", &temp);
			setFalse(safeT, temp - 1);
		}
		for (int m = 0; m < iloscSkrzatow; m++)
		{
			if (getState(safe, m) && getState(safeT, m))
			{
				for (int p = 0; p < iloscSkrzatow / 64 + 1; p++)
					safe[p] |= safeT[p];
				break;
			}
		}
		if (getState(safe, iloscSkrzatow - 1))
		{
			printf("%i\n", i);
			//system("pause");				//DEBUG
			return 0;
		}
	}
	printf("%i\n", czasDoSnu);
	//system("pause");						//DEBUG
}
Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...