vijos之清帝之惑四题

T1:清帝之惑之康熙

背景

康熙是中国历史乃至世界历史中最伟大的帝王之一,清除螯拜,撤除三藩,统一台湾,平定准葛尔叛乱;与此同时,出众的他也被世界各国遣清使臣所折服。康熙是历史上少有的全人,不仅文武兼得,而且在各各方面都有见地,比如说航海、数学、英语、构图、建筑等等。一个最好的例子可以证明:康熙当年演算代数题的草稿纸至今仍然保存完好。

话说康熙掌权之后,每天都抽空做数学题,特别是无聊题。这些天,某某老师开始教他做一些奇怪的题目。在第一节课的时候,老师就问了康熙一个超BT的题目:

描述

话说西汉时期,汉武帝刘彻派遣张骞出使西域,欲同月氏国结交而共驱匈奴。同时,月氏国也欲同大汉结交,也派出使者康破伦出使大汉,可是因为月氏国对于大汉的认知甚少,康破伦同样向西出使大汉。一开始,张骞从大汉出发,康破伦从月氏国出发,两人都在同一纬度线上,张骞所处的经度为x,康破伦所处的经度为y;接下来,两人同时向西走,而且只能向西走,张骞每天走m公里,康破伦每天走n公里,且每天走路的速度不变,也不停下来休息;这样两人就在这一条长为L的纬度线上一直向西走。问:过了多少天之后张骞和康破伦会碰面,并磋商两国结交之事(所谓碰面,是指在经过了完整的若干天之后两人处在同一经度上,也就是说存在一个天数d,使得张骞从x出发走了d×md\times md×m公里后与康破伦从y出发走了d×nd\times nd×n公里后在同一个位置)。

这下,康熙犯难了,他还是个不大的青年,怎么可能做得出这么难的题目;但是,他又是统领全国的帝皇,怎么能在老师面前丢这么大一个面子。康熙想:不行!一定得把这个题做出来!(然后就有了下面这段记录)
第一天,……
第二天,…………
第三天,………………
第四天,……………………
第五天,…………………………
第六天,………………………………
第七天,……………………………………!!!!!!!
啊!第七天,康熙终于打了7个感叹号,得出了一个重要的结论!!!!!那就是——做不出来。(汗),没办法,他只有请教你,他的挚友,帮他解决这一难题。康熙答应你,如果你把这一题做出来了,你将得到御赐赏银一万万mod1两!-。为了改变你生活的现状——衣衫褴褛、闻鼠起舞、蟑螂为伴,你下定了决心——我一定得把这题解决!

格式

输入格式

输入只包括一行5个整数x,y,m,n,L
其中0<x≠y < =2000000000,0 < m、n < =2000000000,0 < L < =2100000000。

输出格式

输出碰面所需要的天数,如果永远不可能碰面则输出一行"Impossible"。

样例1

样例输入1

1 2 3 4 5

样例输出1

4
这道题是扩展gcd模板题。
#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long
ll x,y,n,m,L;
void kzgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(b==0)
    {
        d=a;x=1;y=0;
        return;
    }
    kzgcd(b,a%b,d,y,x);
    y-=a/b*x;
}
int main()
{
    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L);
    ll a=((n-m)%L+L)%L;
    ll b=L;
    ll c=((x-y)%L+L)%L;
    ll d,e,p,q;
    kzgcd(a,b,d,p,q);
    if(c%d)
    {
        printf("Impossible");
        return 0;
    }
    e=b/d;
    printf("%lld",((p*(c/d))%e+e)%e);
}
T2:清帝之惑之乾隆

背景

 
乾隆,雍正的第四子,在位60年,退位后又当了三年太上皇,终年89岁。
 
乾隆即位之初,实行宽猛互济的政策,务实足国,重视农桑,停止捐纳,平定叛乱等一系列活动中,充分体现了他的文治武功,乾隆帝向慕风雅,精于骑射,笔墨留于大江南北,并是一个有名的文物收藏家。清宫书画大多是他收藏的,他在位期间编纂的《四库全书》共收书3503种,79337卷,36304册,其卷数是《永乐大典》的三倍,成为我国古代思想文化遗产的总汇。
 
乾隆好游江南,喜欢江南的山水,喜欢江南的人文,喜欢江南的才气,同时他也喜欢江南的汉族美女。
 

