政府網(wǎng)站建設(shè)內(nèi)容保障機(jī)制建網(wǎng)站的軟件
地址:CSDN 編程競(jìng)賽四十六期
思路:通過找規(guī)律可以知道,在周期第一個(gè)位置的數(shù)的下標(biāo)都有一個(gè)規(guī)律:除以三的余數(shù)為 1 。而第二個(gè)位置,第三個(gè)位置的余數(shù)分別為 2 , 0 。 因此可以開一個(gè)長(zhǎng)度為 3 的總和數(shù)組,以原下標(biāo)的余數(shù)作為總和數(shù)組的下標(biāo),用來記錄總和。
代碼:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int n, a[200];
long long s[3];
int main() {cin >> n;for(int i = 1; i <= n; i ++ ) {cin >> a[i];s[i % 3] += a[i];}if(s[1] > max(s[2], s[0])) cout << 'J';else if(s[2] > max(s[0], s[1])) cout << 'H';else if(s[0] > max(s[1], s[2])) cout << 'B';return 0;
}
思路:平面歐拉公式 :點(diǎn)數(shù) - 面數(shù) + 線數(shù) = 聯(lián)通塊數(shù) + 1
點(diǎn)即線段的兩個(gè)端點(diǎn)或者射線的一個(gè)端點(diǎn),線即線段或射線或直線,面即被線分割成的不同平面。聯(lián)通塊即線構(gòu)成的聯(lián)通塊。
在這道題,連通塊數(shù)一定為 1 。點(diǎn)數(shù)為 n + C n 4 n+C_n^4 n+Cn4? ( C n 4 C_n^4 Cn4? 為交點(diǎn)數(shù)即新增點(diǎn)數(shù)) ,線數(shù)為 C n 2 C_n^2 Cn2? + 2 * 交點(diǎn)數(shù)(因?yàn)?n 為奇數(shù),所以任意線段交點(diǎn)一定不會(huì)重合,每一個(gè)交點(diǎn)會(huì)使兩個(gè)線段分割為四個(gè)線段),根據(jù)以上條件就能得到面數(shù)(記得要把外面那個(gè)無限的面去掉)。
代碼:
n = int(input())
p = int(1e9 + 7)
print((1 + n * (n - 1) // 2 + n * (n - 1) * (n - 2) * (n - 3) // 24 - n + p) % p)
思路:可以發(fā)現(xiàn)不管如何旋轉(zhuǎn),對(duì)于最小值都是無影響的,因此求一下數(shù)組的最小值即可。
代碼:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int solution(int n, std::vector<int>& vec){int result = 1e9;for(int x : vec) result = std::min(result, x);return result;
}
int main() {int n;std::vector<int> vec;std::cin>>n;std::string line_0, token_0;getline(std::cin >> std::ws,line_0);std::stringstream tokens_0(line_0);while(std::getline(tokens_0, token_0, ' ')){vec.push_back(std::stoi(token_0));}int result = solution(n,vec);std::cout<<result<<std::endl;return 0;
}
思路:從前綴和的角度考慮,設(shè) nums 數(shù)組的前綴和數(shù)組為 pre 。
對(duì)于以 n u m s i nums_i numsi? 結(jié)尾的連續(xù)子數(shù)組,最大值為 max ? j = 0 i ? 1 { p r e i ? p r e j } \max_{j=0}^{i-1}\{ pre_i-pre_j \} maxj=0i?1?{prei??prej?}
那么連續(xù)子數(shù)組的最大和,就等價(jià)于 max ? i = 1 n { max ? j = 0 i ? 1 { p r e i ? p r e j } } = max ? i = 1 n { p r e i ? min ? j = 0 i ? 1 { p r e j } } \max_{i=1}^n\{ \max_{j=0}^{i-1} \{ pre_i-pre_{j} \}\}=\max_{i=1}^n\{ pre_i-\min_{j=0}^{i-1} \{ pre_{j} \}\} maxi=1n?{maxj=0i?1?{prei??prej?}}=maxi=1n?{prei??minj=0i?1?{prej?}} ,問題轉(zhuǎn)化為求每一個(gè)前綴的前綴和最小值,可以一邊更新答案,一邊計(jì)算當(dāng)前前綴最小值。
代碼:
#include <iostream>
#include <set>
#include <sstream>
#include <vector>
using namespace std;
int a[1010], pre[1010];
set<int> st = {0};
int main() {int n, ans = -1e9; cin >> n;for(int i = 1; i <= n; i ++ ) {cin >> a[i];pre[i] = pre[i - 1] + a[i];ans = max(ans, pre[i] - *st.begin());st.insert(pre[i]);}cout << ans;return 0;
}