【 題集 】 2015(GDUTCPC) 初賽

    

Problem A: 小明在工作

Description

小明的工作是負責記錄飯堂中正在排隊的人的信息 
在他的工作中會有三種可能的事件發生: 
    1.編號爲id的學生加入到隊伍的最後面 
    2.排在最前面的學生打完飯離開了隊伍 
    3.老闆過來詢問當前排在隊伍前方第k個的學生的編號 
由於每天的工作量太大(每天最多有100000個以上事件發生), 
小明苦不堪言,讓你寫個程序幫他 

Input

輸入的第一個數是正整數T,表明接下來有T組數據 
每組數據的第一個數爲正整數n,表示有n件事會發生 
接下來有n行,每行分別表示上訴三種事件的其中一種,格式分別如下: 
1 id 

3 k 
注意當隊伍中已經沒人的時候請忽略第2種事件,每組數據新開始的時候隊伍中人數都爲0

Output

對於給個第3種的事件,請輸出第k個學生的編號, 
如果隊伍的人數小於k,輸出“na li you zhe me duo ren”。

Sample Input

2
5
11
12
3 1
2
3 1
2
1 1
3 2

Sample Output

1
2
na li you zhe me duo ren


    題意很簡單,就是進去,出去,查詢。關於隨機訪問的STL,可以使用vector。

    

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
#include <vector>
using namespace std;
 
vector<int>qe;
 
int main()
{
    int t, m;
    int k, n;
    while(~scanf("%d",&t))
    {
        while(t --)
        {
            while(!qe.empty())
            {
                qe.erase(qe.begin());
            }
            scanf("%d",&m);
            for(int i = 0; i < m; i ++)
            {
                scanf("%d",&n);
                if(n == 1)
                {
                    scanf("%d",&k);
                    qe.push_back(k);
                }
                else if(n == 2)
                {
                    if(qe.size() != 0)
                    qe.erase(qe.begin());
                }
 
                else if(n == 3)
                {
                    scanf("%d",&k);
                    if(k > qe.size())
                        printf("na li you zhe me duo ren\n");
                    else
                        printf("%d\n",qe[k - 1]);
                }
            }
        }
    }
}
 
/**************************************************************
    Problem: 1114
    Language: C++
    Result: Accepted
    Time:224 ms
    Memory:1880 kb
****************************************************************/

   

Problem B: 神奇的編碼

Description

假如沒有阿拉伯數字,我們要怎麼表示數字呢 
小明想了一個方法如下: 
1 -> A 
2 -> B 
3 -> C 
.... 
25 -> Y 
26 -> Z 
27 -> AA

28 -> AB
.... 
 
現在請你寫一個程序完成這個轉換

Input

輸入的第一個數爲一個正整數T,表明接下來有T組數據。 
每組數據爲一個正整數n ( n <= 1000)

Output

對於每個正整數n,輸出他對應的字符串

Sample Input

3
1
10
27

Sample Output

A
J
AA


    就是十進制轉26(a~z)進制,注意順序,A,B,....Z, AA ,AB,....AZ,BA,BB.....BZ.....ZZ , AAA,AAB........

   

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
#include <vector>
#include <map>
using namespace std;

int main()
{
    int T;
    int n;
    while(~scanf("%d",&T))
    {
        while(T--)
        {
            scanf("%d",&n);
            if(n <= 26)
            {
                printf("%c\n",'A' + n - 1);
                continue;
            }
            if(n <= 26 + 26*26)
            {
                n -= 27;
                printf("%c%c\n",'A' + n/26,'A' + n%26);
                continue;
            }
            else
            {
                n -= (26 + 26*26 + 1);
                printf("%c%c%c\n",'A' + n/26/26,'A' + (n/26)%26,'A' + n%26);
            }
        }
    }

    return 0;
}


   

    

Problem C: 喪心病狂的計數

Description

有一天,stubird發現了n個糖罐,裏面有很多糖罐,很喜歡喫糖的Stubrid當然想喫最多的糖, 但是他只能帶走k個,問他最多能帶走多少顆糖?

Input

第一行T,表示有T(T<=50)個測試樣例 第二行n,k,表示有n個罐子,最多隻能帶走k個罐子(k<=n<=10^5) 接下來n個數xi,表示第i個罐子裏面有多少顆糖(0<=xi<=10^5 )

Output

一行,輸出最多他能帶走多少顆糖

Sample Input

3 2
1 2 3

Sample Output

5

    貪心的水題,然後這個oj 沒有"\n",顯示的是WA ,我還一直以爲有坑點了!!
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
#include <vector>
#include <map>
using namespace std;
 
#define N 100010
 
int tt[N];
 
int main()
{
    int t;
    int n, m;
    while(~scanf("%d",&t))
    {
        while(t --)
        {
            memset(tt, 0, sizeof(tt));
            long long int ans = 0;
            scanf("%d%d",&n,&m);
            for(int i = 0; i < n; i ++)
            {
                scanf("%d",&tt[i]);
            }
            sort(tt, tt + n);
            for(int i = n - 1; i >= n - m; i -- )
            {
                ans += tt[i];
            }
            printf("%lld\n",ans);
        }
    }
}
/**************************************************************
    Problem: 1117
    Language: C++
    Result: Accepted
    Time:244 ms
    Memory:1880 kb
****************************************************************/


