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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

校内训练赛题解第三篇

發布時間:2025/3/19 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 校内训练赛题解第三篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

校內訓練賽題解

  • 人氣估值
    • 解題思路
  • 腦力訓練計劃 (模擬 + 字符串)
    • 解題思路
  • 大暑賽期(貪心 + 思維)

人氣估值

題目描述
你是某動畫制作公司的企劃部長。如今動畫制作公司制作的東西,已經不僅僅局限于動畫本身。相關商品,例如登場人物的手辦和人物歌曲CD等,也是重要的收益來源。這個收益能提高到什么程度,完全取決于作為企劃部長的你。
這是理所當然的,但這些相關產品并不是隨便推出就可以的。因為開發商品需要大量的時間和預算。即使要發售動畫中登場人物的手辦,也必須限定于銷售額高、人氣高的人物。
衡量角色人氣度的手段之一,就是人氣投票。到目前為止,你也策劃了幾場人氣投票,看來觀眾已經逐漸對這個策劃不滿了。當務之急是建立其他衡量受歡迎程度的方法。
所以你提出了一個假設。一個角色的受歡迎程度,與其在動畫正編中的登場時間的總和成正比。為了驗證這個假設,你決定編寫一個程序來統計每個角色的出場時間。

輸入
輸入由多個情況組成。每個情況以以下格式給出。

n
name0 m0 d0,0 … d0,m0-1
name1 m1 d1,0 … d1,m1-1
.
.
.
namen-1 mn-1 dn-1,0 … dn-1,mn-1-1
n表示角色的人數。name
i
?
表示角色的名字。
m
i
?
表示人物出現的時間次數。m
i
?
后面是m
i
?
個整數d
i,j
?

d
i,j
?
表示人物出現的時間。

輸入的結尾由n=0的行給出

如果在某一時刻只有一個角色出現在屏幕上,則該角色可以獲得n點。
在同一時間出現的角色每增加一個,在該時間出現的角色所獲得的點數減少1。
如果有n個角色在同一時間出現,則n個角色分別加1分。
輸入滿足以下條件。
2≤n≤20
0≤m
i
?
≤30
0≤d
i,j
?
<30
第i個字符的d
i,j
?
都不一樣。
name
i
?
只包含大寫或小寫字母,長度不超過10。(小于等于10)

輸出
把點數最小的角色的點數和那個名字用一個空白隔開輸出。
如果有多個角色的點數最小,名字按字典順序選擇最小的人。

解題思路

看清題目。。。。 這題思路很簡單,我們用一個map數組記錄一下每一個數字出現的次數。那么對于第i個人我們在計算第j天的時候就加上 n - cd[a[j]] + 1 即可

代碼:

#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> using namespace std; const int N = 110;int n ; struct node {string name;int a[N], cnt;int pot;bool operator < (const node &w)const {if (pot == w.pot)return name < w.name;return pot < w.pot;} };int main() {while (cin >> n, n) {map<int, int>cd;node p[N];for (int i = 1 ; i <= n ; ++i) {cin >> p[i].name >> p[i].cnt;for (int j = 0 ; j < p[i].cnt; ++j) {cin >> p[i].a[j];cd[p[i].a[j]]++;}}for (int i = 1 ; i <= n ; ++i) {int c = 0 ;for (int j = 0 ; j < p[i].cnt ; ++j) {int x = n - cd[p[i].a[j]];c += ++x;}p[i].pot = c;}sort(p + 1, p + 1 + n);cout << p[1].pot << ' ' << p[1].name << endl;}return 0; }

腦力訓練計劃 (模擬 + 字符串)

題面
她很煩惱。成績不好。雖然她勉強要求父母讓自己上了全寄宿制學校,但她的才華卻絲毫沒有綻放。也許他本來就沒有天賦,但這是她盡可能不愿意去想的可能。
于是,她依賴在網上找到的詭異腦力訓練教材。訓練教材上說,通過用手解決類似補充可能性問題的實例,計算力得到提高,進而邏輯性思考力、直覺力、想象力也變得豐富,社團活動也活躍起來,戀愛也順利進行。這誘惑著她學習這個教材。
根據教材描述,必須對加法范式表示的邏輯表達式的各個變量進行適當分配,判斷邏輯表達式的值是否可以為真。順便提一下,一個以上的變量(或者,其否定)的邏輯積稱為從句(clause),只有幾個從句的邏輯和表示的邏輯表達式遵循加法標準形式。一般說到補充可能性問題,邏輯表達式用乘法標準形來表示,但要注意,訓練計劃是加法標準形態。
她想研究一下訓練計劃的問題集,然后突然改變了主意。與其花錢買一本習題,不如請一個擅長編程的好朋友吃一頓凍糕,讓他生成訓練計劃問題,并編寫一個解決問題的程序。這樣豈不是就可以得到很多問題和答案了嗎。就這樣,作為她最好的朋友,請你寫一個解決訓練計劃的程序。

輸入
輸入由多個數據組成。每個情況以以下格式給出。

表達式字符串
輸入的結尾由“#”組成的行給出
表達式遵循以下規則:

