牛客集訓營第五場補題
阿新 • • 發佈:2019-02-05
n) print std sync 坐標 直接 adding 做了 space
題目鏈接:
題號 | 標題 | 已通過代碼 |
A | 炫酷雙截棍 | 點擊查看 |
B | 炫酷五子棋 | 點擊查看 |
C | 炫酷迷宮 | 點擊查看 |
D | 炫酷路途 | 點擊查看 |
E | 炫酷劃線 | 點擊查看 |
F | 炫酷回文 | 點擊查看 |
G | 炫酷數字 | 點擊查看 |
H | 炫酷雪花 | 點擊查看 |
I | 炫酷鏡子 | 點擊查看 |
J | 炫酷數學 | 點擊查看 |
A:
使用double高精度,坐標系內兩點之間距離 sqrt(pow(x1-x2),pow(y1-y2))
判斷目標點和 l1+l2 的關系,大的話,結果就是 sqrt(x*x + y*y) - l1 - l2
判斷目標點和 l1-l2 的關系,小的話,結果就是 abs(l1 - l2) - sqrt(x*x + y*y)
目標點在範圍內就輸出0.00000000
#include<bits/stdc++.h> using namespace std; int main() { int t; double l1, l2, x, y,len; scanf("%lf%lf%d", &l1, &l2, &t); getchar(); while (t--) { cin >> x >> y; if (sqrt(x*x + y*y) > l1 + l2) { printf("%.8f\n",sqrt(x*x + y*y) - l1 - l2 ); } else if (sqrt(x*x + y*y) < abs(l1 - l2)) { printf("%.8f\n", abs(l1 - l2) - sqrt(x*x + y*y)); } else printf("0.00000000\n"); } return 0; }
D:
先把2^n次方 存在a數組,然後比較2^n走法,傳送走法+2^n走法,那個小就取那個
#include <iostream> #include<algorithm> using namespace std; #define ll long long ll a[50]; ll find(ll u, ll v) {//就是2^n次方走 ll sum = 0; while (u<v) { for (int i = 30; i >= 0; i--) {//貪心 if (u + a[i] <= v) { u += a[i]; sum++; break; } } } return sum; } int main() { a[0] = 1; for (int i = 1; i <= 30; i++) {//1024是10次方 所以1e9約等於30次方 a[i] = a[i - 1] << 1; } ll n, k; cin >> n >> k; ll ans; ans = find(1, n); for (int i = 0; i < k; i++) { int u, v; cin >> u >> v; if (u>v) swap(u, v); if (u == v) continue; // cout << ans << " " << find(1, u) + 1 + find(v, n) << endl; ans = min(ans, find(1, u) + 1 + find(v, n));//min(2^n走法,傳送走法+2^n走法) } cout << ans << endl; return 0; }
G:
註釋都寫在代碼裏了 直接看代碼
/********************************************************* #代碼作者:一屆書生 #題目大意: 求含有n個因子的最小正整數 #描述說明:每個數的因子肯定小於它,所以可以從1~max, 把所有的數的因子個數求出來 然後找因子個數的最小值 *********************************************************/ #include<iostream> using namespace std; int yin[1000005];//yin[i]代表的是i的因子個數 int ans[1000005];//ans[i]代表含有i個因子個數的值 void shai() { for (int i = 1; i < 1000004; i++) //i代表因子個數 { for (int j = i; j < 1000004; j += i) //j是i倍數 不斷給1~1000000添加每個數的因子 { yin[j]++;//是i的倍數的數 因子個數都加1 } if (ans[yin[i]]) //如果ans[i]不為零了,那麽說明這個數不是因子個數為i的情況下的最小值 continue; else//如果這個數之前沒有被賦值 說明是最小的 ans[yin[i]] = i; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);//輸入很多的時候 關閉流同步 shai(); int t, n; cin >> t; while (t--) { cin >> n; if (ans[n]) cout << ans[n] << "\n"; else cout << -1 << "\n"; } return 0; }
I:
寫的比較亂,剛開始想簡單了,這算是我第一次寫dfs了,紀念一下,第一次只寫了向下,然後測試樣例發現不對,又想到了還需要判斷光線方向,就在dfs裏加一個變量h代表方向
#include<bits/stdc++.h> using namespace std; int n, m,flag; char a[510][510]; void dfs(int x,int y,int k,int h) //x,y代表坐標 ,k代表是否出界,h代表方向 //上下左右 1234 { if (k==0) { return; } if ((y>m)||y == 0||x==0) { cout << -1 << "\n"; k = 0; return; } if (x > n) { cout << y << "\n"; return; } else { if (a[x][y] == ‘.‘&&h == 2) //下 dfs(x + 1, y, 1, 2); else if (a[x][y] == ‘/‘&&h == 2) dfs(x, y - 1, 1, 3); else if ((a[x][y] == 92) && h == 2) dfs(x, y + 1, 1, 4); else if (a[x][y] == ‘.‘&&h == 1) //上 dfs(x - 1, y, 1, 1); else if (a[x][y] == ‘/‘&&h == 1) dfs(x, y + 1, 1, 4); else if (a[x][y] == 92 && h == 1) dfs(x, y - 1, 1, 3); else if (a[x][y] == ‘.‘&&h == 3) //左 dfs(x, y - 1, 1, 3); else if (a[x][y] == ‘/‘&&h == 3) dfs(x + 1, y, 1, 2); else if (a[x][y] == 92 && h == 3) dfs(x - 1, y, 1, 1); else if (a[x][y] == ‘.‘&&h == 4) //右 dfs(x, y + 1, 1, 4); else if (a[x][y] == ‘/‘&&h == 4) dfs(x - 1, y, 1, 1); else if (a[x][y] == 92 && h == 4) dfs(x + 1, y, 1, 2); } } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) cin >> a[i][j]; } for (int i = 1; i <=m; i++) { dfs(1,i,1,2); } return 0; }
J:
剛開始想復雜了,又是求排列,又是求組合,做了一個半小時,頭都炸了,後來放棄了,做完i題又回來看了看,發現ac的人六百多,肯定沒我想的那麽復雜啊,又回頭看了看,其實就是3^m,快速冪模版套上,a了。
#include<bits/stdc++.h> using namespace std; #define mod 998244353 #define ll long long ll qmi(ll a, ll b, ll p) { ll res = 1; while (b) { if (b & 1) res = (res * a) % p; a = (a * a) % p; b = b >> 1; } return res; } int main() { ll m, ans, x = 2; while (cin >> m) { ans = qmi(3, m, mod); cout << ans << endl; } return 0; }
牛客集訓營第五場補題