赛时AC: ABC rating: 补题:ABCDEF
比赛链接:(0条未读通知) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
A
按照题意输出即可
字符串
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
void solve()
{
string s;
cin>>s;
cout<<s[1];
cout<<s[0];
for(int i=2;i<5;i++)
{
cout<<s[i];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t=1;//cin>>t;
while(t--)
{
solve();
}
}
B
题目要求按照顺序移动,那就没有最值一说。
读懂意思是,向原点移动。
在右边就向左移动。
在左边就向右移动。
模拟
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
void solve()
{
ll n,x;
cin>>n>>x;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
ll ans=0;
for(int i=1;i<=n;i++)
{
if(x==0)
{
break;
}
if(x>0)
{
x-=a[i];;
ans+=a[i];
}
else if(x<0)
{
x+=a[i];
ans+=a[i];
}
}
cout<<ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t=1;//cin>>t;
while(t--)
{
solve();
}
}
C
读懂意思不难。原点跳出圆的最短距离,就是与圆心的连线上的距离。
注意处理时的细节。
圆
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
ll x[N],y[N],r[N];
ll b[N];
vector<double>cal;
void solve()
{
ll n,k;
cin>>n>>k;
cout<<fixed<<setprecision(17);
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i]>>r[i];
}
double ans=0;
ll cnt=0;
for(int i=1;i<=n;i++)
{
double t=0;
t=x[i]*x[i]+y[i]*y[i];
if(t<=r[i]*r[i])
{
cnt++;
b[i]=1;
}
}
if(cnt<=k)
{
cout<<0;
return ;
}
for(int i=1;i<=n;i++)
{
if(!b[i])
{
continue;
}
double t=(r[i]*1.0-sqrt(x[i]*x[i]+y[i]*y[i]))*acos(-1.0)*r[i]*r[i];
cal.push_back(t);
}
cnt-=k;
sort(cal.begin(),cal.end());
//cout<<cal[0];
for(int i=0;i<cnt;i++)
{
ans+=cal[i];
}
cout<<ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t=1;//cin>>t;
while(t--)
{
solve();
}
}
D--本次重点
从根一直到叶子节点,这算一种情况。
一种情况的期望是,从根到该叶子节点i的节点数dis[i],乘以路上每个节点选中的概率,是同层的节点数分支1。思路很简单。关键是怎么表达出来。
用vis[i],来表示到i层的概率,他的逆元就是选中的概率。
在叶子节点所有乘起来相加。
树上期望
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N],ans=0;
vector<ll>g[N];
ll vis[N],dis[N];
ll ksm(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=a*a%mod;
b/=2;
}
return ans;
}
ll inv(ll a)
{
return ksm(a,mod-2);
}
void dfs(ll p,ll fa)
{
for(auto i:g[p])
{
if(i==fa)
{
continue;
}
dis[i]=dis[p]+1;
ll len=g[p].size();
if(p!=1)
len--;
vis[i]=inv(len)*vis[p];
vis[i]%=mod;
dfs(i,p);
}
if(g[p].size()==1&&p!=1)
{
(ans+=(dis[p]*vis[p])%mod)%=mod;
}
}
void solve()
{
ll n;
cin>>n;
for(int i=1;i<=n-1;i++)
{
ll u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
vis[1]=1;
dis[1]=1;
dfs(1,0);
cout<<ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t=1;//cin>>t;
while(t--)
{
solve();
}
}