首页 > 编程语言 >第四届辽宁省大学生程序设计竞赛部分题解

第四届辽宁省大学生程序设计竞赛部分题解

时间:2023-11-01 19:13:43浏览次数:40  
标签:隔板 int 题解 ll 石子 Alice 第四届 程序设计 描述

2023辽宁省赛

A:欢迎来到辽宁省赛

题目描述

小Z躺在床上看了看表 , 现在是13:30 , 2023辽宁省大学生程序设计竞赛的报名将会在 14:00 截止。
然而不急 , 省赛的参赛队伍还没有向他提交名单。小Z知道 , 只要 3 分钟他就可以完成报名 , 完成汇款。
现在他想知道 , 队伍要在多少分钟内向他提交完名单。(如有巧合 , 纯属雷同)

输入描述:

输出描述:

思路

签到题,直接输出即可

AC代码

27

B:胜率

题目描述

某个公平竞技手游中有胜率的概念,胜率是一个百分数,等于在游戏中获胜的局数除以参与的游戏局数。在本题中,我们将胜率进行四舍五入,修约为两位小数。

比如参加了 7 局游戏,赢了 3 局,那么胜率为 42.86%
请问如果胜率是 A% (A 是一个两位小数),最少需要参加几局游戏(至少需要参加一局游戏)。

输入描述:

一个两位小数 , 表示A

输出描述:

输出一个自然数,表示最少参加了几局游戏。

思路

枚举分母,从2-10000

AC代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+7;
const int INF=0x3f3f3f3f;
typedef long long ll;

int main(){
    double a;
    cin>>a;
    ll ans=0;
    if(a==0||a==1)
        {
        cout<<1<<endl;
        return 0;
    }
    for(int i=2;i<=10000;i++){
        double num=a*i/100;
        int num1;
        int res=num*10;
        if(res%10>=5){
            num1=num+1;
        }else{
            num1=num;
        }
        int t=1.0*num1/i*10000;
        if((int)(1.0*num1/i*100000)%10>=5){
            t++;
        }
        int a1=a*100;
        if(t==a1){
            ans=i;
            break;
        }
    }
    cout<<ans<<endl;

    return 0;
}

F:隔板与水槽

题目描述

给定一个数轴,数轴上有n个隔板,第i个隔板的高度为a[i],在数轴上的位置为i。
定义一个水槽为两个隔板以及中间的区域,水槽的容积为两个隔板的高度中较小的值乘以两个隔板的距离。
现在你需要找出三个隔板,使得其构成两个水槽(位于中间的隔板将被共用),使得两个水槽的容积和最大,求此容积和。

输入描述:

第一行输入一个整数n。接下来一行输入n个数,表示a[i] 。

输出描述:

一行一个整数,表示三个隔板所组成两个水槽的最大容积和。

思路

三个隔板分别记为i、j、k,先预处理出隔板i到隔板j的容积,和隔板j到隔板k的最大容积(k取j+1——n),枚举隔板i到隔板j的所有情况,求隔板i到隔板j容积加隔板j到隔板k的最大容积和

AC代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+7;
const int INF=0x3f3f3f3f;
typedef long long ll;

int main(){
    int n;
    scanf("%d",&n);
    ll a[n+1];
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    ll d[n+5][n+5];
    ll md[n+5];
    for(int i=1;i<n;i++){
        md[i]=0;
        for(int j=i+1;j<=n;j++){
            d[i][j]=min(a[i],a[j])*(j-i);
            if(d[i][j]>md[i]){
                md[i]=d[i][j];
            }
        }
    }
    ll ans=0;
    for(int i=1;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            ans=max(ans,d[i][j]+md[j]);
        }
    }
    printf("%lld\n",ans);

    return 0;
}

H:取石子

题目描述

Alice和Bob轮流在一个石子堆取石子,谁先无法操作谁输。Alice先手。
给定两个正整数a,b。Alice每次能拿走 a2x2 +ax+1 个石子,Bob每次能拿走b2x2 +by+1 个石子。(x、y是由Alice、Bob自己确定的非负整数,每次的x可以不同,每次的y可以不同,但是每次取走的石子数不能超过总石子数。)
现在有T组询问,每组询问给定a,b,这个石子堆的石子数n,问在两人都足够聪明的前提下,谁能取得胜利。

输入描述:

第一行一个正整数T,表示有几个石子堆。
接下来的T行,每行三个正整数a,b,n。(a,b意义如题目描述,n为这个石子堆的石子数)

输出描述:

输出T行,每行输出一个字符串。如果Alice取得胜利,则输出“Alice”;如果Bob取得胜利,则输出“Bob”。(不包括引号)

思路

Alice和Bob每次都只能取走奇数个石子,所以只需要判断n的奇偶性就可以了,基数Alice赢,偶数Bob赢

AC代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t,a,b,n;
    cin>>t;
    while(t--)
    {
        cin>>a>>b>>n;
        if(n%2==1) cout<<"Alice\n";
        else cout<<"Bob\n";
    }
}

M:让二追三

题目描述

你也想像杭闪打出让二追三的操作,于是打开守望先锋,进行了n场比赛。我们定义“让二追三”为,连续五场比赛为“输输赢赢赢”。你的每场比赛获胜的概率是p(p=a/b),你想知道在n场比赛里你能打出的“让二追三”在模1e9+7下的期望次数。
简单来说,有一个长度为n的01串,其中每一位是1的概率是p(p=a/b),是0的概率是1−p。问这个01串中00111 这个子段在模1e9+7下的期望个数。

输入描述:

