codeforces-1204题解

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;
}