#include #include #include #include #include using namespace std; #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define memo(a,v) memset(a,v,sizeof(a)) #define pb push_back #define all(a) a.begin(),a.end() #define eps (1e-9) #define inf 1000 #define i64 long long #define u64 unsigned i64 #define FOR(k,a,b) for(int k(a); k < (b); ++k) int board[20] = {20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5}; int dp1[505],dp2[505],dp3[505]; pair convert(double radius, double angle) { static const double PI = acos(0.0)*2; double y = -1 * radius * cos(angle*PI/180); double x = radius * sin(angle*PI/180); return make_pair(x,y); } pair getGuess(int mult, int score) { double angle = 0; double rad = 0; if(score == 25 && mult == 2){} else if(score == 25) { rad = 12.7/340 + 31.8/340; rad = 12.7/340 + 31.8/340; rad /=2; } else if (mult == 3) { rad = 103.0/170; } else if(mult == 2) { rad = 166.0/170; } if(score<25) { for(int i=0;i<20;i++){ if(board[i]==score) { break; } else { angle += 18; } } } return convert(rad,angle); } void precal(){ int i,j,k,score; for(i = 1;i<=501;i++) dp1[i] = inf; dp1[0] = 0; for(i = 2;i<=501;i++){ // score for(j = 1;j<=20;j++){ // board score for(k = 1;k<=3;k++){ // multiplier score = j*k; int r = i - score; if(score+1dp1[r]+1 || (dp1[i]==dp1[r]+1 && k == 1)){ dp1[i] = dp1[r] + 1; dp2[i] = j; dp3[i] = k; } else if(dp1[i]>1 && i == score && k == 2 ){ dp1[i] = 1; dp2[i] = j; dp3[i] = k; } } } } for(k = 1;k<3;k++){ // multiplier score = 25*k; int r = i - score; if(score+1=dp1[r]+1){ dp1[i] = dp1[r] + 1; dp2[i] = 25; dp3[i] = k; } else if(dp1[i]>1 && i == score && k == 2 ){ dp1[i] = 1; dp2[i] = 25; dp3[i] = k; } } } } } double getRand(){ double ret = rand() % 1200; if(rand() % 2) ret = -1; return ret / 1000.0; } int main(){ precal(); int i,m,s,score,currScore,turn,total = 0,remScore; int n = 100000; pair p; printf("%d\n",n); fflush(stdout); while(n--){ double a = getRand(); double b = getRand(); if(a*a + b*b >=1.2*1.2){ n++; continue; } printf("%lf %lf\n",a,b); fflush(stdout); scanf("%lf %lf %d %d",&a,&b,&m,&s); assert(m>=1 && m<=3); for(i = 0;i<20;i++){ if(s == board[i]) break; } assert(i < 20 || s == 25 || s==0); } n = 99999; turn = 3; currScore = 0; score= 501; while(n>0){ remScore = score - currScore; p = getGuess(dp3[remScore],dp2[remScore]); printf("%lf %lf\n",p.first,p.second); fflush(stdout); double a, b; scanf("%lf %lf %d %d",&a,&b,&m,&s); assert(m>=1 && m<=3); for(i = 0;i<20;i++){ if(s == board[i]) break; } assert(i < 20 || s == 25 || s == 0); turn--; n--; currScore+= m*s; if(score==currScore && m == 2){ score = 501; currScore = 0; turn = 3; } else if(score<=currScore+1){ n-= turn; turn = 3; currScore = 0; } if(turn == 0){ turn = 3; score -= currScore; currScore = 0; } total+= score; } fprintf(stderr,"%d\n",total); return 0; }