第一行一个正整数T,表示有T组数据。
接下来的T行,每行三个正整数a,b,n。(a/b表示一场比赛赢的概率,n表示比赛的场数。)

输出描述:

输出T行,每行输出一个整数,表示在模1e9+7下的00111的期望个数。

思路

运用逆元对分母取模,一个00111子串的概率是(1-p)2 p3,乘以n-4

AC代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+7;
const int INF=0x3f3f3f3f;
typedef long long ll;

const ll M=1e9+7;

inline ll qpow(ll a,ll n,ll p){
    ll ans=1;
    while(n){
        if(n&1){
            ans=ans%p*a%p;
        }
        a=a%p*a%p;
        n>>=1;
    }
    return ans;
}

inline ll inv(ll a,ll p){
    return qpow(a,p-2,p);
}

void solve(){
    int a,b,n;
    cin>>a>>b>>n;
    if(n<5){
        cout<<0<<endl;
        return ;
    }
    ll ans=1;
    ans=(qpow(b-a, 2, M)*qpow(a,3,M)%M*(n-4)%M*inv(qpow(b,5,M),M))%M;
    cout<<ans<<endl;
}

int main(){
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    
    return 0;
}

标签:隔板,int,题解,ll,石子,Alice,第四届,程序设计,描述
From: https://www.cnblogs.com/beater/p/17803875.html

相关文章

  • [ABC326D] ABC Puzzle 题解
    题意:给定整数\(N\),字符串\(R,C\),构造满足以下条件的\(N\timesN\)矩阵:1.每一行和每一列中\(A,B,C\)各有且仅有一个。2.第\(i\)行的第一个字母等于字符串\(R\)的第\(i\)个字符。3.第\(i\)列的第一个字母等于字符串\(C\)的第\(i\)个字符。看数据范围考虑应该......
  • P4067 [SDOI2016] 储能表 题解
    [SDOI2016]储能表-洛谷题目详情-[SDOI2016]储能表-BZOJbyHydroOJ一道很好的数位dp题不过这题有一个比较有意思的性质:当\(n,m\)为\(2^k\)的形式时,最终得到的数组对每一行排序后为\(0\simm-1\)的排列,如果有的话说不定可以作为一个部分分?遇到二进制运......
  • 监控易亮相第四届瓦斯发电行业创新技术应用高峰论坛
      北京美信时代科技有限公司旗下自主研发的集中式、跨平台一体化IT监控运维管理平台——监控易,亮相于2023年11月1日至2日在陕西省西安市万丽酒店举办的第四届瓦斯发电行业创新技术应用成果高峰论坛。此次论坛以“聚焦瓦斯综合利用,聚力绿色低碳发展”为主题,旨在推动瓦斯发电行业......
  • 11月3号晚上测试题解
    3954ProblemA变量交换输出#include<stdio.h>intmain(){inta,b,c,x;scanf("%d%d%d",&a,&b,&c);//假设a,b,c分别为1,2,3;选择一个中间值进行数值替换x=a;//把a赋值给x,此时x就等于a的值为1a=c;//把c赋值给a,此时a就等于c的值为3c=b;//把b赋......
  • CF1874F Jellyfish and OEIS 题解
    题目链接不明白出题人的脑回路是不是被宇宙射线改变过/jy。题目给出了若干个区间,要我们计算满足每个区间都不是对应下标的排列的数量,正着计算不满足要求的数量是困难的,我们将其容斥,转化为钦定一些区间要求其必须满足它是对应下标的排列,在下文中,我们称这样的区间为一个约束。我......
  • 题解 P6560 [SBCOI2020] 时光的流逝
    题解P6560[SBCOI2020]时光的流逝首先考虑图上的点为\(y\)终点时,或者这个点无法继续向下走,即\(du_i=0\)时,从这个点为起点先手必败,而对于每一个有一条指向先手必败的点的边的点,显然从这个点出发都是先手必胜的,以此类推。可以考虑建反图,进行拓扑排序,转移状态。#include<q......
  • 题解 [ARC149B] Two LIS Sum
    题解[ARC149B]TwoLISSum大胆猜结论,按照\(a\)数组为关键字进行排序,求更改后\(b\)的\(LIS\)。证明:每次移动,都有\(a\)中增加一个长度,\(b\)中贡献可能为\(\{-1,0,1\}\),总体贡献为\(\{0,1,2\}\),具体为:\(b\)中排序后大数变到小数前方。\(b\)中排序后小数仍然......
  • 软件设计实验1:UML与面向对象程序设计原则
    实验1:UML与面向对象程序设计原则本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、掌握面向对象程序设计中类与类之间的关系以及对应的UML类图;2、理解面向对象程序设计原则。 [实验任务一]:UML复习阅读教材第一章复习UML,回答下述问题:面向对象程序设计中类与类的关......
  • CF1872E Data Structures Fan 题解
    CF1872E翻译请把数据加强到\(\sumn\leq10^8\)后重新思考。我们维护全局中被标记的所有点的异或和。发现对于一次\(1\)操作,相当于让答案异或上区间的\(a_i\)异或和,因为这会让被标记的点变成没被标记的,而没被标记的点会产生贡献。查询的话直接查询即可复杂度......
  • P2391 白雪皑皑 题解
    一种很新的区间染色题目传送门题目大意有\(n\)个数初始都为\(0\),有\(m\)次操作,第\(i\)次将\((i\timesp+q)\bmodn+1\)与\((i\timesq+p)\bmodn+1\)之间数都改为\(i\),问\(m\)次操作后每个数分别是多少。其中\(1\len\le10^6,1\lem\le1......