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

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络 服务器端配置 在服务器端,你需要确保安装了必要的驱动程序和软件包,并且正确配置了网络接口。 安装 OFED 首先,安装 Open Fabrics Enterprise Distribution (OFED),它包含了 InfiniBand 所需的驱动程序和库。 sudo