Codeforces Round #327

div. 2

A. Wizards' Duel

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int l,p,q;
	scanf("%d%d%d",&l, &p, &q);
	double a = l*p*1.0/(p+q);
	printf("%.4lf\n", a);
	return 0;
} 

B. Rebranding

#include <bits/stdc++.h>
using namespace std;
vector<int>v[30];
char s[200005];
char s2[200005];
int p[30];
int main()
{	int n, m;
	scanf("%d%d", &n, &m);
	scanf("%s",s);
	for(int i = 0; i < n; i++)
	{
		v[s[i]-'a'].push_back(i);
	}
	char a[5], b[5];
	for(int i = 0; i < 26; i++) p[i] = i;
	for(int i = 0; i < m; i++)
	{
		scanf("%s%s", a, b);
		int ai = a[0] - 'a';
		int bi = b[0] - 'a';
		int c = p[ai];
		p[ai] = p[bi];
		p[bi] = c;
	}
	vector<int>:: iterator it;
	for(int i = 0; i < 26; i++)
	{
		if(p[i] == -1) continue;
		for(it = v[p[i]].begin(); it != v[p[i]].end(); ++it)
		{
			s2[*it] = i + 'a';
		}
	}
	printf("%s\n", s2);
	return 0;
}

C. Median Smoothing

#include <bits/stdc++.h>
using namespace std;
#define inf 500005
int a[inf], b[inf];
int main()
{
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	int ans=0;
	b[0] = a[0];
	for(int i = 1; i < n; )
	{
		if(a[i] == a[i-1])
		{
			b[i] = a[i];
			i++;
		}
		else
		{
			int l = i-1, num = 2, j;
			for(j = i + 1; j < n; j++)
			{
				if(a[j] == a[j-1]) break;
				num++;
			} 
			i = j;
			for(j = l; j < l+num/2; j++) b[j] = a[l];
			for(j = l+num/2; j < l+num; j++) b[j] = a[i-1];
			if(num % 2 == 0) num--;
			if(num > 2) ans = max(ans,num/2);
		}
	}
	printf("%d\n",ans);
	for(int i = 0; i < n; i++)
	{
		if(i<n-1) printf("%d ",b[i]);
		else printf("%d\n", b[i]);
	}
	return 0;
}

D. Chip 'n Dale Rescue Rangers

這個題目不懂要幹嘛,哪位看懂的麻煩給我留個言啊


E. Three States

題意

要使得1   2   3這三個連通塊聯通,最少需要幾步

’.‘表示可以通過

‘#’表示不能通過

思路

分別求出每個點到1  2  3的最小距離

#include <bits/stdc++.h>
using namespace std;
#define inf 10000000
typedef pair<int, int>pii;
char s[1005][1005];
int f[4][2]={0,-1,-1,0,0,1,1,0};
int si[3][1005][1005];
int n, m;
bool is_ok(int x, int y)
{
	if(x < 0 || x >= n || y < 0 || y >= m || s[x][y] == '#') return false;
	return true;
}
void bfs(int dis[1005][1005], char c)
{
	queue<pii>q;
	pii b,e;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			if(s[i][j] == c) 
			{
				dis[i][j]=0;
				q.push(make_pair(i,j));
			}
			else dis[i][j] = inf;
		}
	}
	while(!q.empty())
	{
		b = q.front();
		q.pop();
		for(int i = 0; i < 4; i++)
		{
			e.first = b.first + f[i][0];
			e.second = b.second + f[i][1];
			int x = e.first, y = e.second;
			if(!is_ok(x, y)) continue;
			if(s[x][y] == '.')
			{
				if(dis[x][y]>dis[b.first][b.second]+1)
				{
					dis[x][y] = dis[b.first][b.second] + 1;
					q.push(e);
				}
			}
			else 
			{
				if(dis[x][y]>dis[b.first][b.second])
				{
					dis[x][y] = dis[b.first][b.second];
					q.push(e);
				}
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 0; i < n; i++)
	{
		scanf("%s", s[i]);
	}
	for(int i = 0; i < 3; i++)
	{
		bfs(si[i],(char)i+'1');
	}
	int b = inf, c = inf;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			if(s[i][j] == '2') b = min(b, si[0][i][j]);
			if(s[i][j] == '3') c = min(c, si[0][i][j]);
		}
	}
	if(b == 0 && c == 0) 
	{
		printf("0\n");
		return 0;
	}
	int ans = inf;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			if(s[i][j] == '.')
			{
				ans = min(ans, si[0][i][j]+si[1][i][j]+si[2][i][j]-2);
			}
		}
	}
	if(ans == inf) printf("-1\n");
	else printf("%d\n", ans);
	return 0;
} 

div. 1

【D. Top Secret Task】


【E. Birthday】


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章