
A
题目是让找1~n之间是4的幂次方的数的个数。直接模拟计数就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
using namespace std; int () { string s; cin >> s; string t = "1"; int ans = 0; while(t.size() <= s.size() && t < s) { t += "00"; ans++; } cout << ans << endl; }
|
B
题目意思很简单,求最大最小和。贪心求解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
using namespace std;
int (){ int n, l, r; cin >> n >> l >> r; int smin = n-(l-1); for(int i = 1, t = 2; i < l; i++) { smin += t; t *= 2; } int smax = 0; for(int i = 0, t = 1; i < r; i++) { smax += t; if(i == r-1) {smax += (n-r)*t;} t *= 2; } cout << smin << " " << smax << endl; return 0; }
|
C
题意比较绕。顶点数最大100,可以直接应用弗洛伊德算法求解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
using namespace std; int (){ int n, m; cin >> n; vector<vector<int>> dist(n, vector<int>(n, 110)); for(int i = 0; i < n; i++) dist[i][i] = 0; for(int i = 0; i < n; i++) { string s; cin >> s; for(int j = 0; j < (int)s.size(); j++) { if(s[j] == '1') dist[i][j] = 1; } } for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(int k = 0; k < n; k++) { dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]); } } } cin >> m; vector<int> p(m); for(int i = 0; i < m; i++) cin >> p[i]; vector<int> ans; int first = p.front(), last = p.back(); ans.push_back(first); for(auto it = p.begin()+2, pos = p.begin(); it < p.end(); it++) { if(dist[ans.back()-1][*it-1] < it-pos) {ans.push_back(*(it-1));pos = it-1;} } ans.push_back(last); cout << (int)ans.size() << endl; for(auto it:ans){ cout << it << " "; } cout << endl; return 0; }
|
近期评论