2019年暑假集訓第十套題

問題 A: 手鍊的價值

題目描述

經過幾年的努力,小C成功晉級國家集訓隊,成功被保送清華大學,爲了慶祝,葉老師決定送小C一個禮物。
在珠寶店,葉老師終於發現一種既便宜又大氣的手鍊。
手鍊的價格是看手鍊上的寶石決定的,每一種寶石的價值不一樣。
具體規則如下:
寶石A的價值是1、寶石B的價值是2、寶石C的價值是3·····寶石Z的價值是26。
爲了防止被銷售員虛報價格,葉老師決定請你幫忙計算一下手鍊的價值。

輸入

本題有T組數據。
對於每組數據只有一行。
1≤T≤20
1≤手鍊長度≤100000

輸出

輸出結果,並換行。

樣例輸入

2 
ABCD
LOVELOVE

樣例輸出

10
108

題解:

我的寫法比較蠢,也就是

用26個if判斷一下,然後sum求和

源代碼:

#include<bits/stdc++.h>
using namespace std;
char a[100005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>a;
        int sum=0;
        for(int i=0;i<strlen(a);i++)
        {
            if(a[i]=='A')sum+=1; 
            else if(a[i]=='B')sum+=2;
            else if(a[i]=='C')sum+=3;
            else if(a[i]=='D')sum+=4;
            else if(a[i]=='E')sum+=5;
            else if(a[i]=='F')sum+=6;
            else if(a[i]=='G')sum+=7;
            else if(a[i]=='H')sum+=8;
            else if(a[i]=='I')sum+=9;
            else if(a[i]=='J')sum+=10;
            else if(a[i]=='K')sum+=11;
            else if(a[i]=='L')sum+=12;
            else if(a[i]=='M')sum+=13;
            else if(a[i]=='N')sum+=14;
            else if(a[i]=='O')sum+=15;
            else if(a[i]=='P')sum+=16;
            else if(a[i]=='Q')sum+=17;
            else if(a[i]=='R')sum+=18;
            else if(a[i]=='S')sum+=19;
            else if(a[i]=='T')sum+=20;
            else if(a[i]=='U')sum+=21;
            else if(a[i]=='V')sum+=22;
            else if(a[i]=='W')sum+=23;
            else if(a[i]=='X')sum+=24;
            else if(a[i]=='Y')sum+=25;
            else if(a[i]=='Z')sum+=26;
        }
        cout<<sum<<endl;
    }
}

問題 B: 筆記本

題目描述

FST是一名可憐的小朋友,他很強,但是經常fst,所以rating一直低迷。
但是重點在於,他非常適合ACM!並在最近的區域賽中獲得了不錯的成績。
拿到獎金後FST決定買一臺新筆記本,但是FST發現,在價格能承受的範圍內,筆記本的內存和速度是不可兼得的。
可是,有一些筆記本是被另外一些“完虐”的,也就是內存和速度都不高於另外某一個筆記本,現在FST想統計一下有多少筆記本被“完虐”。

輸入

第一行一個正整數n,
表示筆記本的數量。
接下來n行,每行兩個正整數Mi,Si表示這款筆記本的內存和速度。
n≤105,Mi,Si≤109

輸出

一行,一個正整數,表示被完虐的筆記本數。

樣例輸入

4
100 700
200 500
50 100
300 400

樣例輸出

1

提示

Mi和Si都是越大越優。
數據保證Mi互不相同,Si也互不相同。

題解:

先對一種特徵(我用的是內存)進行排序(降序),令t[i]爲s[1]~s[i]中速度最快的

那麼如果s[i]的速度t[i-1]慢,說明這檯筆記本被“完虐”了,ans++.

源代碼:


#include<bits/stdc++.h> 
using namespace std;
struct node
{
    int m,s;
}s[400010];
int cmp(node a,node b)
{
   return a.m>b.m;//降序
}
int t[800010];
int main()
{
    int i,j,n,num,k,maxx,ans=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&s[i].m,&s[i].s);
    }
    sort(s+1,s+1+n,cmp);
    t[1]=s[1].s;
    for(i=2;i<=n;i++)t[i]=max(t[i-1],s[i].s);//求s[i]~s[i]中的最快速度
    for(i=2;i<=n;i++)
    {
        if(t[i-1]>s[i].s)ans++;//被“完虐”了
    }
    printf("%d\n",ans);
}
​

問題 C: 機器人

題目描述

從前在月球上有一個機器人。
月球可以看作一個 n*m 的網格圖,每個格子有三種可能:空地,障礙,機器人(有且僅有一個),現在地面指揮中心想讓機器人在月球上行走,每次可以發送一個指令,爲 U-往上走、D-往下走、L-往左走、R-往右走的其中之一。
當機器人接收到一個行走指令時,如果即將到達的位置爲障礙物,那麼機器人將留在原地,否則機器人向對應方向走一步,如果其走出邊界那麼立即死亡。
地面指揮中心當然不想讓機器人就這麼掛掉,因此其定義一個操作序列是安全的,當且僅當機器人按此操作序列走不會死亡。
但是從地球向月球發信息不是個容易的事,而且有時候某些指令還會在茫茫宇宙中被吞沒,比如指揮中心傳出去 RUR 指令,到機器人那裏就可能變成 RR 或者變成 U,因此定義一個操作序列是絕對安全的當且僅當其任意子序列都是安全的。
現在地面指揮中心想知道,對於某一個地圖,絕對安全的操作序列最長可以到多少,如果存在一個長度爲正無窮的這樣的序列,那麼輸出-1。 

輸入

