Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ISNUMERIC(x) (x >= '0' && x <= '9')

#define COMPFUNC

int getInt()
{
	static char num[12];
	int n = 0;
	int c;
	for(c = getchar(); !ISNUMERIC(c); c = getchar());
	num[n++] = c;
	for(c = getchar(); ISNUMERIC(c); c = getchar()){
		num[n++] = (char) c;
	}
	num[n] = 0;
	return atoi(num);
}

typedef struct PotworS{
	int id;
	int dmg;
	int hpBalance;
	int heal;
	struct PotworS *next;
}Potwor;

int compPotwor (const void * a, const void * b)
{
  if ( ((Potwor *)a)->heal <  ((Potwor *)b)->heal ) return  1;
  if ( ((Potwor *)a)->heal >  ((Potwor *)b)->heal ) return -1;
  
  
  if( ((Potwor *)a)->dmg < ((Potwor *)b)->dmg ) return -1;
  return 1;
}

int main(int argc, char **argv)
{
	int nPotwor;
	int hp;
	int totalBalance;
	
	Potwor *potwory;
	Potwor *lastPot;
	Potwor *tmp;
	Potwor rozwiazanie;
	Potwor *rozwEnd;
	
	nPotwor = getInt();
	hp = getInt();
	
	totalBalance = hp;
	
	potwory = new Potwor[nPotwor + 1];
	memset(potwory,0,sizeof(Potwor) * (nPotwor+1));
	lastPot = potwory;
	rozwEnd = &rozwiazanie;
	
	for(int i=1;i<=nPotwor;++i){
		++lastPot;
		lastPot->id = i;
		lastPot->dmg = getInt();
		
		// roznica hp przed i po walce
		lastPot->heal = getInt();
		lastPot->hpBalance = lastPot->heal - lastPot->dmg;
		
		totalBalance += lastPot->hpBalance;
	}

	if(totalBalance < 0){ // Za duze obrazenia, za malo eliksirow :(
		printf("NIE");
	}else{
		// Sortuj�
		lastPot = potwory + 1;
		qsort(lastPot,nPotwor,sizeof(Potwor),compPotwor);
		
		// Tworz� powi�zania listy
		lastPot = potwory;
		lastPot->next = lastPot + 1;
		for(int i=0;i<nPotwor;++i){ ++lastPot; lastPot->next = lastPot + 1; }
		lastPot->next = NULL;
		// Rozwiazuje zadanie
		
		for(int i=0;i<nPotwor;++i){
			lastPot = potwory->next;
			tmp = potwory;
			// Szukam potwora do zabicia
			while(lastPot != NULL && lastPot->dmg >= hp){ tmp = lastPot; lastPot = lastPot->next; }
			if(lastPot == NULL){ // Brak potwora ktorego moge zabic :(
				printf("NIE");
				delete potwory;
				return 0;
			}
			// Zabijam i pije eliksir
			hp += lastPot->hpBalance;
			tmp->next = lastPot->next;
			rozwEnd->next = lastPot;
			rozwEnd = lastPot;
		}
		printf("TAK\n");
		for(Potwor *i=rozwiazanie.next;i != NULL; i = i->next)
			printf((i->next != NULL ? "%d " : "%d"),i->id);
		
		
	}
	delete potwory;
	return 0;
}