題目來源:牛客網 https://www.nowcoder.com/profile/7952866/test/7811777/83061ios
一種雙核CPU的兩個核可以同時的處理任務,如今有n個已知數據量的任務須要交給CPU處理,假設已知CPU的每一個核1秒能夠處理1kb,每一個核同時只能處理一項任務。n個任務能夠按照任意順序放入CPU進行處理,如今須要設計一個方案讓CPU處理完這批任務所需的時間最少,求這個最小的時間。算法
輸入描述編程
輸入包括兩行: 第一行爲整數n(1 ≤ n ≤ 50)數組
第二行爲n個整數lengthi,表示每一個任務的長度爲length[i]kb,每一個數均爲1024的倍數。服務器
輸出描述 :輸出一個整數,表示最少須要處理的時間app
輸入例子 :5函數
3072 3072 7168 3072 1024學習
輸出例子: 9216ui
題意很清晰,就是給一個數組,要咱們把他分紅兩份並分別求和,使得這兩個和的最大值最小。我下意識的想法是枚舉出全部有可能的和,可是複雜度大概是O(2^n) ,貌似會超時。但是仔細一看,length[i] 的取值在[1, 4096] 之間,那麼最多n個數的和的範圍確定在[n, 4096n] 之間。spa
1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 int n; 6 int a[51]; 7 set<int>s; 8 int sum = 0; 9 int main() 10 { 11 cin >> n; 12 for (int i = 0; i<n; i++) 13 { 14 int tmp; 15 cin >> tmp; 16 a[i] = tmp / 1024; 17 sum += a[i]; 18 } 19 s.insert(0); 20 for (int i = 0; i<n; i++) 21 { 22 set<int>added; 23 for (set<int>::iterator it = s.begin(); it != s.end(); it++) 24 { 25 added.insert(*it + a[i]); 26 } 27 s.insert(added.begin(), added.end()); 28 } 29 int ans = sum; 30 for (set<int>::iterator it = s.begin(); it != s.end(); it++) 31 { 32 ans = min(ans, max(*it, sum - *it)); 33 } 34 cout << ans * 1024 << endl; 35 }
終於到週末啦!小易走在市區的街道上準備找朋友聚會,忽然服務器發來警報,小易須要當即回公司修復這個緊急bug。假設市區是一個無限大的區域,每條街道假設座標是(X,Y),小易當前在(0,0)街道,辦公室在(gx,gy)街道上。小易周圍有多個出租車打車點,小易趕去辦公室有兩種選擇,一種就是走路去公司,另一種就是走到一個出租車打車點,而後從打車點的位置坐出租車去公司。每次移動到相鄰的街道(橫向或者縱向)走路將會花費walkTime時間,打車將花費taxiTime時間。小易須要儘快趕到公司去,如今小易想知道他最快須要花費多少時間去公司。 輸入描述: 輸入數據包括五行:
第一行爲周圍出租車打車點的個數n(1 ≤ n ≤ 50)
第二行爲每一個出租車打車點的橫座標tX[i] (-10000 ≤ tX[i] ≤ 10000)
第三行爲每一個出租車打車點的縱座標tY[i] (-10000 ≤ tY[i] ≤ 10000)
第四行爲辦公室座標gx,gy(-10000 ≤ gx,gy ≤ 10000),以空格分隔
第五行爲走路時間walkTime(1 ≤ walkTime ≤ 1000)和taxiTime(1 ≤ taxiTime ≤ 1000),以空格分隔
輸出描述: 輸出一個整數表示,小易最快能趕到辦公室的時間
輸入例子: 2
-2 -2
0 -2
-4 -2
15 3
輸出例子: 42
基礎題,先算步行的時間,再枚舉每一個打車點算出打的時間,找到時間最短的便可。直接進行比較就能夠,沒有複雜的過程。
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main() 5 { 6 int n; 7 cin >> n; 8 vector<int> taxiX(n, 0); 9 vector<int> taxiY(n, 0); 10 for (int i = 0; i < n; i++) 11 cin >> taxiX[i]; 12 for (int i = 0; i < n; i++) 13 cin >> taxiY[i]; 14 int gx, gy; 15 cin >> gx >> gy; 16 int taxiTime, walkTime; 17 cin >> walkTime >> taxiTime; 18 int ans = walkTime*(abs(gx) + abs(gy)); //不打車所用的時間 19 for (int j = 0; j < n; j++) 20 { 21 int tmp = walkTime*(abs(taxiX[j]) + abs(taxiY[j])) + taxiTime*(abs(gx - taxiX[j]) + abs(gy - taxiY[j])); 22 if (tmp < ans) 23 ans = tmp; 24 } 25 cout << ans << endl; 26 return 0; 27 }
在幼兒園有n個小朋友排列爲一個隊伍,從左到右一個挨着一個編號爲(0~n-1)。其中有一些是男生,有一些是女生,男生用’B’表示,女生用’G’表示。小朋友們都很頑皮,當一個男生挨着的是女生的時候就會發生矛盾。做爲幼兒園的老師,你須要讓男生挨着女生或者女生挨着男生的狀況最少。你只能在原隊形上進行調整,每次調整隻能讓相鄰的兩個小朋友交換位置,如今須要儘快完成隊伍調整,你須要計算出最少須要調整多少次可讓上述狀況最少。例如: GGBBG -> GGBGB -> GGGBB 這樣就使以前的兩處男女相鄰變爲一處相鄰,須要調整隊形2次 輸入描述: 輸入數據包括一個長度爲n且只包含G和B的字符串.n不超過50.
輸出描述: 輸出一個整數,表示最少須要的調整隊伍的次數
輸入例子: GGBBG
輸出例子: 2
咱們對於串中第一個’B’而後計算把它swap到第一個位置須要多少次,第二個’B’swap到第二個位置須要多少次…依次類推..
而後對於’G’同理, 最後取個較小值即爲答案。
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 7 int main() 8 { 9 string str; 10 cin >> str; 11 int boyCount = 0, girlCount = 0, boy = 0, girl = 0; 12 for (int i = 0; i < str.size(); i++) 13 { 14 if (str[i] == 'B') 15 { 16 boyCount += i - boy; 17 boy++; 18 } 19 else 20 { 21 girlCount += i - girl; 22 girl++; 23 } 24 } 25 cout << min(boyCount, girlCount) << endl; 26 }
小易擁有一個擁有魔力的手環上面有n個數字(構成一個環),當這個魔力手環每次使用魔力的時候就會發生一種奇特的變化:每一個數字會變成本身跟後面一個數字的和(最後一個數字的後面一個數字是第一個),一旦某個位置的數字大於等於100就立刻對100取模(好比某個位置變爲103,就會自動變爲3).如今給出這個魔力手環的構成,請你計算出使用k次魔力以後魔力手環的狀態。
輸入描述: 輸入數據包括兩行: 第一行爲兩個整數n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔 第二行爲魔力手環初始的n個數,以空格分隔。範圍都在0至99.
輸出描述: 輸出魔力手環使用k次以後的狀態,以空格分隔,行末無空格。
輸入例子: 3 2
1 2 3
輸出例子: 8 9 7
直接按邏輯進行運算,比較費時,推薦使用快速矩陣冪算法,這裏採用的是直接算。
1 #include<iostream> 2 #include<vector> 3 4 using namespace std; 5 6 int main() 7 { 8 int n, k; 9 cin >> n >> k; 10 vector<long> arr ; 11 for (int i = 0; i <= n; i++) 12 arr.push_back(0); 13 for (int i = 1; i <= n; i++) 14 cin >> arr[i]; 15 vector<long> tmp = arr; 16 for (int j = 1; j <= k; j++) 17 { 18 int i = 1; 19 while (i < n ) 20 { 21 tmp[i] += arr[i + 1]; 22 if (tmp[i]>100) 23 tmp[i]%= 100; 24 i++; 25 } 26 while (i==n) 27 { 28 tmp[i] += arr[1]; 29 if (tmp[i]>100) 30 tmp[i] %= 100; 31 i++; 32 } 33 arr = tmp; 34 } 35 cout << arr[1]; 36 for (int i = 2; i <= n; i++) 37 cout <<" "<< arr[i]; 38 cout << endl; 39 return 0; 40 }
小易最近在數學課上學習到了集合的概念,集合有三個特徵:1.肯定性 2.互異性 3.無序性. 小易的老師給了小易這樣一個集合: S = { p/q | w ≤ p ≤ x, y ≤ q ≤ z } 須要根據給定的w,x,y,z,求出集合中一共有多少個元素。小易才學習了集合還解決不了這個複雜的問題,須要你來幫助他。
輸入描述: 輸入包括一行: 一共4個整數分別是w(1 ≤ w ≤ x),x(1 ≤ x ≤ 100),y(1 ≤ y ≤ z),z(1 ≤ z ≤ 100).以空格分隔
輸出描述: 輸出集合中元素的個數
輸入例子: 1 10 1 1
輸出例子: 10
題意就是給分數判重,顯然咱們不能直接算,由於浮點數是不精確的,乘以1.0000就能夠了,而後丟進set裏就行了。
1 #include<iostream> 2 #include<set> 3 using namespace std; 4 int getSetNum(int w, int x, int y, int z) 5 { 6 int count = 0; 7 set<double> s; 8 for (int i = w; i <= x; i++) 9 for (int j = y; j <= z; j++) 10 { 11 s.insert(i*1.0000 / j); 12 } 13 count = s.size(); 14 return count; 15 } 16 int main() 17 { 18 int w, x, y, z; 19 cin >> w >> x >> y >> z; 20 int ans; 21 ans = getSetNum(w, x, y, z); 22 cout << ans << endl; 23 return 0; 24 }
常規的表達式求值,咱們都會根據計算的優先級來計算。好比/的優先級就高於+-。可是小易所生活的世界的表達式規則很簡單,從左往右依次計算便可,並且小易所在的世界沒有除法,意味着表達式中沒有/,只有(+, - 和 )。如今給出一個表達式,須要你幫忙計算出小易所在的世界這個表達式的值爲多少
輸入描述: 輸入爲一行字符串,即一個表達式。其中運算符只有-,+,*。參與計算的數字只有0~9. 保證表達式都是合法的,排列規則如樣例所示。
輸出描述: 輸出一個數,即表達式的值
輸入例子: 3+5*7
輸出例子: 56
關鍵之處在於:輸入的一個數字和下一個數字之間確定隔着一個操做符,因此在第一個for循環的時候i=i+2,依次取數,再取操做符進行運算。
#include<iostream> #include<string> using namespace std; int main() { string str; cin >> str; int ans = str[0] - '0'; for (int i = 1; i < str.length() - 1; i += 2) { //關鍵之處i+=2 if (str[i] == '*') ans = ans * (str[i + 1] - '0'); else if (str[i] == '+') ans = ans + (str[i + 1] - '0'); else { ans = ans - (str[i + 1] - '0'); } } cout << ans << endl; return 0; }
小易參與了一個記單詞的小遊戲。遊戲開始系統提供了m個不一樣的單詞,小易記憶一段時間以後須要在紙上寫出他記住的單詞。小易一共寫出了n個他能記住的單詞,若是小易寫出的單詞是在系統提供的,將得到這個單詞長度的平方的分數。注意小易寫出的單詞可能重複,可是對於每一個正確的單詞只能計分一次。
輸入描述: 輸入數據包括三行:
第一行爲兩個整數n(1 ≤ n ≤ 50)和m(1 ≤ m ≤ 50)。以空格分隔
第二行爲n個字符串,表示小易能記住的單詞,以空格分隔,每一個單詞的長度小於等於50。
第三行爲m個字符串,系統提供的單詞,以空格分隔,每一個單詞的長度小於等於50。
輸出描述: 輸出一個整數表示小易能得到的分數
輸入例子: 3 4
apple orange strawberry strawberry orange grapefruit watermelon
輸出例子: 136
把能記住的單詞丟進set裏,能夠去除重複單詞,合理利用set的insert函數,而後判斷每個是否是在系統提供的集合裏便可。
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<set> 5 //爲了不重複,將單詞放入set裏 6 using namespace std; 7 8 int main() 9 { 10 int n, m; 11 cin >> n >> m; 12 set<string> str1, str2; 13 for (int i = 0; i<n; i++) 14 { 15 //讀入小易記住的單詞 16 string str; 17 cin >> str; 18 str1.insert(str); 19 } 20 for (int i = 0; i<m; i++) 21 { 22 //讀入系統提供的單詞 23 string str; 24 cin >> str; 25 str2.insert(str); 26 } 27 int ans = 0; 28 for (set<string>::iterator it = str1.begin(); it != str1.end(); it++) 29 { 30 if (str2.find(*it) != str2.end()) 31 { 32 //find()函數返回指向查找元素的迭代器,若是不存在返回set的end()迭代器. 33 ans += it->length() * it->length();//計算分數:單詞長度的平方 34 } 35 } 36 cout << ans << endl; 37 }
小易有一個長度爲n序列,小易想移除掉裏面的重複元素,可是小易想是對於每種元素保留最後出現的那個。小易遇到了困難,但願你來幫助他。
輸入描述:
輸入包括兩行: 第一行爲序列長度n(1 ≤ n ≤ 50)
第二行爲n個數sequencei,以空格分隔
輸出描述: 輸出消除重複元素以後的序列,以空格分隔,行末無空格
輸入例子: 9
100 100 100 99 99 99 100 100 100
輸出例子: 99 100
從後向前先判重後加入便可,合理利用集合set的insert函數,去除重複元素
1 #include<iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<set> 5 6 //從後向前先判重後加入便可。 7 using namespace std; 8 int main() 9 { 10 int n; 11 cin >> n; 12 int a[51] = { 0 }; 13 vector<int> arr; 14 set<int> s; 15 for (int i = 0; i < n; i++) 16 cin >> a[i]; 17 for (int i = n - 1; i >= 0; i--) 18 { 19 if (s.find(a[i]) == s.end()) 20 { 21 s.insert(a[i]); 22 arr.push_back(a[i]); 23 } 24 } 25 cout << arr[arr.size() - 1]; 26 for (int i = arr.size() - 2; i >= 0; i--) 27 { 28 cout << " " << arr[i]; 29 } 30 cout << endl; 31 return 0; 32 }
小易有一塊n*n的棋盤,棋盤的每個格子都爲黑色或者白色,小易如今要用他喜歡的紅色去塗畫棋盤。小易會找出棋盤中某一列中擁有相同顏色的最大的區域去塗畫,幫助小易算算他會塗畫多少個棋格。
輸入描述: 輸入數據包括n+1行:
第一行爲一個整數n(1 ≤ n ≤ 50),即棋盤的大小
接下來的n行每行一個字符串表示第i行棋盤的顏色,’W’表示白色,’B’表示黑色
輸出描述: 輸出小易會塗畫的區域大小
輸入例子: 3
BWW
BBB
BWB
輸出例子: 3
注意,只是找某一列的最大區域,並非整個棋盤的最大區域,因此比較簡單。
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 int main() 7 { 8 string str[52]; 9 int n; 10 cin >> n; 11 for (int i = 0; i < n; i++) 12 cin >> str[i]; 13 int maxCnt = 0;//保存最大區域的值 14 for (int j = 0; j < n; j++) 15 { 16 int cnt = 1;//臨時保存每一列的最大區域的值 17 for (int i = 1; i < n; i++) 18 { 19 if (str[i][j] == str[i - 1][j]) 20 { 21 cnt++; 22 } 23 else 24 { 25 maxCnt = max(maxCnt, cnt); 26 cnt = 1; 27 } 28 29 } 30 maxCnt = max(maxCnt, cnt); 31 } 32 cout << maxCnt << endl; 33 return 0; 34 }