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

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

生活随笔

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

编程问答

阿里云 超级码力在线编程大赛初赛 第1场(第245名)

發(fā)布時(shí)間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里云 超级码力在线编程大赛初赛 第1场(第245名) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 比賽結(jié)果
    • 2. 題目
      • 1. 樹(shù)木規(guī)劃
      • 2. 正三角形拼接
      • 3. 大樓間穿梭
      • 4. 對(duì)稱前后綴

1. 比賽結(jié)果

通過(guò)了 3 題,第245名,進(jìn)入復(fù)賽了,收獲 T恤 一件,哈哈。

2. 題目

1. 樹(shù)木規(guī)劃

題目鏈接

描述

在一條直的馬路上,有 n 棵樹(shù),每棵樹(shù)有一個(gè)坐標(biāo),代表它們距離馬路起點(diǎn)的距離。 如果每相鄰的兩棵樹(shù)之間的間隔不小于 d,那么我們認(rèn)為這些樹(shù)是美觀的。 請(qǐng)計(jì)算出最少移除多少棵樹(shù),可以讓這些樹(shù)變得美觀。

樹(shù)木的棵樹(shù)為 n,1 <= n <= 10^5。 樹(shù)木的坐標(biāo)用 trees 表示,0 <= trees[i] <= 10^9。 最小美觀間隔為 d,1 <= d <= 10^9。 保證輸入的坐標(biāo)是排好序的,且兩兩不相同。

說(shuō)明

樣例中,將位置 2 和 6 的樹(shù)木移走,剩下 [1, 3, 5] ,它們是美觀的。

示例 輸入: [1,2,3,5,6] 2 輸出: 2

解題:

  • 直接遍歷,不滿足的移除
class Solution { public:/*** @param trees: the positions of trees.* @param d: the minimum beautiful interval.* @return: the minimum number of trees to remove to make trees beautiful.*/int treePlanning(vector<int> &trees, int d) {// write your code here.int prev = trees[0], s = 0;for(int i = 1; i < trees.size(); ++i){if(trees[i]-prev < d)//不滿足{s++;//移除}else{prev = trees[i];}}return s;} };

2. 正三角形拼接

題目鏈接

描述

給出 n 根木棍,每次切割可以將1根木棍切成 2 段。請(qǐng)計(jì)算出最少切割幾次,可以從所有木棍中選出 3 根,組成一個(gè)三角形。

一開(kāi)始的木棍根數(shù)為 n,3 ≤ n ≤ 1000。所有木棍的長(zhǎng)度為一個(gè)整型數(shù)組 lengths,1 < length_i ≤ 10^9。
切割必須要將木棍分成 2 根整數(shù)長(zhǎng)度的木棍,而且總長(zhǎng)度要和原木棍相等。

說(shuō)明

可以從長(zhǎng)為7的木棍中,切出2根長(zhǎng)為3的木棍,那么木棍的長(zhǎng)度應(yīng)該為[2,3,1,3,3,5],可以拼出邊長(zhǎng)為3的正三角形。

示例 輸入: [2375] 輸出: 2

解題:

class Solution { public:/*** @param lengths: the lengths of sticks at the beginning.* @return: return the minimum number of cuts.*/int makeEquilateralTriangle(vector<int> &lengths) {// write your code here.map<int, int> m;int cut = 2;//最多切兩次for(int i = 0; i < lengths.size(); i++) m[lengths[i]]++;//長(zhǎng)度計(jì)數(shù)for(auto& mi : m){if(mi.second == 2)//有2段了{if(m.lower_bound(mi.first+1) != m.end())cut = min(cut, 1);//有更長(zhǎng)的,切1次}else if(mi.second >= 3)//有3段了,不用切return 0;if(mi.first%2==0 && m.count(mi.first/2))cut = min(cut, 1);//如果能被平均切開(kāi),且有1段一樣的,切1次就可以}return cut;} };

3. 大樓間穿梭

題目鏈接

描述

蜘蛛俠在大樓間穿梭。大樓的高度可以看作是一個(gè)從左到右排列的數(shù)組。
現(xiàn)在蜘蛛俠站在第一棟大樓上,他想跳到最后一棟上。

