| 题目 | 难度 | 知识点 |
|---|---|---|
| A 智乃的天平 | ★ | 签到 |
| B 智乃爬山 | ★ | 签到 |
| C 智乃放球 | ★ | 签到 |
| D 智乃的“K”叉树 | ★★ | 思维 |
智乃的天平
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL a,b,w;
int main(void)
{
cin>>a>>b>>w;
if((w+a==b) || (w+b==a) || (w==a) || (w==b) || (w==a+b)) puts("Yes");
else puts("No");
return 0;
}
智乃爬山
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N],n,ans=-1;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n-1;i++)
{
if(a[i]>a[i+1]&&a[i]>a[i-1]) ans=max(ans,a[i]-((a[i-1]+a[i+1])/2));
}
cout<<ans;
return 0;
}
智乃放球
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)
{
int t; cin>>t;
while(t--)
{
LL n,m,k,q; cin>>n>>m>>k>>q;
if(n%k==q%k && n>=q && m*(k-1)>=q ) puts("Yes");
else puts("No");
}
return 0;
}
智乃的“K”叉树
结论好猜注意特判,一直wa麻了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int d[N],n;
int main(void)
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
int a,b; cin>>a>>b;
d[a]++,d[b]++;
}
int maxd=0;
for(int i=1;i<=n;i++) maxd=max(maxd,d[i]);
int root=-1;
for(int i=1;i<=n;i++){
if(d[i]!=maxd)
{
root=i;break;
}
}
if(n==2) cout<<1<<" "<<1;
else cout<<maxd-1<<" "<<root;
}
枚举根节点,那么此时,最大的度在以下几个集合中: 1.根节点自身的度 2.除了根节点之外其他点的最大的度-1,-1是因为它不是根必有一个孩子连到了根。这里用l[N],r[N]维护除了根节点外其余点的最大值。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int d[N],l[N],r[N],n;
int main(void)
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
int a,b; cin>>a>>b;
d[a]++,d[b]++;
}
for(int i=1;i<=n;i++) l[i]=max(l[i-1],d[i]);
for(int i=n;i>=1;i--) r[i]=max(r[i+1],d[i]);
int k=1e9,root=0;
for(int i=1;i<=n;i++)
{
int temp=max({d[i],l[i-1]-1,r[i+1]-1});
if(temp<k) k=temp,root=i;
}
cout<<k<<" "<<root;
return 0;
}