Code:
#include "defs.h"
int HP (int );
int Minimum (int);
int NT (int );
int UCLN (int , int );
int Round (float );
int Fibo (int );
int Count (int );
int calculate(musketeer theMusketeer, int R, int N, int nEvent, int* arrEvent)
{
int nOut = 0;
int HPC, MC, Vd;
int mainresult = HPC+MC+Vd;
if(HPC<=0 || MC<0)
{
mainresult = -1;
return mainresult;
}
// Write your code here.Please!
theMusketeer.HP = theMusketeer.nHealthPoint = HP(theMusketeer.ID);
int Value_Green=0, Value_Red=0, H1, H2, P, Mythril=0, Appear=0, Avatar=0, Titan=0, Loop, Kill_Titan=0, arrRed[EVENT_SIZE], arrBlue[EVENT_SIZE];
for(int t=1; t<=nEvent; t++)
{
switch(arrEvent[t]/100)
{
case 1 : if (theMusketeer.ID == 3)
theMusketeer.nGoldCoin = Minimum(theMusketeer.nGoldCoin+arrEvent[t]%100);
else
{
theMusketeer.nBlueDiamonds++;
arrBlue[theMusketeer.nBlueDiamonds] = arrEvent[t]%100;
}
break;
case 2 : theMusketeer.nRedDiamonds++;
arrRed[theMusketeer.nRedDiamonds] = arrEvent[t]%100;
break;
case 3 :if (theMusketeer.ID == 3)
{
if (R>=3 && theMusketeer.nGoldCoin>2)
{
for (int i=R-1; i>2; i--)
if (NT(i) == 1)
{
P = i;
break;
}
if ((theMusketeer.nHealthPoint+((arrEvent[t]%100)/P)) >= theMusketeer.HP)
{
theMusketeer.nGoldCoin -= (theMusketeer.HP-theMusketeer.nHealthPoint)/P*P;
theMusketeer.nHealthPoint = theMusketeer.HP;
}
else
{
theMusketeer.nHealthPoint += (arrEvent[t]%100)/P;
theMusketeer.nGoldCoin -= (arrEvent[t]%100)/P*P;
}
}
}
else
{
if ((theMusketeer.nHealthPoint+(arrEvent[t]%100)) >= theMusketeer.HP)
{
theMusketeer.nGoldCoin -= (theMusketeer.HP-theMusketeer.nHealthPoint);
theMusketeer.nHealthPoint = theMusketeer.HP;
}
else
{
theMusketeer.nHealthPoint += arrEvent[t]%100;
theMusketeer.nGoldCoin -= arrEvent[t]%100;
}
}
break;
case 4 : H1 = arrEvent[t]%100 * R;
H2 = (theMusketeer.nHealthPoint+H1) % (100+R);
if (Avatar == 0)
Loop = 1;
else
{
Loop = 2;
Avatar = 0;
}
for (int i=0; i<Loop; i++)
{
if (theMusketeer.ID == 2 )
{
if ((NT(H2)==1 && H2>R))
if (Mythril == 1)
theMusketeer.nHealthPoint -= Round((float)(arrEvent[t]%100)*((float)(R+1)/(float)(2*Count(R)+R)));
else
theMusketeer.nHealthPoint -= arrEvent[t]%100;
}
else
if (theMusketeer.ID == 3 && Titan != 0)
Titan--;
else
{
if (theMusketeer.ID==4 && ((Mythril==1&&theMusketeer.nHealthPoint-Round((float)(arrEvent[t]%100)*(((float)R+1)/(2*(float)R)))<1) || theMusketeer.nHealthPoint-arrEvent[t]%100<1))
break;
else
if (theMusketeer.nHealthPoint >= H1)
theMusketeer.nGoldCoin = Minimum(theMusketeer.nGoldCoin + arrEvent[t]%100);
else
{
if (H2==0 || theMusketeer.nHealthPoint<H1)
if (Mythril == 1)
theMusketeer.nHealthPoint -= Round((float)(arrEvent[t]%100)*((float)(R+1)/(float)(2*Count(R)+R)));
else
theMusketeer.nHealthPoint -= arrEvent[t]%100;
}
}
}
break;
case 5 : if (Appear == 0)
{
Appear = 1;
H1 = arrEvent[t]%100 * R;
H2 = (theMusketeer.nHealthPoint+H1) % (100+R);
if (theMusketeer.ID==4 && ((Mythril==1&&theMusketeer.nHealthPoint-Round((float)(arrEvent[t]%100)*(((float)R+1)/(2*(float)R)))<1) || theMusketeer.nHealthPoint-arrEvent[t]%100<1))
break;
else
if (theMusketeer.nHealthPoint>=H1)
{
if (UCLN(theMusketeer.nBlueDiamonds, theMusketeer.nRedDiamonds) == 1)
Mythril = 1;
else
{
if (theMusketeer.ID == 3)
{
theMusketeer.nRedDiamonds++;
arrRed[theMusketeer.nRedDiamonds] = arrEvent[t]%100;
}
else
{
theMusketeer.nBlueDiamonds++;
arrBlue[theMusketeer.nBlueDiamonds] = arrEvent[t]%100;
}
}
}
else
{
theMusketeer.nGoldCoin /= 2;
theMusketeer.nHealthPoint -= arrEvent[t]%100;
}
}
break;
case 6 :if (theMusketeer.nBlueDiamonds >= theMusketeer.nRedDiamonds)
{
if (theMusketeer.nHealthPoint+(arrEvent[t]%100) >= theMusketeer.HP)
theMusketeer.nHealthPoint = theMusketeer.HP;
else
theMusketeer.nHealthPoint += arrEvent[t]%100;
Avatar = 0;
}
else
Avatar = 1;
break;
case 7 : H1 = arrEvent[t]%100 * R;
H2 = (theMusketeer.nHealthPoint+H1) % (100+R);
if (Avatar == 0)
Loop = 1;
else
{
Loop = 2;
Avatar = 0;
}
for (int i=0; i<Loop; i++)
{
if (theMusketeer.ID==4 && ((Mythril==1&&theMusketeer.nHealthPoint-Round((float)(arrEvent[t]%100)*(((float)R+1)/(2*(float)R)))<1) || theMusketeer.nHealthPoint-arrEvent[t]<1))
break;
else
if (theMusketeer.ID == 3)
Titan = 3;
else
if (H2==0 || theMusketeer.nHealthPoint<H1)
if (Mythril == 1)
theMusketeer.nHealthPoint -= Round((float)arrEvent[t]*((float)(R+1)/(float)(2*Count(R)+R)));
else
theMusketeer.nHealthPoint -= arrEvent[t];
else
Kill_Titan++;
}
break;
case 8 : if (theMusketeer.ID == 1)
{
mainresult=-1;
return mainresult;
}
else
{
if (theMusketeer.ID == 2)
theMusketeer.nGoldCoin = 999;
else
if (theMusketeer.nHealthPoint <= 700)
{
Loop = UCLN (arrEvent[t]%10, (arrEvent[t]%100)/10);
if (theMusketeer.ID == 3)
{
for (int i=0; i<Loop; i++)
{
arrRed[theMusketeer.nRedDiamonds] = 0;
theMusketeer.nRedDiamonds--;
}
}
else
{
for (int i=0; i<Loop; i++)
{
arrBlue[theMusketeer.nBlueDiamonds] = 0;
theMusketeer.nBlueDiamonds--;
}
}
}
}
break;
case 9 : if (Fibo(t) == 1)
{
H1 = arrEvent[t]%100 * R;
H2 = (theMusketeer.nHealthPoint+H1) % (100+R);
if (theMusketeer.nHealthPoint >= H1)
{
theMusketeer.nHealthPoint = theMusketeer.HP;
theMusketeer.nGoldCoin = 999;
}
else
{
mainresult=-1;
return mainresult;
}
}
else
{
mainresult=-1;
return mainresult;
}
break;
}
if (theMusketeer.nHealthPoint <= 0 || theMusketeer.nGoldCoin <= 0)
{
mainresult=-1;
return mainresult;
}
if (theMusketeer.nRedDiamonds+theMusketeer.nBlueDiamonds == N || Kill_Titan==3)
{
for (int i=1; i<=theMusketeer.nRedDiamonds; i++) Value_Red += arrRed[i];
for (int i=1; i<=theMusketeer.nBlueDiamonds; i++) Value_Green += arrBlue[i];
mainresult=theMusketeer.nHealthPoint+theMusketeer.nGoldCoin+Value_Red+Value_Green;
return mainresult;
}
}
return nOut;
}
int HP(int id)
{
if (id == 1)
return 999;
if (id == 2)
return 900;
if (id == 3)
return 888;
else
return 777;
}
int Minimum (int a)
{
if (a>999)
return 999;
else
return a;
}
int NT (int n)
{
if (n == 2)
return 1;
for (int i=2; i<n/2; i++)
if (n%i == 0)
return 0;
return 1;
}
int UCLN (int a, int b)
{
while(a != b)
{
if (a > b)
a -= b;
else
b -= a;
}
return a;
}
int Round (float a)
{
if (((int)(a*10))%10 >= 5)
return (int)a+1;
else
return (int)a;
}
int Fibo (int n)
{
int a, b, c=1;
a = b = c;
while (c <= n)
if (c == n)
return 1;
else
{
c = a+b;
a = b;
b = c;
}
return 0;
}
int Count (int n)
{
if (n<10)
return 10;
else
return Count(n/10)*10;
}
Có thể giúp mình bài này đc k, cũng bị lỗi như chủ thread. GV y/cầu là test trên cygwin. Yêu cầu của bài nằm trong file đính kèm.
Mong được các bạn giúp đỡ sớm vì sắp tới hạn nộp rùi 