ZOJ Monthly, March 2018 A B C J H

2024-04-01 18:48
文章标签 2018 zoj monthly march

本文主要是介绍ZOJ Monthly, March 2018 A B C J H,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A Easy Number Game

贪心 很容易想到,将数列排序 将前2n个数 掐头去尾的相乘求和

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int T;
int n,m;
int s[100100];
int main()
{cin>>T;while(T--){cin>>n>>m;for(int i=0;i<n;i++)cin>>s[i];sort(s,s+n);long long int res=0;for(int i=0;i<m;i++){res+=s[i]*s[2*m-i-1];}cout<<res<<endl;}return 0;
}


B Lucky Man

卡在了第五题上,规律发现了 但是当时做不到快速的得到1000位长度的大整数的平方根而超时,现在已经解决,就是运用模拟笔算的方式得到,1880ms过了题,限制是2000ms

同时也知道了可以用Python直接输入大整数进行牛顿迭代的方法得到。

#include <stdio.h> 
#include <string.h> 
#include <iostream>
using namespace std;
int l; 
char an[1111];
int js=0;
int work(int o,char *O,int I) 
{ 
char c, *D=O ; 
if(o>0) 
{ 
for(l=0;D[l];D[l++]-=10) 
{ 
D[l++]-=120; 
D[l]-=110; 
while(!work(0,O,l)) 
D[l]+=20; 
an[js++]=(D[l]+1032)/20;
} 
} 
else 
{ 
c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9; 
D[I]+=I<0 ? 0 : !(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10); 
} 
return o; 
} int main() 
{ 
int t;
cin>>t;
while(t--)
{
char s[1200]={};s[0]='0'; 
scanf("%s",s+1); 
js=0;
if(strlen(s)%2 == 1) 
work(2,s+1,0); 
else 
work(2,s,0); 
if((an[js-1]-'0')%2==1)cout<<"1"<<endl;
else cout<<"0"<<endl; 
}
return 0; 
}


C Travel along the Line

概率题,在无现长数轴上,给定起点和终点的距离,给出时间,每一秒有0.25的概率前进,0.25的概率后退,0.5的概率不懂,问在时间用完的时候恰好在终点的概率。 当时列了个式子,想着用lucas算法去解大组合数,结果超时,后来把式子化简一下,打了个阶乘表,就过了,以后碰到10e5以内的组合数 优先考虑打表。


#include<bits/stdc++.h>
using namespace std;
#define LL long long 
LL p = 1e9+7;
LL quick_mod(LL a, LL b)
{LL ans = 1;a %= p;while(b){if(b & 1){ans = ans * a % p;b--;}b >>= 1;a = a * a % p;}return ans;
}long long  jc[100005];LL inv(LL a)
{if(a==1)return 1;return inv(p%a)*(p-p/a)%p;
}
int main(){long long int n,m;jc[0]=1;for(int i=1;i<=100000;i++){jc[i]=i*jc[i-1]%p;}int t;cin>>t;while(t--){cin>>n>>m;m=abs(m);long long int ans=0;for(int i=n-m;i>=0;i-=2){long long in=quick_mod(2,2*n-i);long long a1=jc[(n-i-m)/2]*jc[(n-i+m)/2]%p;a1=a1*jc[i]%p;ans=(ans+jc[n]%p*inv(in*a1%p)%p)%p;}cout<<ans<<endl;}return 0;
}


H Happy Sequence

dp题,从1到n 求长度为m的good数列的个数,即数列中前一个数可以整除后面一个数,主要思路就是将长度为k的某个数列的最后一个数能整除的数放到后面 使该数列的长度变为k+1,从而可以写出状态转移方程。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int mod=1000000007;
int T;
int n,m;
int dp[2002][2002];
vector<int> fac[2002];
int main()
{for(int i=1;i<=2000;i++){for(int j=1;j<=sqrt(i*1.0);j++){if(i%j==0){fac[i].push_back(j);if(j!=i/j)fac[i].push_back(i/j);}}}memset(dp,0,sizeof(dp));for(int i=0;i<=2000;i++)dp[i][1]=1;for(int i=2;i<=2000;i++){for(int j=1;j<=2000;j++){for(int k=0;k<fac[j].size();k++){(dp[j][i]+=dp[fac[j].at(k)][i-1])%=mod;}}}for(int i=1;i<=2000;i++){for(int j=2;j<=2000;j++){(dp[j][i]+=dp[j-1][i])%=mod;}}cin>>T;while(T--){cin>>n>>m;cout<<dp[n][m]<<endl;}return 0;
}


J Super Brain

快速找出2个数列中出现2次的数,数据范围很小,所以很简单。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int T,x;
int n,m;
bool s[1000100];
int main()
{cin>>T;while(T--){cin>>n;memset(s,0,sizeof(s));for(int i=0;i<n;i++){cin>>x;s[x]=1;}for(int i=0;i<n;i++){cin>>x;if(s[x])cout<<x<<endl;}}return 0;
}

这篇关于ZOJ Monthly, March 2018 A B C J H的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

ZOJ 3324 Machine(线段树区间合并)

这道题网上很多代码是错误的,由于后台数据水,他们可以AC。 比如这组数据 10 3 p 0 9 r 0 5 r 6 9 输出应该是 0 1 1 所以有的人直接记录该区间是否被覆盖过的方法是错误的 正确方法应该是记录这段区间的最小高度(就是最接近初始位置的高度),和最小高度对应的最长左区间和右区间 开一个sum记录这段区间最小高度的块数,min_v 记录该区间最小高度 cover

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录   docker-compose up -d #启动靶场   docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at