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));
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章