  • 蜘蛛俠的視野為 k,他可以花費(fèi) x 點(diǎn)體力,用蛛絲移動(dòng)到右側(cè)k幢建筑中第一棟比當(dāng)前位置高的大樓(應(yīng)該是 高或者相同高度,題目有問(wèn)題)。
  • 或者蜘蛛俠可以花費(fèi) y 點(diǎn)體力,跳躍到右側(cè)接下來(lái)兩棟大樓其中一棟。

請(qǐng)計(jì)算蜘蛛俠最少花費(fèi)多少體力,到達(dá)最后一棟上。

大樓的高度為數(shù)組 heights,一共有 n 棟大樓,2 ≤ n ≤ 10^5,1 <= heights_i ≤ 10^9.蜘蛛俠的視野為 k,1 ≤ k ≤ n。兩種行動(dòng)的體力花費(fèi)滿足 1 ≤ x,y ≤ 10^9。

說(shuō)明
樣例中,先花費(fèi)6點(diǎn)體力跳到第三棟建筑,再花費(fèi)10點(diǎn)到達(dá)最后一棟。

示例 輸入: heights=[154335] k=3 x=10 y=6 輸出: 16

解題:

  • 單調(diào)棧算出右側(cè)高度 >= 當(dāng)前的 第一個(gè)位置(逆序遍歷)
  • 然后簡(jiǎn)單的動(dòng)態(tài)規(guī)劃即可
class Solution { public:/*** @param heights: the heights of buildings.* @param k: the vision.* @param x: the energy to spend of the first action.* @param y: the energy to spend of the second action.* @return: the minimal energy to spend.*/long long shuttleInBuildings(vector<int> &heights, int k, int x, int y) {// write your code here.int n = heights.size(), i, j, K;stack<int> s;vector<int> rightTall(n, -1);//右側(cè)高或者相等的第一個(gè)位置for(int i = n-1; i >= 0; i--) //單調(diào)棧{while(!s.empty() && heights[s.top()] < heights[i])//右側(cè)比我小的,沒(méi)有用s.pop();if(!s.empty() && s.top()-i <= k)//有大于等于我的,且距離在 k 以內(nèi)rightTall[i] = s.top();//記錄下來(lái)s.push(i);}vector<long long> dp(n, LONG_LONG_MAX);dp[0] = 0;for(int i = 0; i < n; i++) // DP{if(dp[i] == LONG_LONG_MAX)continue;if(i+1 < n && dp[i+1] > dp[i]+y)//右側(cè)1dp[i+1] = dp[i]+y;if(i+2 < n && dp[i+2] > dp[i]+y)//右側(cè)2dp[i+2] = dp[i]+y;if(rightTall[i] != -1 && dp[rightTall[i]] > dp[i]+x)dp[rightTall[i]] = dp[i]+x;//直接跳到 k 以內(nèi)的 第一個(gè) >= 我的位置}return dp[n-1];} };

4. 對(duì)稱前后綴

題目鏈接

描述

給定一個(gè)字符串 s。我們令一個(gè)字符串的權(quán)值為一個(gè)字符串的最長(zhǎng)對(duì)稱前后綴長(zhǎng)度。
請(qǐng)求出 s 的所有子串權(quán)值的總和
例如,”abcxyzcba” 的最長(zhǎng)對(duì)稱前后綴的長(zhǎng)度為3,因?yàn)椤癮bc”和“cba”對(duì)稱。
字符串的長(zhǎng)度為 n,1 ≤ n ≤ 3*10^3。字符串均由小寫(xiě)英文字符組成。

說(shuō)明

樣例中,單個(gè)字符的子串的權(quán)值為1,它們的和為 7。
另外的權(quán)值為:
"bacb"->1,
"bacbdab"->2,
"bdab"->1,
"acbda'->1,

所以權(quán)值和為12。

示例 輸入: "bacbdab 輸出: 12

解題:

  • 區(qū)間DP
class Solution { public:/*** @param s: a string.* @return: return the values of all the intervals.*/long long suffixQuery(string &s) {// write your code herelong long n = s.size(), ans = n;//區(qū)間DP,dp[i][j] 表示區(qū)間內(nèi)的 子串的最大權(quán)值vector<vector<int>> dp(n, vector<int>(n, 0));for(int i = 0; i < n; i++)dp[i][i] = 1;for(int len = 1, i; len < n; len++){for(i = 0; i+len < n; i++){if(s[i] == s[i+len])//子串首尾相同{int length = len-1;//除去首尾 里面的子串[i+1, i+len-1]的長(zhǎng)度if(dp[i+1][i+len-1] == length)// 里面正反序都相同dp[i][i+len] = dp[i+1][i+len-1]+2;//把兩個(gè)端點(diǎn)都可以加上elsedp[i][i+len] = dp[i+1][i+len-1]+1;//只能加上1端}ans += dp[i][i+len];}}return ans;} };

我的CSDN博客地址 https://michael.blog.csdn.net/

長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!

總結(jié)

以上是生活随笔為你收集整理的阿里云 超级码力在线编程大赛初赛 第1场(第245名)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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