“蔚来杯“2022牛客暑期多校训练营1部分题解(待补)

Posted 尘封陌路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“蔚来杯“2022牛客暑期多校训练营1部分题解(待补)相关的知识,希望对你有一定的参考价值。

G-Lexicographical Maximum

思路: 输出字典序最大,肯定是形如999这样的,对于9997.9998这样特判。
n-1全为9的输出自身,否则输出n-1个9

#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll mod=1e9+7;
const int N=(1e6+500);
char a[N];
int main()
    scanf(" %s",a);
    int len=strlen(a);
    int flag=0;
    for(int i=0;i<len-1;i++)
        if(a[i]!='9')
            flag=1;
    if(!flag)
        printf("%s\\n",a);
    else
        for(int i=1;i<len;i++)
            printf("9");
        printf("\\n");
    
    return 0;

A Villages: Landlines

思路:贪心,因为发电站就一个,每个建筑物都会有一个影响区间和收影响区间,将建筑物分为在 发电站 左侧和发电站右侧,不断的维护和更新发电的影响区间,即最大的L,R,若建筑物的受影响区间不在L,R就对ans加上贡献,不断的更新L,R

一共执行n-1次,两个指针一直往两边走,优先处理 不用花费的情况,尽可能的扩大L,R。

#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll mod=1e9+7;
const int N=(1e6+500);
char a[N];
struct node
    int l;
    int r;
p1[N],p2[N];
bool cmp1(node&x,node&y)
    return x.l<y.l;

bool cmp2(node&x,node&y)
    return x.r>y.r;

int main()
    int n;
    scanf("%d",&n);
    int x,y;
    scanf("%d%d",&x,&y);
    int l,r;
    l=x-y,r=x+y;
    int cnt1=1,cnt2=1;
    int x1,r1;
    for(int i=1;i<n;i++)
        scanf("%d%d",&x1,&r1);
        if(x1>=x)
            p1[cnt1].l=x1-r1,p1[cnt1].r=x1+r1,cnt1++;
        else
            p2[cnt2].l=x1-r1,p2[cnt2].r=x1+r1,cnt2++;
    
    sort(p1+1,p1+cnt1,cmp1);
    sort(p2+1,p2+cnt2,cmp2);
    int numl=1,numr=1;
    ll ans=0;
    for(int i=1;i<n;i++)
        if(numr<cnt1&&p1[numr].l<=r)
            r=max(r,p1[numr].r);
            l=min(l,p1[numr].l);
            numr++;
        
        else if(numl<cnt2&&p2[numl].r>=l)
            l=min(l,p2[numl].l);
            r=max(r,p2[numl].r);
            numl++;
        
        else if(numr!=cnt1)
            ans+=p1[numr].l-r;
            r=p1[numr].r;
            numr++;
        else
            ans+=l-p2[numl].r;
            l=p2[numl].l;
            numl++;
        
    
    printf("%lld\\n",ans);
    return 0;

D-Mocha and Railgun

思路:一开始以为射线方向固定。。。 由样例的启发,Q点到圆心的连线为L,与L垂直的方向最优,然后画图作解。如图。

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp(aa,bb) make_pair(aa,bb)
#define _for(i,b) for(int i=(0);i<(b);i++)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#define mst(abc,bca) memset(abc,bca,sizeof abc)
#define fi first
#define se second
#define lowbit(a) (a&(-a))
#define debug(a) cout<<#a<<":"<<a<<"\\n"
typedef long long ll;
typedef pair<ll,ll> pll;
typedef unsigned long long ull;
typedef long double ld;
#define int long long
#define endl "\\n"
const int N=1000010;
const int INF=1000000000000007;
const int mod=1e9+7;
const double eps=1e-6;
const double PI=acos(-1.0);
int n,m;

double r,x,y,d;
void solve()
	cin>>r;
	cin>>x>>y>>d;
	
	double res=sqrt(x*x+y*y);
	double t=PI-acos((d-res)/r)-acos((d+res)/r);
	cout<<r*t<<endl;
	
//	printf("%.10lf",ans);



signed main()
	//ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cout<<fixed<<setprecision(9);
	 int t;cin>>t;while(t--)
	solve();
    return 0;

I-Chiitoitsu

思路:dp dp[j][i] 表示牌库中还有j张牌,还需要i对 对子,所需要的轮数的期望。
那么多余每个dp[j][i],如果没有取到我想要的牌,可以由dp[j-1][i]转移过来,并且再算上此时的概率,如果取到了我想要的牌,可以由dp[j-1][i-1]转移过来,同时算上此时的概率。

具体转移方程见代码

#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll mod=1e9+7;
const int N=(1e6+500);
ll sum[200][10];
int a[500];
ll qm(ll x,ll y)
    ll ret=1;
    while(y)
        if(y&1)
            ret=ret*x%mod;
        y>>=1;
        x=x*x%mod;
    
    return ret;

int main()
    for(int i=1;i<=7;i++)
        for(int j=6*i-3;j<=123;j++)
            sum[j][i]=((j-6*i+3)*(1+sum[j-1][i])+(6*i-3)*(sum[j-1][i-1]+1))%mod*qm(j,mod-2)%mod;
        
    
    int t;
    scanf("%d",&t);
    for(int j=1;j<=t;j++)
        string s;
        cin>>s;
        int num=0;
        map<string,int>mp;
        for(int i=0;i<s.length();i+=2)
            string k;
            k+=s[i];
            k+=s[i+1];
            if(mp[k])
                num++;
            else
                mp[k]=1;
        
        printf("Case #%d: %lld\\n",j,sum[123][7-num]);
    


C-待补

B-待补

以上是关于“蔚来杯“2022牛客暑期多校训练营1部分题解(待补)的主要内容,如果未能解决你的问题,请参考以下文章

“蔚来杯“2022牛客暑期多校训练营1部分题解(待补)

“蔚来杯“2022牛客暑期多校训练营1部分题解(待补)

题解 I. Ice Drinking "蔚来杯"2022牛客暑期多校训练营3

“蔚来杯“2022牛客暑期多校训练营1,签到题GADI

“蔚来杯“2022牛客暑期多校训练营8,签到题F

“蔚来杯“2022牛客暑期多校训练营4,签到题NDKHL