描述

 
话说乾隆带着他的宰相刘罗锅和你出巡江南,被杭州城府邀请去听戏,至于什么戏,那就不知了。乾隆很高兴,撒酒与君臣共享。三更欲回住处,可是乾隆这人挺怪,他首先要到西湖边散散步,而且命令不准有人跟着他。
 
小醉,步于西湖岸,停于断桥前,突闻琴声悠悠,歌儿婉婉。这乐曲不哀伤不愁怅,少了一分怨女的羁绊,多了一分少女的期盼。乾隆走上前去,视其背影,为一女子手抚古琴,悠悠而唱。可是这么晚了,小女怎么还不回家呢,莫非是她起早床?乾隆走上前去,小声问道:“伊为何未宿?”,小女沉默片刻,转身而来。顿时,顿时,顿时!!!!!乾隆惊呆了!!!!哇!!!!噻!!!!!!这人,这伊!!!!原来!!!!!!!不是一个美女(狂汗ing)。小女并未回答她的话,只是与乾隆侃了侃诗。乾隆兴哉,问其曰:“不知偶能助伊否?”,小女曰:“偶无所以助,且有一事相求,愿君能解之。”
 乾隆一看,立刻晕到在地,片刻而起,曰:“明日必解之”,且去。
 
回到家中,乾隆夜召你“入寝”,曰:“如此姑娘,如此情调,如此罗曼蒂克,竟然丢一个如此煞风景之问”,一边发气,一边把这个问题交给你。你一看,顿然发现,原来是用蝌蚪文写的:
 Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems. 
 This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R <= 9999.9) and n is an integer such that 0 < n <= 250. 
 此时的你,已经是皇帝身边的小太监,自然有必要为皇上解决此题。
 

格式

 

输入格式

 
The input will consist of a set (less than 11) of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 to 10.
 

输出格式

 
The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.
 

样例1

 

样例输入1

 
95.123  2
0.4321  5
5.1234  7
6.7592  3
98.999  5
1.0100 10
 

样例输出1

 
9048.385129
.01506334182914325601
92663.3181348508776705891407804544
308.806114738688
9509420210.697891990494999
1.10462212541120451001

高精度乘高精度。


#include <iostream>
#include<stdio.h>
#include<string.h>
int ans[100001];
char s[7];
int main()
{
    int a=1,i,n;
    while(scanf("%s %d",s,&n)==2&&a++)
    {   
  if(a!=2)
   puts("");
        memset(ans,0,sizeof(ans));
        ans[1]=1;
        int dot;
        int b=0;
        int zhen;
        for(i=5;i>=0;i--)
        if(s[i]!='0')
        {
            zhen=i;
            break;
        }
        for(i=0;i<=zhen;i++)
        {
            if(s[i]!='.')
             b=b*10+s[i]-'0';
            else
              dot=(zhen-i)*n;
        }
        int max=1;
        for(i=1;i<=n;i++)
        { 
   int in=0,j;
            for(j=1;j<=max||in;j++)
            {
                int now=b*ans[j]+in;
                ans[j]=now;
                in=ans[j]/10;
                ans[j]%=10;
            }
            if(max<j-1)
            max=j-1;
        }
        for(i=max;i>dot;i--)
         printf("%d",ans[i]);
        if(dot!=0)
         printf(".");
        for(i=dot;i>0;i--)
         printf("%d",ans[i]);
    }
}  
T3:清帝之惑之顺治

背景

顺治帝福临,是清朝入关后的第一位皇帝。他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年。卒于顺治十八年(1661),终24岁。

顺治即位后,由叔父多尔衮辅政。顺治七年,多尔衮出塞射猎,死于塞外。14岁的福临提前亲政。顺治帝天资聪颖,读书勤奋,他吸收先进的汉文化,审时度势,对成法祖制有所更张,且不顾满洲亲贵大臣的反对,倚重汉官。为了使新兴的统治基业长治久安,他以明之兴亡为借鉴,警惕宦官朋党为祸,重视整饬吏治,注意与民休息,取之有节。但他少年气盛,刚愎自用,急噪易怒,当他宠爱的董妃去世后,转而消极厌世,终于匆匆走完短暂的人生历程,英年早逝。他是清朝历史上唯一公开归依禅门的皇帝。

描述

顺治喜欢滑雪,这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待太监们来载你。顺治想知道载一个区域中最长的滑坡。

