AcWing第36场周赛题解
第36场周赛活动链接
problem.A AcWing4212 字符串比较
暴力处理,利用ascii码,忘记ascii码也没关系,可以写个小程序输出,比如cout<<(int)'a',就知道a的ascii码了
代码
#include <iostream>
using namespace std;
int main()
{
string tmp;
cin>>tmp;
for(int i=0;i<tmp.size();i++)
{
if(tmp[i]>='A'&&tmp[i]<='Z') tmp[i]+=32;
char c=tmp[i];
if(c!='a'&&c!='o'&&c!='y'&&c!='e'&&c!='u'&&c!='i')
cout<<'.'<<c;
}
return 0;
}
problem.B AcWing4216 图中的环
利用并查集,一个环上就是同一个集合,最后看剩几个集合
代码1 并查集
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n, m;
int p[N];
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m;
if (n != m) puts("NO");
else
{
for (int i = 1; i <= n; i ++ )
p[i] = i;
int cnt = n;
while (m -- )
{
int a, b;
cin >> a >> b;
if (find(a) != find(b))
{
cnt -- ;
p[find(a)] = find(b);
}
}
if (cnt == 1) puts("YES");
else puts("NO");
}
return 0;
}
也可利用dfs,
代码2 dfs
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1010;
int n,m;
int h[N], e[N], ne[N], idx;
bool st[N];
int cnt;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u,int before)
{
st[u] = true;
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (!st[j]) dfs(j,u);
else if(j!=before) cnt++;
}
}
int main()
{
memset(h, -1, sizeof h);
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
add(a,b);add(b,a);
}
dfs(1,1);
bool flag=true;
for(int i=1;i<=n;i++)
if(st[i]==false)
{
flag=false;
break;
}
if(cnt>=3||cnt==0) flag=false;
if(flag) puts("YES");
else puts("NO");
return 0;
}
problem.C AcWing4217 机器人移动
法1.双指针算法O(n)
法2.二分O(nlogn),从编辑长度:\(0~n\)中以O(logn)速度找出最短长度,根据长度以O(n)速度从\(1~n\)找到该长度所在的位置,再以O(1)的速度判定此长度起始位置、此长度是否能满足编辑后的程序能从(0,0)到(a,b)
代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3010;
const int INF = 0x3f3f3f3f;
int s[N],c[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++) cin>>c[i];
int res=INF;
for(int i=2;i<n;i++)
{
int a=INF,b=INF;
for(int j=1;j<i;j++)
if(s[j]<s[i]) a=min(a,c[j]);
for(int j=i+1;j<=n;j++)
if(s[j]>s[i]) b=min(b,c[j]);
res=min(res,a+c[i]+b);
}
if(res==INF) cout<<"-1";
else cout<<res;
return 0;
}

浙公网安备 33010602011771号