#include #define MAX_P 100 int coins[MAX_P]; /*toto jsou "jistoty" pirátů*/ int unsure_thing[MAX_P];/*zda má pirát naději na víc než na "jistotu"*/ int freqs[3];/*kolik pirátů s jistotami -1,0,1 existuje*/ int S,P; int main(void) { int i,j,paid; /*paid -- tolik musí Dlouhoprst platit*/ int needed,have; /*kolik potřebuji a mám pro mě hlasujících pirátů*/ int whom_to_pay; /*kterým pirátům platím*/ int not_paid_to;/*kolika pirátům chtějícím whom_to_pay jsem neplatil*/ printf("Zadejte počet Pirátů a Stříbrňáků:"); scanf("%d %d",&P,&S); if (S >= (2*((P+1)/2) - 1)) { /*S je dostatečné -- známe řešení*/ switch (P) { case 0:printf("Nesmysl, žádný pirát neexistuje.\n");break; case 1:printf("Dlouhoprst zemře.\n");break; case 2:printf("Návrh je nedat nikomu nic, zisk je %d.\n",S);break; case 3:printf("Návrh je dát prvním dvěma pirátům 1 stříbrňák, zisk je %d.\n",S-2);break; default:printf("Návrh je dát prvním %d pirátům dva stříbrňáky," "pirátovi %d jeden a ostatním nic. Zisk je %d.\n",(P+1)/2-1,P-1,S-2*((P+1)/2)+1); } return 0; } for (i=0;i<=P;i++) { /*S je malé -- simuluj*/ needed=(i+1)/2; have=paid=0; whom_to_pay=-1; while (whom_to_pay<2) { if (have+freqs[whom_to_pay+1]>=needed) { paid+=(needed-have)*(whom_to_pay+1); not_paid_to=have+freqs[whom_to_pay+1]-needed; break; } have+=freqs[whom_to_pay+1]; paid+=freqs[whom_to_pay+1]*(whom_to_pay+1); whom_to_pay++; } if (paid > S) whom_to_pay=2; /*nemám na to dost peněz */ if (whom_to_pay<2) {/*šlo to uplatit*/ for (j=0;jwhom_to_pay) coins[j]=unsure_thing[j]=0; else if (!(coins[j]==whom_to_pay && not_paid_to)) coins[j]++,unsure_thing[j]=0; else unsure_thing[j]=1; if (coins[j]<2) freqs[coins[j]+1]++; } coins[i]=S-paid; } else {/*nešlo to uplatit*/ coins[i]=-1; } if (coins[i]<2) freqs[coins[i]+1]++; } if (coins[P]==-1) puts("Dlouhoprst přežít nemůže."); else { printf("Dlouhoprst přežít může a vydělá si %d stříbrňáků.\nNávr je tento:",S-paid); not_paid_to=needed-have; for (i=0;i0)? (not_paid_to--,coins[i]+1) : (unsure_thing[i])?0:coins[i]); } return 0;}