Problem D: 01串也瘋狂之光棍也有伴

Description

話說春節那天,小明和曉明在實驗室刷題。刷着刷着小明覺得累了,就邀請曉明一起看春晚。曉明覺得小明很無聊,不想理小明,但是小明很會磨嘴皮子,曉明耐不住小明的胡嘴蠻纏,於是和小明一起看起春晚來。

小明頓時覺得倍兒爽啊! 可是一看,“wocao”,“最炫小蘋果”,小明頓時覺得很傷心。 “連小蘋果都有伴了。。。嗚嗚。。。。” 曉明看到小明哭了,就想安慰他,可是怎麼安慰呢! 
曉明陷入了沉思,忽然,曉明靈光一閃,想借一下出題名義,讓小明開心起來。於是曉明對小明說,既然小蘋果都有伴了,那我們兩光棍離脫單也不遠了吧! 。。。。噼噼啪啦,曉明對小明說不然我們也來讓光棍有個伴吧! 正好,正值我們學校的校賽,我們就以光棍爲名,來出一道題。小明聽到要出題,立馬起了勁。。。他們認爲“11”是光棍成雙成對的標誌,於是, 小明和曉明想問下你們,對於一個長度爲n的01串,到底有多少串是含有“11”子串的呢? 。。。聰明的你,相信你已想到怎麼AC了。
例如長度爲2的有“11”一個符合條件的01串; 
        長度爲3的有“111”,“110”,“011”三個符合條件的串;

        長度爲4的有“1111”,“1101”,“1100”,“0011”,“1011”,“0111”,“0110”,“1110”八個符合條件的串。

Input

 有T組數據輸入。(T<=1000);
 每組數據只有一行,一個正整數n(1<=n<=10^6)

Output

對於每組數據輸出一行結果,對1000000007取模。

Sample Input

3
1
4
5

Sample Output

0
8
19

    下次補上,還不會、、、


Problem E: Fire or Retreat

Description

在與科技水平遠勝於我們的外星人的戰鬥最後,我們能夠用來對外星裝甲造成傷害的武器只剩下了……呃,一些迫擊炮?

爲了最大程度的節省彈藥,下面一些事情,是你,一個新兵需要知道的:

1 每架迫擊炮的發射動能都是一個固定值。這意味着同一架迫擊炮發射出來的炮彈初始速率相同;

2 每架外星裝甲都配備有隱形裝置,隱形裝置會有周期性的充能,也就是說一旦偵測到外星裝甲,要麼開火要麼撤退;

3 每架迫擊炮都可以以一定的角度射擊.

現在你的任務就是對於每架偵測到的裝甲,快速決定是射擊還是撤退。一旦能夠射擊到外星裝甲的話,當然是要開火的。 (重力加速度g=10m/s^2;,忽略其他外在因素)

Input

第一行輸入一個整數T,代表接下來有多少個樣例。 接下來有T行輸入,每行有兩個整數v、d(v <= 1000000m/s, d <= 1000000m),代表這架迫擊炮的炮彈速率v和偵測到的外形裝甲離你的水平距離d。

Output

對於每個樣例,輸出一行結果並換行。如果迫擊炮發射的炮彈能夠擊中外星裝甲,則輸出“Fire”;否則,輸出“Retreat”。

Sample Input

2
100 1000
17 300

Sample Output

Fire
Retreat


物理題, 1/2 mv^2 = mgh,h = 1/2 gt^2,s = vt。最後的範圍是2s、

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;

typedef long long LL;

#define N 1010

int t;

int main()
{
    LL a, b;
    while(~scanf("%d",&t))
    {
        while(t --)
        {
            scanf("%lld%lld",&a,&b);
            if(a*a >= b*10)
                printf("Fire\n");
            else
                printf("Retreat\n");

        }
    }
    return 0;
}


Problem F: GG的匹配串

Description

2015年廣東工業大學ACM校賽要來~\(≧▽≦)/~辣辣辣,作爲校賽的出題人之一,GG想出了一道水題來考考大家。相信小夥伴們都學過字符串匹配,於是字符串匹配的水題就誕生辣!GG給出了一段長度爲N的大寫字母序列,現在他要你修改這一段字母序列,使得這段字母序列上最前面的K個字母組成的序列與最後面的K個字母組成的序列一一匹配。
 
例如對於序列“ATUUUUAC”和K = 2,可以通過將第二個字母修改爲“C”,使得最前面的兩個字母與最後面的兩個字母都爲“AC”,當然 還存在其他的修改方法,現在GG要求你求出要使字符串匹配至少需要修改多少個字母。

Input

有T組數據輸入。(T <= 100)
每組數據只有兩行,第一行爲一個字符串,第二行爲一個正整數K,字符串的長度不會超過1000,且至少爲1。(1 <= K <= N)。

Output

對於每組數據輸出至少需要修改的字母數量

Sample Input

2
ATUUUUAC
2
ATACGTCT
6

Sample Output