::= “(”")" | “(”")|("")"
::= “&”"&"
::= | “~”
::= [a-z]|[A-z]
(在這里,字符串文本用雙引號括了起來。實際輸入不包含雙引號。)
此外,輸入中沒有多余的空格。
注意,從句由三個字面量組成。
表達式的長度不得超過500個字符。
測試用例的數量不超過1100個。

輸出
如果存在使給定表達式的值為真的變量分配,則輸出yes,否則輸出no。

解題思路

  • 難點一: 讀入的問題: 判斷結束每一個數據的標志,我們用pre記錄當前字符的前一個字符。如果前一個字符是)而當前字符不是|就表明到了數據的結尾,那么就應該輸出一個結果出來。
  • 難點二:判斷表達式。由于是或運算,因此我們記錄在所有的子表達式中(括號中)如果能會真那么整個結果就可以為真。那么什么時候子表達式不能會真呢?就是對于同一個字符它的否和它本身同時存在。(因為括號內是與運算)有一個為假就肯定會假。因此我們在一個子表達式結束的時候(字符為))的時候,看如果沒有上面說的情況說明至少有一個為真,那么就滿足條件了。那么如何實現呢?
  • 我們以一個子表達式為單位,對于每一個字符統計其出現的次數,如果是重復出現的,那么與第一次的前一個字符進行對比。
  • 代碼:

    #include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> using namespace std; const int N = 1e4 + 10; char st[N]; // 記錄子表達式中同一個字符的第一個前字符int main() {char ch, pre = ' ' ;bool flag = false, key = true;int c = 0;map<char, int>cnt; // 統計字符出現的次數while (cin >> ch, pre != '#') {if (pre == ')' && ch != '|') {if (c)cout << "yes" << endl;elsecout << "no" << endl;cnt.clear();c = 0;}if (isalpha(ch)) {if (cnt.count(ch) && (pre == '~' && st[ch] != '~') || (pre != '~' && st[ch] == '~')) {key = false;} else if (cnt.count(ch) == 0)cnt[ch]++, st[ch] = pre;}if (ch == ')') {if (key)c ++;key = true;memset(st, 0, sizeof st);cnt.clear();}pre = ch;}return 0; }

    大暑賽期(貪心 + 思維)

    題目描述
    目前,人們的娛樂僅限于編程競賽。教練一直在征集試題,這些試題分為|Math|Greedy|Geometry|DP|Graph|Other|六類。
    好在收集到了很多問題,教練就想多開幾場比賽。比賽由三道題組成,為了讓比賽更具教育意義,教練決定舉辦以下四種比賽。
    1、數學競賽:Math試題和DP試題共3道題
    2、算法游戲大賽:Greedy題和Graph題共3道題
    3、實現游戲競賽:Geometry問題和Other問題共3道題
    4、均衡競賽:一套三道題:1道來自Math或DP,1道來自Greedy或Graph,1道來自Geometry或Other

    當然,在某項比賽中出題的題目是不能在其他比賽中出題的。教練的愿望是舉辦盡可能多的比賽。我們知道6類試題的數量,那么,最多能開幾次競賽呢?

    輸入
    輸入由多個情況組成。每個情況以以下格式給出。
    n
    Math
    ?
    n
    Greedy
    ?
    n
    Geometry
    ?
    n
    DP
    ?
    n
    Graph
    ?
    n
    Other
    ?

    各輸入值表示各類型問題的庫存數量。
    當輸為0 0 0 0 0 0時,表示樣例數據結束。

    每個值滿足以下條件
    n
    Math
    ?
    +n
    Greedy
    ?
    +n
    Geometry
    ?
    +n
    DP
    ?
    +n
    Graph
    ?
    +n
    Other
    ?
    ≤10
    8

    此外,測試用例的數量不超過20,000個。

    輸出
    在一行中輸出可能的最大競賽數。

    解題思路:

  • 對于兩種方法。我們發現0與3,1與4和2與5 是可以合在一起看的(數據從下標0開始算的話)
  • 合并完,那么對于這三個數,我們有兩種方式,一個是前各自除以3,然后再進行另一種方式,一組挑一個數。對于這個方法,在經過n多次的找規律的時候,發現:如果這三個數有兩個數能整除3,另外一個數求余三的結果<= 1那么使用這個方法是最優的。如6 4 6如果我們先減去最小值。那么變為2 0 2那么最終次數就是4 ,不過如果我們先除以3,變為0 1 0結果是5.之所以另外一個數余3結果是<= 1是因為如果是0的話,肯定是先除以三,對于余1這個很關鍵,這個1的作用是好比上面的例子減去4后變為2 0 2那么如果我們返回一次,每個數都加上1變為3 1 3那么兩個三各自除以3,就從1次變成了兩次。明顯更優。
  • 對于另外一種方式。先減去最小值,再各次除以三。提供剩余的有出現2 0 2的情況我們就用類似上面的方式回一次。加上一。(這個的條件是減去的最小值不能是0)如2 0 2
  • 代碼:

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int N = 1e6 + 10; LL a[7];int main() {while (cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5], a[0] || a[4] || a[1] || a[2] || a[3] || a[5] ) {LL res = 0;LL n1 = a[0] + a[3], n2 = a[1] + a[4], n3 = a[2] + a[5];LL minx = min(n1, min(n2, n3));if ((n1 % 3 == 0 && (n2 % 3 ) <= 1 && n3 % 3 == 0) || (n2 % 3 == 0 && (n1 % 3 ) && n3 % 3 == 0) || (n1 % 3 == 0&& (n3 % 3 ) <= 1 && n2 % 3 == 0) ) {res += n1 / 3 + n2 / 3 + n3 / 3;n1 %= 3, n2 %= 3, n3 %= 3;while (n1 && n2 && n3) {res ++ ;n1 --, n2--, n3--;}} else {bool flag = true;if (minx == 0)flag = false;res += minx;n1 -= minx, n2 -= minx, n3 -= minx;res += n1 / 3 + n2 / 3 + n3 / 3;n1 %= 3, n2 %= 3, n3 %= 3;if (flag && ((n1 == 2 && n2 == 2) || (n1 == 2 && n3 == 2) || (n2 == 2 && n3 == 2)))res ++;}cout << res << endl;}return 0; }

    總結

    以上是生活随笔為你收集整理的校内训练赛题解第三篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。