区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:

1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

顺治可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

格式

输入格式

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 500)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

输出格式

输出最长区域的长度。

样例1

样例输入1

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
dfs+剪枝.
#include <stdio.h>
#include <algorithm>
using namespace std;
int n,m;
int a[501][501];
int f[501][501];
int vis[501][501];
int ans,i,j;
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
int dfs(int x,int y)
{
    if(vis[x][y]) 
  return f[x][y];
    vis[x][y]=1;
    int flag=0;
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]>=a[x][y]) 
   continue;
        flag=1;
        f[x][y]=max(f[x][y],dfs(nx,ny)+1);
    }
    if(flag==0) 
  f[x][y]=1;
    ans=max(ans,f[x][y]);
    return f[x][y];
}
int main()
{
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            dfs(i,j);
    printf("%d",ans);
}
T4:清帝之惑之雍正

背景

 
雍正帝胤祯,生于康熙十七年(1678)是康熙的第四子。康熙61年,45岁的胤祯继承帝位,在位13年,死于圆明园。庙号世宗。
 
胤祯是在康乾盛世前期--康熙末年社会出现停滞的形式下登上历史舞台的。复杂的社会矛盾,为胤祯提供了施展抱负和才干的机会。他有步骤地进行了多项重大改革,高瞻远瞩,又惟日孜孜,励精图治,十三年中取得了卓有成效的业绩,为后代的乾隆打下了扎实雄厚的基础,使“康乾盛世”在乾隆时期达到了顶峰。他的历史地位,同乃父康熙和乃子乾隆相比,毫不逊色。尽管他猜忌多疑,刻薄寡恩,统治严酷,但比起他的业绩来,毕竟是次要的。
 

描述

 
话说雍正为了实施促进城市间沟通的政策,他计划在所有的大城市里挑选两个城市,在两个城市之间修建一条运河,这条运河要求是笔直的,以加强这两个城市的经济往来。但雍正希望这条运河长度越短越好,他请来了宰相和大学士帮他解决这个问题——到底挑哪两个大城市,在其间建造运河,使得其长度最小,最小为多少?可是经过长时间的计算和判断,仍然没有得出结果。此时,雍正想到了当初为康熙解决难题的你,是如此的智慧,如此的聪明绝顶。他亲自来到茅厕,找到了你(你当时已然是一个扫厕所的了),希望你能帮他解决这个问题,必定“厚”谢。你欣然答应了。
 
雍正将大致的情况告诉了你,并且说:大清一共有n个大城市,所有的大城市都不在同一个地点,同时我们对这n个城市从1到n进行编号;对于一个城市k,他有两个属性,一个是Xk,一个是Yk,分别表示这个城市所处的经度和纬度。请你告诉他问题的结果:L,即运河长度。(你可以假定地球是平面的)
 

格式

 

输入格式

 
第1行,一个整数n。
 
从第2行到n+1行,按照i从小到大顺序,每行两个整数Xi,Yi,代表编号为i的城市的经度和纬度。
 
其中2<=n <=100000,1<=Xi,Yi<2^31。
 

输出格式

 
一个实数L(保留三位小数)。
 

样例1

 

样例输入1

 
2
1 1
2 2
 

样例输出1

 
1.414

二维压一维.剪枝
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct Point
{
 double x,y;
};
double distance(double x1,double y1,double x2,double y2)
{
 double ans;
 ans=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
 return ans;
}
Point point[100001];
bool cmp(const Point &a,const Point &b)
{
 return a.x<b.x;
}
int main()
{
 int n,i,j;
 double ans=1e11;
 scanf("%d",&n);
 for(i=1;i<=n;i++)
  scanf("%lf%lf",&point[i].x,&point[i].y);
 sort(point+1,point+n+1,cmp);
 for(i=1;i<=n;i++)
 {
  for(j=i-1;j>0;j--)
  {
   if((point[i].x-point[j].x)*(point[i].x-point[j].x)>ans)
    break;
   if(ans>=distance(point[i].x,point[i].y,point[j].x,point[j].y))
    ans=distance(point[i].x,point[i].y,point[j].x,point[j].y);
  }
 }
 printf("%.3lf",sqrt(ans));
}


猜你喜欢

转载自blog.csdn.net/zyq_20030305/article/details/78301219
今日推荐