div. 2
#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;
}
#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;
}
#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】
这个题目不懂要干嘛,哪位看懂的麻烦给我留个言啊
题意
要使得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】