輸入文件爲“robot.in” 
第一行有兩個正整數 n, m,表示網格圖的大小, 接下來 n 行,每行 m 個字符,表示這張網格圖。
其中字符“.”表示空地,“#”表示障礙物,“S”表示機器人所在位置。 

輸出

輸出文件爲“robot.out” 
輸出一個整數, 表示絕對安全的操作序列最長可以到多少 

樣例輸入

5 5

#####

#...# 

.#S#. 

#...# 

#####

樣例輸出

-1

提示

【數據範圍】 

對於100%的數據,1 <= n, m <= 50 

題解:

1、若機器人的四面的其中一面有障礙物。

那麼這個序列一定是正無窮大的,因爲機器人碰到障礙物會停下來

2、如果四個方向都沒有障礙物

如果這個地圖是5*5的,且機器人的四個方向沒有障礙物,

機器人處於地圖中心,那麼它走的長距離就是5-1+5-1=8

因爲處於地圖中心,說明它要不越界,最多可以向左兩格

向右兩格,向上兩格,向下兩格。綜合一下,也就是橫向

不超四格,上下不超四格   4+4=5-1+5-1=n-1+m-1

源代碼:

#include<bits/stdc++.h>
using namespace std;
char a[51][51];
int n,m;
int tx,ty;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)
       {
            cin>>a[i][j];
            if(a[i][j]=='S')
            {
                tx=i;
                ty=j;
            }
       }
    bool flag=false;
    for(int i=1;i<=n;i++)
       if(a[i][ty]=='#')flag=true;
    for(int i=1;i<=m;i++)
       if(a[tx][i]=='#')flag=true;
    if(flag==true)cout<<-1<<endl;
    else
        cout<<n-1+m-1<<endl;
}

問題 D: 辦公室鑰匙

題目描述

有n個人和k把鑰匙在一條直線上,每個人都想去位於直線p點的辦公室找陳老師問題目。陳老師不希望被打擾,所以他把辦公室門鎖了,爲了進入辦公室,每個人需要到達直線某一點來拿到辦公室鑰匙,拿着辦公室鑰匙才能進入辦公室,一個人進門後會把門再鎖上,所以每個人都需要帶着鑰匙才能進門。 

你現在需要安排每個人如何行動使得n個人都進入辦公室所需要的時間最短。假設每個人移動一個單位要花一秒鐘。 

注意:1. 不計拿鑰匙、開門進門等時間,只計算人移動的時間;2. 一旦某個位置的鑰匙被某個人拿走了,它不能再被其他人拿走;3. 如果兩個人同時到某個存在鑰匙的點,只有一個人可以拿鑰匙;4. 一個人可以經過一個有鑰匙的點而不拿鑰匙;5. 鑰匙只能由人帶着不能放下;6. 所有人可以同時行動。 

輸入

輸入文件爲“key.in” 

第一行爲三個用空格分隔的整數 n, k, p,分別表示人的數量,鑰匙的數量和辦公室的位置;   

第二行爲 n個用空格隔開的整數,表示每個人的位置xi ,保證每個人的位置都不同,但是不保證順序。 

第三行爲k個用空格隔開的整數,表示每把鑰匙的位置bi ,保證每把鑰匙的位置都不同,但是不保證順序。 

(注意輸入數據中同一個點不會有超過一個人或者超過兩把鑰匙,但是同一個點可能會同時有一個人和一把鑰匙) 

輸出

輸出文件爲“key.out” 

輸出僅一個整數,表示n個人都進入辦公室的所花的最短時間。 

樣例輸入

樣例輸出

提示

【樣例解釋】 

在第一個例子中,位於點20的人應該拿着位於點40的鑰匙並且將它帶到位於點50的辦公室。他花費30秒。位於點100的人可以拿着位於點80的鑰匙並隨身攜帶到辦公室。他花了50秒。因此,50秒後,每個人都帶着鑰匙在辦公室。。   

【數據範圍】 

對於50%的數據,1≤n≤10, n≤k≤20, 1≤p, xi, bi≤1000 

對於100%的數據,1≤n≤100000, n≤k≤200000, 1≤p, xi, bi≤109 

不是AC的題解!!(RE還來秀)

這題的數據量真的大...QAQ*3

這題乍一看,就是一道暴力題,於是本蒟蒻

就這樣寫了。結果RE了,只得了50分。

下面講一下本蒟蒻的暴力思路:

枚舉第i人的最短時間,用ans[i]儲存起來最後取大值(因爲可以同時行動,所以時間最長的就是最終用時)

50分代碼:

#include<bits/stdc++.h>
#include<iostream>
#define ll long long
using namespace std;
int n,k,p;
ll x[10005];
ll b[20005];
ll ans[10005]; 
ll cnt=-1,sum=0,tmp=0;
int min(int a,int b)
{
    if(a<=b)return a;
    else return b;
}
int max(int a,int b)
{
    if(a>=b)return a;
    else return b;
}
int main()
{
    cin>>n>>k>>p;
    memset(ans,0x7f,sizeof(ans));
    for(int i=1;i<=n;i++)cin>>x[i];
    for(int i=1;i<=k;i++)cin>>b[i];
    //sort(x+1,x+1+n);
    //sort(b+1,b+1+k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            tmp=abs(b[j]-x[i]);
            sum=abs(p-b[j])+tmp;
            ans[i]=min(sum,ans[i]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        cnt=max(cnt,ans[i]);
    }
    cout<<cnt<<endl;
}

 

 

發佈了57 篇原創文章 · 獲贊 12 · 訪問量 4834
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章