日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ACM学习历程—Hihocoder [Offer收割]编程练习赛1

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACM学习历程—Hihocoder [Offer收割]编程练习赛1 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

比賽鏈接:http://hihocoder.com/contest/hihointerview3/problem/1

大概有一個(gè)月沒(méi)怎么打算法了。這一場(chǎng)的前一場(chǎng)BC,也打的不是很好。本來(lái)Div1AB應(yīng)該都能AC的,但是A題由于腦子二筆了一下,最后終測(cè)T掉了。不過(guò)很奇怪,最后分?jǐn)?shù)也沒(méi)有跌,反而漲了,終于要接近紫名了,下一發(fā)不跌的話(huà),應(yīng)該有紫了。然后說(shuō)一下這場(chǎng)Hihocoder吧,據(jù)說(shuō)有offer面試名額,然后選了網(wǎng)易游戲和微軟,雖然很是想去微軟的,但是又二筆了幾發(fā),這就這樣了。。

?

A題:九宮(暴力)

http://hihocoder.com/problemset/problem/1268

題目大意就是問(wèn)原3x3的矩陣能否通過(guò)鏡像或者旋轉(zhuǎn)得到目標(biāo)矩陣。

我是寫(xiě)了一個(gè)原矩陣和其鏡像矩陣,然后分別對(duì)這兩個(gè)矩陣進(jìn)行旋轉(zhuǎn)來(lái)匹配。

當(dāng)然也可以先搞出所有矩陣,然后進(jìn)行匹配。

代碼:

#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <string> #define LL long longusing namespace std;int to1[3][3] = {4, 9, 2,3, 5, 7,8, 1, 6}; int to2[3][3] = {8, 1, 6,3, 5, 7,4, 9, 2}; int a[3][3], ans[3][3];bool judge(int x[3][3]) {for (int i = 0; i < 3; ++i)for (int j = 0; j < 3; ++j)if (a[i][j] != 0 && a[i][j] != x[i][j])return false;return true; }void turn(int x[3][3], int y[3][3]) {y[0][0] = x[0][2];y[1][0] = x[0][1];y[2][0] = x[0][0];y[2][1] = x[1][0];y[2][2] = x[2][0];y[1][2] = x[2][1];y[0][2] = x[2][2];y[0][1] = x[1][2];y[1][1] = x[1][1]; }void input() {for (int i = 0; i < 3; ++i)for (int j = 0; j < 3; ++j)scanf("%d", &a[i][j]); }void work() {int flag = 0, to[3][3];for (int i = 0; i < 4; ++i){turn(to1, to);if (judge(to)){flag++;for (int x = 0; x < 3; ++x)for (int y = 0; y < 3; ++y)ans[x][y] = to[x][y];}for (int x = 0; x < 3; ++x)for (int y = 0; y < 3; ++y)to1[x][y] = to[x][y];}for (int i = 0; i < 4; ++i){turn(to2, to);if (judge(to)){flag++;for (int x = 0; x < 3; ++x)for (int y = 0; y < 3; ++y)ans[x][y] = to[x][y];}for (int x = 0; x < 3; ++x)for (int y = 0; y < 3; ++y)to2[x][y] = to[x][y];}if (flag == 1){for (int x = 0; x < 3; ++x){for (int y = 0; y < 3; ++y){if (y) printf(" ");printf("%d", ans[x][y]);}printf("\n");}}else printf("Too Many\n"); }int main() {//freopen("test.in", "r", stdin); input();work();return 0; } View Code

?

B題:優(yōu)化延遲(二分?&&?優(yōu)先隊(duì)列)

http://hihocoder.com/problemset/problem/1269

這題二分緩沖區(qū)大小,然后對(duì)于每一種通過(guò)優(yōu)先隊(duì)列模擬過(guò)程得到最值。

不過(guò)我一開(kāi)始就想好了用cin來(lái)輸入long?long型的,結(jié)果最后愣是二筆了一發(fā),叫了一發(fā)”%d”。

代碼:

#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <string> #define LL long longusing namespace std;const int maxN = 100005; int n, p[maxN]; LL Q;LL SP(int k) {priority_queue<int> q;int now = 0, t = 1, v;LL ans = 0;while (now < n || !q.empty()){while (q.size() < k && now < n) q.push(p[now++]);v = q.top();q.pop();ans += t*v;t++;if (ans > Q) return Q+1;}return ans; }bool input() {if (!(cin >> n >> Q)) return false;//if (scanf("%d%d", &n, &Q) == EOF) return false;for (int i = 0; i < n; ++i)scanf("%d", &p[i]);return true; }void work() {int lt = 1, rt = n, mid;while (lt+1 < rt){mid = (lt+rt)>>1;if (SP(mid) <= Q) rt = mid;else lt = mid;}if (SP(lt) <= Q) printf("%d\n", lt);else if (SP(rt) <= Q) printf("%d\n", rt);else printf("-1\n"); }int main() {//freopen("test.in", "r", stdin);while (input())work();return 0; } View Code

?

C題:建造基地(動(dòng)態(tài)規(guī)劃)

http://hihocoder.com/problemset/problem/1270

題目就是對(duì)每一層進(jìn)行一個(gè)01背包,然后我二筆的當(dāng)成普通的動(dòng)態(tài)規(guī)劃進(jìn)行分析,然后發(fā)現(xiàn)需要線段樹(shù)優(yōu)化,然后果斷T掉了,然后發(fā)現(xiàn)線段樹(shù)的過(guò)程,只需要一個(gè)角標(biāo)判斷就搞定了。。最好發(fā)現(xiàn)就是個(gè)01背包。。這題做的時(shí)間太長(zhǎng)了,導(dǎo)致最后一題只剩了個(gè)讀題時(shí)間。

代碼:

#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <string> #define LL long longusing namespace std;int n, m, k, t; int a[105], b[105]; LL p[10005];void input() {scanf("%d%d%d%d", &n, &m, &k, &t);for (int i = 0; i < m; ++i) scanf("%d", &a[i]);for (int i = 0; i < m; ++i) scanf("%d", &b[i]); }void work() {LL ans = 0;int f;for (int times = 1; times <= n; ++times){memset(p, -1, sizeof(p));p[0] = 0;for (int i = 0; i < m; ++i){if (b[i] == 0) continue;for (int j = 1; j <= k; ++j){f = max(0, j-b[i]);if (p[j] == -1 || p[j] > p[f]+a[i])p[j] = p[f]+a[i];}}if (p[k] == -1){printf("No Answer\n");return;}ans += p[k];for (int i = 0; i < m; ++i) b[i] /= t;}cout << ans << endl; }int main() {//freopen("test.in", "r", stdin);int T;scanf("%d", &T);for (int times = 1; times <= T; ++times){input();work();}return 0; } View Code

?

D題:艦隊(duì)游戲

http://hihocoder.com/problemset/problem/1271

首先可以得到的是兩個(gè)數(shù)組正序乘正序?大于?正序乘亂序?大于?正序乘逆序。

所以假設(shè)在知道每個(gè)艦船的裝備欄里面裝什么樣的飛機(jī)的情況下。可以確定每一種飛機(jī)的各自歸屬。

于是只需要2^(m*n)暴力每一個(gè)裝備欄的飛機(jī)種類(lèi)。然后就可以計(jì)算題目要求的了。

?

轉(zhuǎn)載于:https://www.cnblogs.com/andyqsmart/p/5269355.html

總結(jié)

以上是生活随笔為你收集整理的ACM学习历程—Hihocoder [Offer收割]编程练习赛1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。