SRM 440(1-250pt, 1-500pt)

DIV1 250pt

题意:小球从一段折线斜坡上滚下来,告诉所用时间,求重力加速度。

解法:二分答案模拟即可。

tag:二分,simulation

  1 // BEGIN CUT HERE
  2 /*
  3  * Author:  plum rain
  4  * score :
  5  */
  6 /*
  7 
  8  */
  9 // END CUT HERE
 10 #line 11 "IncredibleMachine.cpp"
 11 #include <sstream>
 12 #include <stdexcept>
 13 #include <functional>
 14 #include <iomanip>
 15 #include <numeric>
 16 #include <fstream>
 17 #include <cctype>
 18 #include <iostream>
 19 #include <cstdio>
 20 #include <vector>
 21 #include <cstring>
 22 #include <cmath>
 23 #include <algorithm>
 24 #include <cstdlib>
 25 #include <set>
 26 #include <queue>
 27 #include <bitset>
 28 #include <list>
 29 #include <string>
 30 #include <utility>
 31 #include <map>
 32 #include <ctime>
 33 #include <stack>
 34 
 35 using namespace std;
 36 
 37 #define clr0(x) memset(x, 0, sizeof(x))
 38 #define clr1(x) memset(x, -1, sizeof(x))
 39 #define pb push_back
 40 #define sz(v) ((int)(v).size())
 41 #define all(t) t.begin(),t.end()
 42 #define zero(x) (((x)>0?(x):-(x))<eps)
 43 #define out(x) cout<<#x<<":"<<(x)<<endl
 44 #define tst(a) cout<<a<<" "
 45 #define tst1(a) cout<<#a<<endl
 46 #define CINBEQUICKER std::ios::sync_with_stdio(false)
 47 
 48 typedef vector<int> vi;
 49 typedef vector<string> vs;
 50 typedef vector<double> vd;
 51 typedef pair<int, int> pii;
 52 typedef long long int64;
 53 
 54 const double eps = 1e-8;
 55 const double PI = atan(1.0)*4;
 56 const int inf = 2139062143 / 2;
 57 
 58 class IncredibleMachine
 59 {
 60     public:
 61         vi x, y;
 62         double gao(double g)
 63         {
 64             int n = sz(x);
 65             double v = 0, sum = 0;
 66             for (int i = 0; i < n-1; ++ i){
 67                 double d = sqrt((y[i]-y[i+1])*(y[i]-y[i+1]) + (x[i]-x[i+1])*(x[i]-x[i+1]));
 68                 double a = g * (y[i] - y[i+1]) / d;
 69                 double t = (-v + sqrt(v*v+2*a*d)) / a;
 70                 sum += t; v += a*t;
 71             }
 72             return sum;
 73         }
 74         
 75         double gravitationalAcceleration(vector <int> X, vector <int> Y, int T){
 76             x = X; y = Y;
 77             int cnt = 0;
 78             double l = 0, r = inf;
 79             while (cnt <= 1000){
 80                 double mid = (l + r) / 2;
 81                 if (gao(mid) < T) r = mid;
 82                 else l = mid;
 83                 ++ cnt;
 84             }
 85             return l;
 86         }
 87         
 88 // BEGIN CUT HERE
 89     public:
 90     void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); }
 91     private:
 92     template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '"' << *iter << "","; os << " }"; return os.str(); }
 93     void verify_case(int Case, const double &Expected, const double &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "	Expected: "" << Expected << '"' << endl; cerr << "	Received: "" << Received << '"' << endl; } }
 94     void test_case_0() { int Arr0[] = {0,6}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {100,22}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 4; double Arg3 = 9.807692307692307; verify_case(0, Arg3, gravitationalAcceleration(Arg0, Arg1, Arg2)); }
 95     void test_case_1() { int Arr0[] = {0,26,100}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {50,26,24}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 4; double Arg3 = 26.743031720603582; verify_case(1, Arg3, gravitationalAcceleration(Arg0, Arg1, Arg2)); }
 96     void test_case_2() { int Arr0[] = {0,7,8}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {10,6,0}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 7; double Arg3 = 1.1076837407708007; verify_case(2, Arg3, gravitationalAcceleration(Arg0, Arg1, Arg2)); }
 97 
 98 // END CUT HERE
 99 
100 };
101 
102 // BEGIN CUT HERE
103 int main()
104 {
105 //    freopen( "a.out" , "w" , stdout );    
106     IncredibleMachine ___test;
107     ___test.run_test(-1);
108        return 0;
109 }
110 // END CUT HERE
View Code

DIV1 500pt

裸的高斯消元求解概率dp。。。。。。

原文地址:https://www.cnblogs.com/plumrain/p/srm_440.html