2018.8.10模拟赛

T1
叕出锅了。。。
大意:求一个最小的数的阶乘是给定的n个数的乘积的倍数。
二分边界定小,WA了两个点。二分边界不要省啊。。。多不了多少时间。。。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=100005;
int n,a[N],prime[N],jc[N],cnt[N],tot,id[N];
bool vis[N];
void p() {
	for(int i=2;i<=100000;i++) {
		if(!vis[i]) prime[++tot]=i,id[i]=tot;
		for(int j=1;j<=tot&&prime[j]*i<=100000;j++) {
			vis[prime[j]*i]=1;if(i%prime[j]==0) break;
		}
	}
}
bool ck(int x) {
	for(int i=1;i<=tot;i++) {
		if(cnt[i]) {
			int tmp=0,tp=prime[i];
			while(x>=tp) {tmp+=x/tp;tp*=prime[i];if(tmp>=cnt[i]) break;}
			if(tmp<cnt[i]) return 0;
		}
	}return 1;
}
int main() {
//	freopen("factorial.in","r",stdin);
//	freopen("factorial.out","w",stdout);
	scanf("%d",&n);
	p();
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) {
		for(int j=1;prime[j]<=a[i];j++) {
			while(a[i]%prime[j]==0) 
			cnt[j]++,a[i]/=prime[j];
			if(!vis[a[i]]) cnt[id[a[i]]]++,a[i]/=a[i];
		}
	}
	static int l=1,r=0x7fffffff,ans=0;
	while(l<=r) {
		int mid=l+r>>1;
		if(ck(mid)) ans=mid,r=mid-1;
		else l=mid+1;
	}
	cout<<ans;
}

T2
ZZ搜索题,ZZ写错了。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
queue<int>q;
int n,m;
int c[202],g[505][505];
static char s[505];
int dis[505][505][5];
struct Node {int x,y,dir;};
bool ck(int x,int y) {return (x>0&&x<=n&&y>0&&y<=m&&(g[x][y]!=4||x==n&&y==m));}
int id(int x,int y,int dir) {return (x-1)*m+y+501*501+dir+1;}
int main() {
	scanf("%d%d",&n,&m);
	c['U']=0,c['D']=1,c['R']=2,c['L']=3,c['S']=4;
	for(int i=1;i<=n;i++) {
		scanf("%s",s);
		for(int j=1;j<=m;j++) 
			g[i][j]=c[s[j-1]];
	}
	memset(dis,0x3f,sizeof dis);
	queue<Node>q;
	if(g[1][1]!=2)q.push({1,1,2}),dis[1][1][2]=0;
	if(g[1][1]!=1)q.push({1,1,1}),dis[1][1][1]=0;
	while(!q.empty()) {
		Node u=q.front();q.pop();
		int i=u.x,j=u.y,x=i,y=j;
		if(g[i][j]==4) continue;
		if(g[i][j]!=0&&ck(x-1,y)&&dis[x-1][y][0]>dis[i][j][u.dir]+(u.dir!=0)) dis[x-1][y][0]=dis[i][j][u.dir]+(u.dir!=0),q.push({x-1,y,0});
		if(g[i][j]!=1&&ck(x+1,y)&&dis[x+1][y][1]>dis[i][j][u.dir]+(u.dir!=1)) dis[x+1][y][1]=dis[i][j][u.dir]+(u.dir!=1),q.push({x+1,y,1});
		if(g[i][j]!=2&&ck(x,y+1)&&dis[x][y+1][2]>dis[i][j][u.dir]+(u.dir!=2)) dis[x][y+1][2]=dis[i][j][u.dir]+(u.dir!=2),q.push({x,y+1,2});
		if(g[i][j]!=3&&ck(x,y-1)&&dis[x][y-1][3]>dis[i][j][u.dir]+(u.dir!=3)) dis[x][y-1][3]=dis[i][j][u.dir]+(u.dir!=3),q.push({x,y-1,3}); 
	}
	cout<<min(min(dis[n][m][1],dis[n][m][0]),min(dis[n][m][2],dis[n][m][3]));
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9457113.html