2018.8.10 提高B组模拟赛
T1  阶乘 
Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits 
Goto ProblemSet
Description
有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值。
Input
共两行。 
第一行一个正整数n。 
第二行n个正整数a[i]。
Output
共一行 
一个正整数m。
Sample Input
1 
6
Sample Output
3
样例解释: 
当p=6,q=1时,p*q=3!
Data Constraint
对于10%的数据,n<=10 
对于30%的数据,n<=1000 
对于100%的数据,n<=100000,a[i]<=100000
解题思路
可以发现被选出的m的阶乘的每个质因数的个数都一定大于a[i]的乘积,所以可以二分答案,然后判断。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 100005;
typedef long long LL;
inline int rd(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return x*f;
}
int n,cnt,prime[10000],ans,mx;
LL num[MAXN];
bool vis[MAXN];
inline void solve(int x){
    int t=0;
    while(++t){
        while(x%prime[t]==0){
            num[prime[t]]++;
            x/=prime[t];mx=max(mx,t);
        }
        if(x==1) break;
    }
}
inline bool check(int x){
    for(register int i=1;i<=mx;i++){
        int now=0;
        for(register int j=prime[i];j<=x;j=j*prime[i]) {
            now+=x/j;
            if(now>=num[prime[i]]) break;
        }
        if(now<num[prime[i]]) return false;
    }return true;
}
int main(){
    freopen("factorial.in","r",stdin);
    freopen("factorial.out","w",stdout);
    for(register int i=2;i<=100000;i++){
        if(!vis[i]) {prime[++cnt]=i;vis[i]=1;}
        for(register int j=1;j<=cnt && (LL)prime[j]*i<=100000;j++) {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
    n=rd();
    for(register int i=1;i<=n;i++){
        int x=rd();
        solve(x);
    }
    int l=1,r=1e9;
    while(l<=r){
        int mid=l+r>>1;
        if(check(mid)){
            ans=mid;
            r=mid-1;
        }else l=mid+1;
    }cout<<ans<<endl;
    return 0;
}T2 小S爱跑步
Description
   小S是一个爱锻炼的孩子,他在放假期间坚持在A公园练习跑步。
  但不久后,他就开始为在重复的地点练习感到厌烦了,他就打算去B公园跑步。
  但是小S由于没有去过B公园,他不知道B公园是否适合练习跑步,又不知道在B公园怎样跑是最优的。所以小S就去B公园进行了一番勘测。
  小S在进行了一番勘测后,画出了一张地图,地图每一个位置上都辨识了小S到达该位置后不能往哪一个方位移动。其中有5种表示的符号:“U”代表不能向上移动,“D”代表不能向下移动,“L”代表不能向左移动,“R”代表不能向右移动,如果该位置有障碍物,小S到达那里后无法继续训练,就用“S”来代表。整个公园共有n行m列,小S会从第1行第1列出发,到第n行第m列结束他的练习。
  现在小S想要知道,从起点(即第1行第1列)到终点(第n行第m列),途中最少要改变几次方向(即上一次移动的方向和这一次移动的方向不一样)?
  注意:小S如在训练途中离开公园(即地图范围),则算是结束训练。
Input
  第1行两个整数n和m,它们的定义请看【题目描述】。
  第2~n+1行,每行有m个字符,表示小S的移动方向。
Output
  如果小S从第1行第1列出发无论如何都到达不了第n行第m列,输出“No Solution”,否则输出小S途中最少要改变方向的次数。
Sample Input
3 3 
ULL 
LDU 
SUD
Sample Output
1
【样例解释】 
      小S先向右移动移动了2格,再向下移动2格,就到达了终点,这样只用改变一次方向。
Data Constraint
【数据范围限制】
10%的数据是题目的馈赠。 
30%的数据,1≤n,m≤10。 
50%的数据,1≤n,m≤50。 
70%的数据,1≤n,m≤250。 
100%的数据,1≤n,m≤500. 
其中50%的数据是先构造出路径,再构造地图的。 
100%数据是随机构造的。
解题思路
直接bfs,模仿spfa的形式。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 505;
int n,m,ans[MAXN][MAXN][8];
int xx[5]={0,0,0,1,-1},yy[5]={0,-1,1,0,0};
char c[MAXN][MAXN];
bool vis[MAXN][MAXN][8];
queue<int> Q[4];
inline int pre(char ch){
    if(ch=='S') return 0;
    if(ch=='L') return 1;
    if(ch=='R') return 2;
    if(ch=='D') return 3;
    return 4;
}
int main(){
    freopen("run.in","r",stdin);
    freopen("run.out","w",stdout);
    memset(ans,0x3f,sizeof(ans));
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;i++) scanf("%s",c[i]+1);
    Q[1].push(1);Q[2].push(1);Q[3].push(5);vis[1][1][5]=1;ans[1][1][5]=-1;
    while(Q[1].size()){
        int x=Q[1].front(),y=Q[2].front(),k=Q[3].front();int w=ans[x][y][k];
        Q[1].pop();Q[2].pop();Q[3].pop();if(c[x][y]=='S') continue;
        for(register int z=1;z<=4;z++){
            if(pre(c[x][y])==z) continue;
            int ii=xx[z]+x;int jj=yy[z]+y;
            if(ii>=1 && ii<=n && jj>=1 && jj<=m)
                if(ans[ii][jj][z]>w+(z!=k)){
                    ans[ii][jj][z]=w+(z!=k);
                    if(!vis[ii][jj][z]){
                        Q[1].push(ii);Q[2].push(jj);Q[3].push(z);
                        vis[ii][jj][z]=1;
                    }
                }
        }
        vis[x][y][k]=0;
    }ans[n][m][1]=min(ans[n][m][1],ans[n][m][0]);
    cout<<min(min(min(ans[n][m][1],ans[n][m][2]),ans[n][m][3]),ans[n][m][4]);
    return 0;
}2018.8.10 提高B组模拟赛的更多相关文章
- 2018 8.8 提高A组模拟赛
		T1 Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼. 该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+ ... 
- JZOJ5804. 【2018.08.12提高A组模拟】简单的序列
		性质:每个位置的前缀和必须大于0,总和=0.以此dp即可. #include <iostream> #include <cstdio> #include <cstring ... 
- NOIP2017提高组模拟赛 10 (总结)
		NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ... 
- JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动
		5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms ... 
- JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间
		5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms Memo ... 
- ZROI提高组模拟赛05总结
		ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ... 
- NOIP2017提高组 模拟赛15(总结)
		NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ... 
- NOIP2017提高组 模拟赛13(总结)
		NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ... 
- NOIP2017提高组模拟赛 9 (总结)
		NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ... 
随机推荐
- CF #575 Div3
			// 比赛链接:https://codeforces.com/contest/1196 // CF 2019.7.24 // 本想Div3手速场上分,结果卡在C题,掉了不少分. // 自闭了这么久,今 ... 
- MyEclispe点击add deploment 无反应的处理,无法添加项目到Tomcat
			比如你的工作空间为 E:\workspace-project 找到以下路径: E:\workspace-project\.metadata\.plugins\org.eclipse.core.runt ... 
- elasticsearch 中文API 删除(四)
			删除API 删除api允许你通过id,从特定的索引中删除类型化的JSON文档.如下例: DeleteResponse response = client.prepareDelete("twi ... 
- 基于httpd2.2配置https
			本次演示使用一台主机实现,即自签自演 主机IP:192.168.1.105 开始配置: 1.创建私有CA # cd /etc/pki/CA # touch serial # touch index.t ... 
- HZOI20190817模拟24
			题面:https://www.cnblogs.com/Juve/articles/11369181.html A:Star Way To Heaven 考场上以为只能走直线,于是挂掉了. 有一种方法是 ... 
- Activiti实战04_简单流程
			在Activiti实战03_Hello World中我们介绍了一个中间没有任何任务的流程,实现了流程的部署与查阅,而在本章中,将会为流程添加任务节点,是流程能够像个流程,变得更加丰满起来. 在上一节的 ... 
- 016-WebDriver API(2)
			1. 多表单切换 WebDriver只能在一个页面上对元素进行识别和定位,无法直接定位frame/iframe表单内嵌页面上的元素,这是就需要通过switch_to.frame()方法将当前定位的主体 ... 
- Linux Shell脚本经典案例
			开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的,在函数中变量 ... 
- GULP入门之API(二)
			GULP的API gulp.src(globs[, options]) 输出(Emits)符合所提供的匹配模式(glob)或者匹配模式的数组(array of globs)的文件. 将返回一个 Vin ... 
- 解决CSocket高数据传输问题
			这个是自己项目中发现的问题,所以这个不一定适用于你的. 仅供参考. 头文件: ESSocket.h // ESSocket.h : header file // #ifndef ESSOCKET_H ... 
