洛谷 P2118 比例简化

来源:互联网 发布:mac缺少图像源地址 编辑:程序博客网 时间:2024/06/11 05:20

题目描述

在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有1498 人,反对的有 902人,那么赞同与反对的比例可以简单的记为1498:902。

不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。

现给出支持人数A,反对人数B,以及一个上限L,请你将A比B化简为A’比B’,要求在A’和B’均不大于L且A’和B’互质(两个整数的最大公约数是1)的前提下,A’/B’ ≥ A/B且A’/B’ - A/B的值尽可能小。

(本题目为2014NOIP普及T2)

输入输出格式

输入格式:
输入共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。

输出格式:
输出共一行,包含两个整数A’,B’,中间用一个空格隔开,表示化简后的比例。

输入输出样例

输入样例#1:
1498 902 10
输出样例#1:
5 3
说明

对于100%的数据,1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100,A/B ≤ L。


【分析】
暴力枚举…


【代码】

//NOIP 2013 华容道 #include<queue>#include<vector>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define mp make_pair#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int n,m,q,ex,ey,sx,sy,tx,ty,ans;vector < pair<int,int> > f[35][35];struct node {int x,y,whe,now;};  //目标棋子坐标,空白格子相对坐标,当前移动时间 //1上 2下 3左 4右 int map[35][35],dis[35][35];int hox[5]={0,-1,1,0,0},hoy[5]={0,0,0,-1,1};bool vis_bfs[35][35][5],vis_spfa[35][35];inline int spfa(int stx,int sty,int edx,int edy,int vix,int viy){    if(stx==edx && sty==edy) return 0;    int i,j,k;M(vis_spfa);    memset(dis,0x3f,sizeof dis);    dis[stx][sty]=0;    vis_spfa[vix][viy]=vis_spfa[stx][sty]=1;    queue < pair<int,int> > que;    while(!que.empty()) que.pop();    que.push(mp(stx,sty));    while(!que.empty())    {        pair<int,int> tmp=que.front();que.pop();        int ux=tmp.first,uy=tmp.second;        fo(i,0,f[ux][uy].size()-1)        {            int vx=f[ux][uy][i].first,vy=f[ux][uy][i].second;            if(!vis_spfa[vx][vy])            {                vis_spfa[vx][vy]=1;                que.push(mp(vx,vy));                dis[vx][vy]=dis[ux][uy]+1;            }            if(dis[edx][edy]<100000) return dis[edx][edy];        }    }    return 100000;}inline void bfs(int x,int y){    int i,j,k;    int ddd[35][35][5];    memset(ddd,0x3f,sizeof ddd);    queue <node> que;    M(vis_bfs);    while(!que.empty()) que.pop();      if(map[x-1][y])      que.push(node{x-1,y,2,spfa(ex,ey,x-1,y,x,y)+1}),vis_bfs[x-1][y][2]=1;    if(map[x+1][y])      que.push(node{x+1,y,1,spfa(ex,ey,x+1,y,x,y)+1}),vis_bfs[x+1][y][1]=1;    if(map[x][y+1])      que.push(node{x,y+1,3,spfa(ex,ey,x,y+1,x,y)+1}),vis_bfs[x][y+1][3]=1;    if(map[x][y-1])      que.push(node{x,y-1,4,spfa(ex,ey,x,y-1,x,y)+1}),vis_bfs[x][y-1][4]=1;    while(!que.empty())    {        node tmp=que.front();que.pop();        int ux=tmp.x,uy=tmp.y,now=tmp.now,whe=tmp.whe;        if(ux==tx && uy==ty) ans=min(ans,now);        fo(i,0,f[ux][uy].size()-1)        {            int vx=f[ux][uy][i].first,vy=f[ux][uy][i].second; //棋子位置             fo(j,1,4) if(ux==vx+hox[j] && uy==vy+hoy[j]) break;            int nul=now+spfa(ux+hox[whe],uy+hoy[whe],vx,vy,ux,uy)+1;            if(!vis_bfs[vx][vy][j] || nul<ddd[vx][vy][j])            {                if(nul>100000 || nul>ans) break;                ddd[vx][vy][j]=min(ddd[vx][vy][j],nul);                vis_bfs[vx][vy][j]=1;                que.push(node{vx,vy,j,nul});                if(vx==tx && vy==ty)                  ans=min(ans,nul);            }        }    }}int main(){    int i,j;    scanf("%d%d%d",&n,&m,&q);    fo(i,1,n)      fo(j,1,m)        scanf("%d",&map[i][j]);    fo(i,1,n)      fo(j,1,m)        if(map[i][j])        {            if(map[i-1][j]) f[i][j].push_back(mp(i-1,j));            if(map[i][j-1]) f[i][j].push_back(mp(i,j-1));            if(map[i+1][j]) f[i][j].push_back(mp(i+1,j));            if(map[i][j+1]) f[i][j].push_back(mp(i,j+1));        }    while(q--)    {        ans=100000;        scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);        if(sx==tx && sy==ty) {printf("0\n");continue;}        bfs(sx,sy);        if(ans<100000) printf("%d\n",ans);        else printf("-1\n");    }    return 0;}
1 0
原创粉丝点击