A - Boring Apartments
直接找规律。ans=10∗(dig−1)+2len(len+1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | #include <bits/stdc++.h>
  using namespace std;
  int main() { 	int t; 	cin >> t; 	while (t--) { 		string x; 		cin >> x; 		int dig = x[0] - '0' - 1; 		int len = x.size(); 		cout << dig * 10 + len * (len + 1) / 2 << endl; 	}
  	return 0; }
   | 
 
B - Yet Another Bookshelf
这道题也是找规律。答案是从左数第一个1开始到右数第一个数结束,之间存在的0的个数。注意:输出的下标从1开始。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | #include <bits/stdc++.h>
  using namespace std;
  int main() {
  	int t; 	cin >> t; 	while (t--) { 		int n; 		cin >> n; 		vector<int> a(n); 		for (auto &it : a) cin >> it; 		while (a.back() == 0) a.pop_back(); 		reverse(a.begin(), a.end()); 		while (a.back() == 0) a.pop_back(); 		cout << count(a.begin(), a.end(), 0) << endl; 	} 	 	return 0; }
   | 
 
C - Dominant Piranha
这道题的答案不唯一,按照找出一个答案的思路出发,显然答案大概率产生在最大的元素上,我们发现,只要最大的元素与相邻的元素不相等,最大的元素就能继续成长,成为更大的元素(如果最大的元素有多个,此时,就超越那些原本一样最大的元素),然后,显然他就能成为dominant 元素。
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
   | #include <bits/stdc++.h>
  using namespace std;
  int main() {
  	int t; 	cin >> t; 	while (t--) { 		int n; 		cin >> n; 		vector<int> a(n); 		int mx = 0; 		for (auto &it : a) { 			cin >> it; 			mx = max(mx, it); 		} 		int idx = -1; 		for (int i = 0; i < n; ++i) { 			if (a[i] != mx) continue; 			if (i > 0 && a[i - 1] != mx) idx = i + 1; 			if (i < n - 1 && a[i + 1] != mx) idx = i + 1; 		} 		cout << idx << endl; 	} 	 	return 0; }
   | 
 
D - Districts Connection
题意:给出了n个地区,每一个地区有一个匪帮,id为ai(两个地区有可能是同一个匪帮)。要求是找到一个连通图,使得两两地区的匪帮不是同一个匪帮。让你去判断存不存在这样的连通图,存在的话要输出图的边,有多个答案输出一个即可。
思路:写几个例子就能发现,只有当所有的地区都是一个匪帮时,才不存在连通图。其余情况都存在连通图。一个比较简单的构造方法就是先记录n=0的匪帮id:a0,把其他地区匪帮id不为a0的都挂在n=0这个地区上,这样剩下的不连通的区域就只剩下id同样是a0的其他地区,只需要找到一个挂在n=0上的id不为a0的地区,将剩余的挂载于其上即可。
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
   | #include <bits/stdc++.h>
  using namespace std;
  int main() { 	 	int t; 	cin >> t; 	while (t--) { 		int n; 		cin >> n; 		vector<int> a(n); 		for (auto &it : a) cin >> it; 		vector<pair<int, int>> res; 		int idx = -1; 		for (int i = 1; i < n; ++i) { 			if (a[i] != a[0]) { 				idx = i; 				res.push_back({1, i + 1}); 			} 		} 		if (idx == -1) { 			cout << "NO" << endl; 			continue; 		} 		for (int i = 1; i < n; ++i) { 			if (a[i] == a[0]) { 				res.push_back({idx + 1, i + 1}); 			} 		} 		cout << "YES" << endl; 		for (auto [x, y] : res) cout << x << " " << y << endl; 	} 	 	return 0; }
   | 
 
其他题目的官方题解(水平不足,没做):
http://codeforces.com/blog/entry/83903