Codeforces Round #239 (Div. 1) 解题报告
Problem A Triangle
题意:给你直角三角形的两条直角边问你能不能构造出这个三角形使其任意一条边都不和坐标轴平行。输出三点坐标
思路:固定直角的顶点为原点由于范围最大1000所以直接暴力枚举所有可能点,既满足勾股定理的点。然后逐个验证即可。
代码如下:
1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-03-30 14:45 5 * Filename : Codeforce_239_1_A.cpp 6 * Description : 7 * ************************************************/ 8 9 #include <iostream> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <cmath> 14 #include <algorithm> 15 #include <queue> 16 #include <stack> 17 #include <vector> 18 #include <set> 19 #include <map> 20 #define MP(a, b) make_pair(a, b) 21 #define PB(a) push_back(a) 22 23 using namespace std; 24 typedef long long ll; 25 typedef pair<int, int> pii; 26 typedef pair<unsigned int,unsigned int> puu; 27 typedef pair<int, double> pid; 28 typedef pair<ll, int> pli; 29 typedef pair<int, ll> pil; 30 31 const int INF = 0x3f3f3f3f; 32 const double eps = 1E-6; 33 const int LEN = 1010; 34 int xx[] = {1, 1, -1,-1}; 35 int yy[] = {1,-1, -1, 1}; 36 37 bool is(int a, int b, int c, int d){ 38 return (a*c + b*d == 0 ? true : false); 39 } 40 41 bool solve(pii a, pii b){ 42 int ax, ay, bx, by; 43 for(int i=0; i<4; i++){ 44 int j = (i+1)%4; 45 ax = a.first*xx[i]; 46 ay = a.second*yy[i]; 47 bx = b.first*xx[j]; 48 by = b.second*yy[j]; 49 if(is(ax, ay, bx, by) && bx!=ax && by!=ay){ 50 cout << "YES" << endl; 51 cout << "0 0" << endl; 52 cout << ax << ' ' << ay << endl; 53 cout << bx << ' ' << by << endl; 54 return true; 55 } 56 } 57 return false; 58 } 59 60 int main() 61 { 62 freopen("in.txt", "r", stdin); 63 64 int a, b, ans, ta, tb; 65 pii posa[LEN], posb[LEN]; 66 while(cin >> a >> b){ 67 ans = ta = tb = 0; 68 for(int i=1; i<a; i++){ 69 for(int j=1; j<a; j++){ 70 if(i*i + j*j == a*a) posa[ta++] = MP(i ,j); 71 } 72 } 73 for(int i=1; i<b; i++){ 74 for(int j=1; j<b; j++){ 75 if(i*i + j*j == b*b) posb[tb++] = MP(i ,j); 76 } 77 } 78 int ans = 0; 79 for(int i=0; i<ta; i++){ 80 for(int j=0; j<tb; j++){ 81 if(solve(posa[i], posb[j])) { 82 ans = 1; break; 83 } 84 posa[i] = MP(posa[i].second, posa[i].first); 85 if(solve(posa[i], posb[j])){ 86 ans = 1;break; 87 } 88 posb[j] = MP(posb[j].second, posb[j].first); 89 if(solve(posa[i], posb[j])){ 90 ans = 1;break; 91 } 92 posa[i] = MP(posa[i].second, posa[i].first); 93 if(solve(posa[i], posb[j])){ 94 ans = 1;break; 95 } 96 } 97 if(ans) break; 98 } 99 if(!ans)cout << "NO" << endl; 100 } 101 return 0; 102 }
Problem B Long Path
题意:有一排房间每个房间有两扇门,一扇通往i+1个房间,另一扇通往a[i]个房间,然后他每经过一个房间就做一个标记,只有偶数个标记时他才会走第一扇门。问你他要走多少单位时间。
思路:dp[i]表示到当前房间走到下一房间的花费。这样每次只要先回到a[i]然后再一个个走上来就行了。
代码如下:
1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-03-30 14:45 5 * Filename : Codeforce_239_1_B.cpp 6 * Description : 7 * ************************************************/ 8 9 #include <iostream> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <cmath> 14 #include <algorithm> 15 #include <queue> 16 #include <stack> 17 #include <vector> 18 #include <set> 19 #include <map> 20 #define MP(a, b) make_pair(a, b) 21 #define PB(a) push_back(a) 22 23 using namespace std; 24 typedef long long ll; 25 typedef pair<int, int> pii; 26 typedef pair<unsigned int,unsigned int> puu; 27 typedef pair<int, double> pid; 28 typedef pair<ll, int> pli; 29 typedef pair<int, ll> pil; 30 31 const int INF = 0x3f3f3f3f; 32 const double eps = 1E-6; 33 const int MOD = 1000000007; 34 const int LEN = 1001; 35 int dp[LEN], n, a[LEN]; 36 37 void debug(){ 38 for(int i=0; i<n; i++) cout << dp[i] << ' ';cout << endl; 39 } 40 41 int main() 42 { 43 // freopen("in.txt", "r", stdin); 44 45 while(cin >> n){ 46 for(int i=0; i<n; i++){ 47 cin >> a[i];a[i]--; 48 } 49 int ans = 0; 50 for(int i=0; i<n; i++) dp[i] = 0; 51 for(int i=0; i<n; i++){ 52 int pos = a[i]; 53 do{ 54 dp[i] = (dp[i] + dp[pos]) % MOD; 55 if(pos != i) pos ++; 56 }while(pos != i); 57 dp[i] = (dp[i] + 2) % MOD; 58 } 59 for(int i=0; i<n; i++) ans = (ans+dp[i])%MOD; 60 cout << ans << endl; 61 } 62 return 0; 63 }
奔跑吧!少年!趁着你还年轻