1
3

下次補上、、、


Problem G: 漂洋過海來看你

Description

BMan和hyx住在一個神奇的國度,這個國度有N個城市,這N個城市間只有N-1條路把這個N個城市連接起來。現在BMan在第S號城市,他經常想起那個一起AC過的隊友hyx,記憶它總是慢慢的累積,在他心中無法抹去,可是他並不知道hyx在哪個城市,所以他決定用盡半年的積蓄漂洋過海去找hyx,現在BMan很想知道如果他想去hyx所在的第X號城市,必須經過的前一個城市是第幾號城市(放心,由於心繫隊友,BMan是不會選擇走重複的路的~)

Input

第一行輸入一個整數T表示測試數據共有T(1<=T<=10)組每組測試數據的第一行輸入一個正整數N(1<=N<=1000)和一個正整數S(1<=S<=1000),N表示城市的總數,S是BMan所在城市的編號隨後的N-1行,每行有兩個正整數a,b(1<=a,b<=N),表示第a號城市和第b號城市之間有一條路連通。

Output

每組測試數據輸N個正整數,其中,第i個數表示從S走到i號城市,必須要經過的上一個城市的編號(其中i=S時,請輸出-1)

Sample Input

1
10 1
1 9
1 8
8 10
10 3
8 6
1 2
10 4
9 5
3 7

Sample Output

-1 1 10 10 9 8 3 1 1 8

    搜索,
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
 
#define N 100010
 
int pre[N]; // 先前節點
vector<int>v[N];
 
void DFS(int cur)
{
    for(int i = 0; i < v[cur].size(); ++i)
    {
        if(pre[v[cur][i]]) continue;
        pre[v[cur][i]] = cur;
        DFS(v[cur][i]);
    }
}
 
int main()
{
    int ncase;
    int n, m;
    int x, y;
    scanf("%d", &ncase);
    while(ncase--)
    {
        memset(v, 0, sizeof(v));
        memset(pre, 0, sizeof(pre));
        scanf("%d%d", &n, &m);
        pre[m] = - 1;
        for(int i = 0; i < n - 1; ++i)
        {
            scanf("%d%d", &x, &y);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        DFS(m);
        printf("%d",pre[1]);
        for(int i = 2; i <= n; ++i)
            printf(" %d", pre[i]);
        printf("\n");
    }
    return 0;
}
 
/**************************************************************
    Problem: 1120
    Language: C++
    Result: Accepted
    Time:8 ms
    Memory:3052 kb
****************************************************************/

Problem H: 神密的數列

Description

2030年,酷夏。一隊考古人員來到這片山區,原因據說是發現這裏可能有極其珍貴的古蹟。
遺蹟的開發工作工作遠比他們之前想象的複雜度得多,開發進度緩慢,眼看着時間就快來不急了。
爲了加快進度,他們打算僱傭當地的居民來幫忙。
聽聞消息過來應徵的大部分是中壯年,唯獨一位特殊,是位老人家,看起來已經年過半百,頭髮花白,帶着眼鏡,在人羣中實在太顯眼,大概是爲了生計吧。
。。。
古蹟的開發工作穩步進行,這塊巨大的石碑在地底沉睡了幾千年後終於又要重見光明瞭。
考古學家們站在石碑邊上,輕輕擦去塵土,開始解讀上面的信息。
A:“好像都是甲骨文,而且都是數字”
B:”確實都是數字。1, 2, 4, 7, 11, 16, 22 ,。。。。。“
C:"這一大串數字是什麼意思"
A:”看不出規律,但是一定有重大的含義,你們看過20年前那部《神祕代碼》的電影嗎,我覺得很有可能跟那個一樣,關乎我們地球存亡!“
大家都覺得A說很有道理,激動得不知道說什麼話好
 
”額。。。那個。。。“突然從身後傳來聲音
紛紛回頭望去,是那位老人家
”雖然我看不懂甲骨文,但是你剛纔說的那串數字不就是二階等差數列嘛,我當年在學校的比賽出過這道題“
一羣人愣了一下
“好像是啊,相鄰兩個數的差分別爲1, 2, 3, 4, 5, 。。。。”
然後臉上紛紛由興奮變得充滿窘色
看着老人家已經回頭準備離開,大家紛紛叫住他
”等一下先別走,能告訴我們您的名字嗎“
”算了吧,要什麼名字,叫我BMan吧”然後大步離去,頭也不回

Input

輸入數據的第一行爲一個正整數T
接下來有T行,每行有一個正整數n (n <= 1000)

Output

對於每一個n,請輸出二階等差數列中第n個數的值

Sample Input

4
1
2
5
8

Sample Output

1
2
11
29

    簽到題

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;

#define N 1010
#define Max 1 << 29

int tt[N];
int t;

int main()
{
    int n;
    tt[1] = 1;
    int cnt = 1;
    for(int i = 2; i < 1010; i ++)
    {
        tt[i] = tt[i - 1] + cnt;
        cnt ++;
    }
    while(~scanf("%d",&t))
    {
        while(t --)
        {
            scanf("%d",&n);
            printf("%d\n", tt[n]);
        }
    }
}




    

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