ACM训练日记—4月21日(西安电子科技大学第16届程序设计竞赛网络同步赛)

本文主要是介绍ACM训练日记—4月21日(西安电子科技大学第16届程序设计竞赛网络同步赛),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        整理下题目。

前三个题超水,就不整理了。

D—另一个另一个简单游戏

题目:现在有n个数,每次随机取出两个数x,y,然后加入一个数为(x+y)/2,问最后剩下的那个数的期望是多少?

     可以看到每次去掉两个数,加入其中位数,那么操作n-1次后剩下的数相当于平均数,写写样例就能发现

代码:

ll a[105];
int main()
{
    ll n,k;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll ans=0;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            ans+=a[i];
        }
        ans=ans/n;
        cout<<ans<<endl;
    }
}

 F—Operating System

题目:现在有一个大小为可以容纳N个页面的内存,硬盘内的内容被分成M个页面,用1~M来标识,一开始内存里没有任何页面,接下来用户会请求Q个页面,你需要设计一个置换算法,使得缺页发生的次数最少。缺页是指用户请求某个编号的页面,但这个页面没有在内存中的情况。发生缺页之后,你必须要把硬盘内对应的页面调入内存中,如果内存已满,你需要置换掉当前内存中的某个页面。

     这个题其实就是贪心+模拟

 先处理出序列每一位数下一次出现在哪个位置,没在出现的赋值-1,然后找一个优先队列(从小到大排),遍历数列,如果第i位上的数在队列里就continue,如果不在就取出优先队列里最小的数。

 代码:

int n,m,q;
int a[50005];
int mp[50005];
int vis[50005];
int main()
{
    priority_queue<int>h;
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        while(!h.empty()) h.pop();
        memset(vis,-1,sizeof(vis));
        memset(mp,0,sizeof(mp));//记录该位上的值下次出现的位置
        for(int i=1;i<=q;i++)
        {
            scanf("%lld",&a[i]);
            if(mp[a[i]]==0)
            {
                mp[a[i]]=i;
            }
            else
            {
                int t=a[i];
                vis[mp[t]]=i;
                mp[t]=i;
            }
        }
        //for(int i=1;i<=q;i++) cout<<vis[i]<<" ";cout<<endl;
        memset(mp,0,sizeof(mp));
        int ans=0;
        for(int i=1;i<=q;i++)
        {
            if(mp[a[i]]) continue;//该值在队列里
            if(h.size()<n)//队列不满,继续放
            {
                h.push(vis[i]);
                mp[a[i]]=1;
                ans++;
            }
            else//取出最小的,因为会优先取出-1(后面没在出现的值)
            {
                ll e=h.top();
                h.pop();
                h.push(vis[i]);
                mp[e]=0;
                mp[a[i]]=1;
                ans++;
            }
        }
        cout<<ans<<endl;
    }
}

E—Xieldy And His Password

为了改变这一现状,他random了一个01串,并从中截取了一段作为自己的口令。

他选择的口令满足以下条件:
1. 口令串表示的二进制数在十进制下可以被表示为3k(k>=0)。
2. 口令串可以有前导零。
现已经random出了01串,他想知道有多少种口令方案可以选择(不同的子段即为不同)。

       首先,一个二进制序列后面添上个0,相当于此二进制数乘2。一个二进制序列后面添上个1,相当于此二进制数乘2加1。

      那么dp[i][j]表示以i位为结尾的数mod3余j,那么

当a[i]=='0'

dp[i][0]=1//表示以这第i位开头的情况,下面是由前面类推出来的

dp[i][0]+=dp[i-1][0];//mod3=0的数乘2还是可以被3整除
dp[i][1]+=dp[i-1][2];//后面依次类推
dp[i][2]+=dp[i-1][1];

当a[i]=='1'

dp[i][1]=1//表示以i位开头的情况。

dp[i][0]+=dp[i-1][1];
dp[i][1]+=dp[i-1][0];
dp[i][2]+=dp[i-1][2];

       这样依次加和dp[i][0]就可以了。

代码:

#define N 1000010
char a[N];
long long dp[N][3];
int main()
{
    long long s;
    int i,j,k;
    while(scanf("%s",a+1)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        k=strlen(a+1);
        s=0;
        for(i=1;i<=k;i++)
        {
            if(a[i]=='0')
            {
                dp[i][0]=1;
                dp[i][0]+=dp[i-1][0];
                dp[i][1]+=dp[i-1][2];
                dp[i][2]+=dp[i-1][1];
            }
            else
            {
                dp[i][1] = 1;
                dp[i][0]+=dp[i-1][1];
                dp[i][1]+=dp[i-1][0];
                dp[i][2]+=dp[i-1][2];
            }
            s=s+dp[i][0];
        }
        printf("%lld\n",s);
    }
    return 0;
}

G—小国的复仇

题目:在游戏中他要得到n个小国,初始的时候小国和小杰各有1个。经过了很久的修炼,汀老师学会了两种魔法,他每次可以动用自己的智慧来使用魔法。
第一个魔法:(小杰变小国)可以将自己的智慧复制和当前小杰一样数量的小国出来;
第二个魔法:(小国大爆发)可以将当前的小杰变成和小国的数量一样,然后小国的数量加倍!
因为汀老师的智力是无限多的,他不关心花掉的智力大小。但是好学的汀老师想尽快得到n个小国,使得能有更多的时间去读paper和打比赛。他想问问你,最少需要使用多少次魔法可以得到n个小国。
得到了n个小国后,汀老师去学习,但是小国们基因突变在电脑里越来越多!他们来组织汀老师学习,现在告诉汀老师我要得到更多的同伴!

       其实画一下二叉树图就能很容易发现规律,假如给出一个数n,如果n是素数,ans=n-1,如果是合数,就是将n分解为若干素数加和,n=a1+a2+...an(ai是素数),那么ans=(a1-1)+...(an-1)。

代码:

const int MAXN = 1000010;
int len = 0, prime[MAXN], f[MAXN];
bool notPrime[MAXN];
void makePrime() {
    for(int i = 2; i < MAXN; ++ i) {
        if(!notPrime[i]) {
            prime[++ len] = i;
            for(int j = 2; j * i < MAXN; ++ j)
                notPrime[j * i] = 1;
        }
    }
    return ;
}
int main() {
    makePrime();
    int n, i, j, tmp;
    for(i = 1; i <= len; ++ i)
        f[prime[i]] = prime[i] - 1;
    for(i = 4; i < MAXN; ++ i) {
        if(notPrime[i]) {
            tmp = i;
            for(j = 1; j <= len && prime[j] <= tmp; ++ j) {
                while(tmp % prime[j] == 0) {
                    f[i] += f[prime[j]];
                    tmp /= prime[j];
                }
                if(f[tmp]) {
                    f[i] += f[tmp];
                    tmp = 0;
                }
            }
            if(tmp) f[i] += f[tmp];
        }
    }
    cin >> n;
    while(n --) {
        scanf("%d", &i);
        printf("%d\n", f[i]);
    }
    return 0;
}

      

这篇关于ACM训练日记—4月21日(西安电子科技大学第16届程序设计竞赛网络同步赛)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/606682

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意