OMRON Corporation Programming Contest 2025 (AtCoder Beginner Contest 397)题解
A - Thermometer
思路:按照题意模拟即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
double x;
signed main()
{
cin>>x;
if(x>=38.0)
{
cout<<1;
}
else if(x<38.0&&x>=37.5)
{
cout<<2;
}
else
{
cout<<3;
}
return 0;
}
B - Ticket Gate Log
思路:我们直接去判断,用cnt去表示插入的字符长度,然后i+cnt就能表示出准确的位置,这样就能够去判断某一个位置是否合适,不合适就给cnt+1
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s;
int cnt=0;
signed main()
{
cin>>s;
int n=s.size();
s=" "+s;
for(int i=1;i<=n;i++)
{
if(s[i]=='o'&&(i+cnt)%2==1)
{
cnt+=1;
}
else if(s[i]=='i'&&(i+cnt)%2==0)
{
cnt+=1;
}
}
if((n+cnt)%2==1)
{
cout<<cnt+1;
return 0;
}
cout<<cnt;
return 0;
}
C - Variety Split Easy
思路:我们可以用一个map先去遍历一遍,去寻找到每一个数出现的次数,然后去遍历一遍分界点i,然后再用一个map去统计前边出现的数的次数,cnt1表示前面的数的个数,cnt2表示后面的数的个数,如果这个数第一次出现,那么 cnt1++,如果这个数出现的次数等于第一个map里面的数出现的次数cnt2--;
然后不断去更新cnt1+cnt2的最大值
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[300005];
int cnt1;
int cnt2;
set<int> s;
map<int,int> mp1;
map<int,int> mp2;
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp1[a[i]]++;
s.insert(a[i]);
}
int cnt2=s.size();
int cnt1=0;
int ans=0;
for(int i=1;i<=n;i++)
{
mp2[a[i]]++;
if(mp2[a[i]]==1)
{
cnt1++;
}
if(mp2[a[i]]==mp1[a[i]])
{
cnt2--;
}
ans=max(ans,cnt1+cnt2);
}
cout<<ans;
return 0;
}
D - Cubes
思路:我们可以用数学公式去将x^3-y^3去化简一下
我们可以知道公式可以化简为(x-y)*(x^2+x*y+y^2)那么我们可以知道
假设a=(x-y),b=(x^2+x*y+y^2)
因为x,y都是正整数,所以b>a*a;
我们之间去跑公式,最外层遍历a,如果n%a!=0,就直接跳过,否则可以计算出来b,如果b<=a*a,那么也直接跳过,然后我们可以通过a和b来算出来xy的值,进而求出x+y的值,最后和a一结合就可以求出来x和y的值(注意计算过程中避免有小数出现即可)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
signed main()
{
cin>>n;
for(int a=1;a*a*a<=n;a++)
{
if(n%a!=0)
{
continue;
}
int b=n/a;
if(b<=a*a)
{
continue;
}
int c=(b-a*a)/3;
int d=b+c;
int p=sqrt(d);
if(p*p==d)
{
int y=(p-a)/2;
int x=a+y;
cout<<x<<" "<<y<<"\n";
return 0;;
}
}
cout<<-1;
return 0;
}
E - Path Decomposition of a Tree
思路:我们发现题目是让求分成n个链,每个链的长度为k,那么我们可以得到如果说我们的父节点为v,我们可以讨论其子节点的情况
1.我们这个v没有子节点,那么其为叶子节点,cnt值为1
2.我们这个v有一个子节点,那么我们之间让这个cnt值=子节点的值+1;
3.我们这个点有有两个子节点,因此我们可以用最长的链和最短的链去结合这个父节点,如果是k,那么 就是合格的,否则就是直接输出no
如果最后cnt[1]是k就是yes,否则就是no
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
int u,v,w;
vector<int> e[200005];
int cnt[200005];
int flag=1;
void dfs(int v,int fa)
{
int mx=0;
int mi=1e12;
int num=0;
for(int u:e[v])
{
if(u!=fa)
{
dfs(u,v);
if(cnt[u]!=k)
num++,mx=max(mx,cnt[u]),mi=min(mi,cnt[u]);
}
}
if(num>2)
{
cout<<"No\n";
exit(0);
}
if(num==1)
cnt[v]=mx+1;
else if(num==2)
{
if(1+mx+mi==k)
{
cnt[v]=k;
}
else
{
cout<<"No\n";
exit(0);
}
}
else if(num==0)
{
cnt[v]=1;
}
}
signed main()
{
cin>>n>>k;
for(int i=1;i<=n*k-1;i++)
{
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs(1,0);
if(cnt[1]!=k)
cout<<"No";
else
cout<<"Yes";
return 0;
}