Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)

A. Bear and Elections

    题目不难,问最少经过多少次第一个元素自增其余元素自减使得第一个元素能严格大于其他所有的元素。关键是学会priority_queue的使用。代码如下:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int> q;
int main()
{
	int n, a, x, i,ans=0;
	cin >> n >> a;
	for (i = 1; i < n; ++i)
	{
		cin >> x;
		q.push(x);
	}
	int t = q.top();
	q.pop();
	while (a <= t) 
	{
		t--;
		a++;
		ans++;
		q.push(t);
		t = q.top();
		q.pop();
	}
	cout << ans << endl;
	return 0;
}

总结,在priority_queue中,对首的元素总是最大的,是一个自调节的过程,无论你怎么改变,总是能保证对首的元素最大。

B. Bear and Three Musketeers

    涉及到图论找环的问题。题目意思是希望找到3个互相认识的“人”,而且这3个互相认识的“人”除了认识彼此之外认识的其他“人”的数量越少越好。如果能找到,则输出这3个人认识的除了这3人之外认识的其他人的最小数量,如果不存在则输出-1。举个例子,如果希望找到的3个人是1,2,3,则意味着1必须认识2和3,2也必须认识1和3,3也要必须认识1和2,同时要满足1,2,3除了认识彼此之外认识的人要尽量的少。

   处理的方法是建立一个边集,边的两端连接着两个顶点。用一个数组表示每一个点的度数,表示这一个点与几个点连接,初始化为0表示开始的时候我们不知道这个点和谁连接。最后建立一个邻接数组表示点与点之间的连接关系,用来表示我前面所提到的“认识”。因为要输出一个最小的,因此做一个循环设置一个比较。代码如下(参考了别人的代码,非原创):

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include<algorithm>  
  3. #define MAXN 4000  
  4. #define inf 99999  
  5. using namespace std;  
  6. typedef struct  
  7. {  
  8.     int x;  
  9.     int y;  
  10. }Node;  
  11. Node net[MAXN + 10];//边集  
  12. int deg[MAXN + 10];//度数和  
  13. bool matrix[MAXN + 10][MAXN + 10];//邻接矩阵  
  14. int main()  
  15. {  
  16.     int n, m,a,b,i,j;  
  17.     cin >> n >> m;  
  18.     memset(matrix, 0, sizeof matrix);  
  19.     memset(deg, 0, sizeof deg);  
  20.     for (i = 0; i<m; i++)  
  21.     {  
  22.         cin >> a >> b;  
  23.         net[i].x = a;  
  24.         net[i].y = b;  
  25.         deg[a]++;  
  26.         deg[b]++;  
  27.         matrix[a][b] = matrix[b][a] = 1;  
  28.     }  
  29.     int ans = inf;  
  30.     bool flag = false;//找环  
  31.     for (i = 0; i < m; i++)  
  32.     {  
  33.         int ax = net[i].x;  
  34.         int ay = net[i].y;  
  35.         for (j = 1; j <= n; j++)  
  36.         {  
  37.             if (matrix[ay][j])//某个点和其余点邻接  
  38.             {  
  39.                 if (matrix[ax][j])  
  40.                 {  
  41.                     flag = true;  
  42.                     int tmp = deg[ax] + deg[ay] + deg[j] - 6;  
  43.                     ans = min(ans, tmp);  
  44.                 }  
  45.             }  
  46.         }  
  47.     }  
  48.     if (flag)  
  49.         cout << ans << endl;  
  50.     else  
  51.         cout << -1 << endl;  
  52.     return 0;  
  53. }  

 

你可能感兴趣的:(Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2))