2017廣東工業大學程序設計競賽決賽

鏈接:http://gdutcode.sinaapp.com/contest.php?cid=1057

Problem A: 兩隻老虎

Description

來,我們先來放鬆下,聽聽兒歌,一起“唱”。

兩隻老虎兩隻老虎,跑得快跑得快。

一隻沒有耳朵,一隻沒有尾巴。

真奇怪,真奇怪。

Tmk也覺得很奇怪,因爲在他面前突然出現了一羣這樣的老虎,有的沒耳朵,有的沒尾巴,不過也有正常的。

現在Tmk告訴你這羣老虎的耳朵個數,尾巴條數,以及老虎的腿的數目,問你有多少隻是正常的。

其中只有三種老虎:

第一種(正常的):有2個耳朵、1條尾巴、4條腿

第二種(沒耳朵):有0個耳朵、1條尾巴、4條腿

第三種(沒尾巴):有2個耳朵、0條尾巴、4條腿

Input

第一行一個整數T表示有多少組樣例。

接下來每一行一個樣例:

包含三個整數abc表示總共有a個耳朵,b條尾巴,c(<=4000)條腿,數據保證有解。

Output

對於每組樣例輸出一行,表示有多少隻正常的老虎。

Sample Input

112 7 40

Sample Output

3

水題:

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
         int a,b,c;
         int x,y,z;
         cin>>a>>b>>c;
         int ans=a/2-c/4+b;
         printf("%d\n",ans);
    }
return 0;
}




Problem B: 佔點遊戲

Description

衆所周知的是,TMK特別容易遲到,終於在TMK某次又遲到了之後,Maple怒了,Maple大喊一聲:“我要跟你決一死戰!”然後Maple就跟TMK玩起了一個關於佔點的遊戲。

Maple在一個無限展開的只有整數點的二維平面上找到兩個點,由TMKMaple分別操控這兩個點,兩人輪流操作,每一次操作中TMKMaple可以把他的點移動一格到上、下、左、右四個方向,當TMK操作時,移動到的這個點會被染成紅色,而當Maple操作時,移動到的這個點會被染成藍色,需要注意的是,兩個起始時的兩個點也都會被染上相應的顏色,而當任一人走到已經染了不同顏色的點,這個顏色會被覆蓋掉,當兩個點覆蓋在一起時,這個點會被後來的點染色。當遊戲結束時染着自己顏色的點就代表被自己佔領了。

TMK一下就明白了,這個遊戲的目標是讓自己佔領的點比對方佔領的點多,而且要讓差值最大。

爲了公平一些,Maple決定讓TMK來選擇先手或後手和讓TMK來選擇點,相應的Maple就會選擇另一個點。

現在給出遊戲的總輪數NMaple選擇的兩個點的座標(x1y1),(x2y2),要TMK來選擇先後手和起始點,假設Maple一定按最優策略來走,問TMK能不能選擇先後手和起始點使得自己佔領的點比Maple佔領的多,如果能,那麼同時要求出佔領的點數的最大差值。

Input

第一行一個T,代表接下來有T組數據(1<=T<=2000)

每組數據有五個整數N,x1,y1,x2,y2,代表了操作的總輪數N以及選擇的兩個起始點(x1,y1),(x2,y2),其中1<=N<=10^8-10^8<=x1,y1,x2,y2<=10^8,數據保證兩個點不相同。

Output

對於每一組數據,如果TMK佔領的點不能比Maple佔領的多,那麼輸出-1,否則輸出兩個佔領點數的最大差值。

Sample Input

4
1 0 0 1 0
2 0 0 1 0
1 0 0 2 0
2 0 0 2 0

Sample Output

2
-1
1
-1

博弈題,還沒學過,待補。

Problem C: 爬樓梯

Description

小時候,我只能一階一階得爬樓梯,

後來,我除了能一次爬一階,還可以一次爬兩階,

到現在,我最多一次可以爬三階。

那麼現在問題來了,我想爬上n層樓,相鄰樓層之間有一段樓梯,雖然我一次可以爬1個臺階、2個臺階和3個臺階,但是我在ii+1層之間的樓梯上時,我不能跨越到i+1i+2層之間的樓梯。現在有個n層的樓,知道每一段樓梯的階數,我想知道,如果我只會往上走,並且忽略其他不在樓梯上的其他移動,共有多少種方案可以到達第n層。

Input

第一行一個整數T0<T<=50)表示有多少組樣例。

對於每一組樣例:

第一行一個n1<n<=50)表示有多少層樓。

接下來一行,包括n-1個整數xi0<xi<=20),由下到上依次表示每段樓梯的長度。

Output

對於每組數據,輸出一行表示共有多少種方案。由於答案較大,所以輸出答案請對10007取模。

Sample Input

2
2
3
4
4 5 6

Sample Output

4
2184
水題:
#include<iostream>
#include<string>
using namespace std;
int f[60];
int a[55];
int main()
{
    f[0]=1;
    f[1]=1;
    f[2]=2;
    for(int i=3;i<=50;++i)
        f[i]=f[i-1]+f[i-2]+f[i-3];
    int T,n,i,ans;
    cin>>T;
    while(T--)
    {
        ans=0;
        cin>>n;
        for(i=1;i<n;++i)
            cin>>a[i];
        ans=f[a[1]]%10007;  
        for(i=1;i<n-1;++i)
        {
            ans*=f[a[i+1]];
            ans=ans%10007;
        }
        cout<<ans<<endl;
    }
return 0;
}



Problem D: 只有通過毀滅才能揭示真理

Description

“只有通過毀滅才能揭示真理。” —— 虛空之眼

維克茲是一個有觸手的虛空來客,他帶着非凡的意圖探索着符文之地:吸收掉所有知識。憑藉着他不斷地注視,維克茲可以發射瓦解光線來滅除並分析他途中的一切東西,併爲他供給數量龐大的信息。沒人知道他爲什麼需要如此多的材料,儘管有人推測他設法瞭解符文之地,是爲了加速它的毀滅。

另外,維克茲本身也是一個極其強大的魔法師,他的技能會對命中的敵人施加有機體解構效果。如果累積到3層效果,敵人就會受到爆發性的真實傷害。

現在,維克茲正準備施展他的絕招 —— 生命形態瓦解射線,來對付被永久眩暈且沒有攜帶任何魔抗裝備的約德爾人。另外,他的絕招每10秒就可以對敵人累積一層有機體解構效果。

維克茲希望找到能夠跟他一起遨遊大陸的夥伴,所以他準備考考你,如果已知生命形態瓦解射線持續的時間和每一秒的傷害,以及有機體解構效果每累積到3層所爆發的傷害(傷害爆發後層數歸零),你是否能算出約德爾人受到的總傷害是多少呢?

請注意,如果你回答不出來,維克茲絕對很樂意將你一起分解掉。

Input

輸入包括T組數據,每組數據包括生命形態瓦解射線的持續時間A,每一秒的傷害B,以及有機體解構效果每累積到3層所爆發的傷害C

T <= 10000, 0 <= A, B, C <= 10000, 所有數據皆爲整數)

Output

輸出一個數代表約德爾人受到的總傷害。

Sample Input

2
10 10 10
30 10 10

Sample Output

100
310
水題:
#include<stdio.h>
#include<iostream>
using namespace std;
int a,b,c;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        cin>>a>>b>>c;
        int num;
        num=a*b+a/30*c;
        printf("%d\n",num);
    }
    return 0;
}



Problem E: 倒水(Water)

Description

一天,CC買了N個容量可以認爲是無限大的瓶子,開始時每個瓶子裏有1升水。接着~~CC發現瓶子實在太多了,於是他決定保留不超過K個瓶子。每次他選擇兩個當前含水量相同的瓶子,把一個瓶子的水全部倒進另一個裏,然後把空瓶丟棄。(不能丟棄有水的瓶子)

顯然在某些情況下CC無法達到目標,比如N=3,K=1。此時CC會重新買一些新的瓶子(新瓶子容量無限,開始時有1升水),以到達目標。

現在CC想知道,最少需要買多少新瓶子才能達到目標呢?

Input

第一行一個整數T,表示有T組數據。

接着T每行兩個正整數, N,K(1<=N<=10^9K<=1000)

Output

一個非負整數,表示最少需要買多少新瓶子。

Sample Input

3
3 1
13 2
1000000 5

Sample Output

1
3
15808
二進制:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
long long n,k,ans,bns,s;
int a[35];
long long pow(long long x)
{
    long long y=1;
    for(int i=1; i<=x; i++)
        y*=2;
    return y;
}
int main()
{
    int times;
    cin>>times;
    while(times--)
    {
        memset(a,0,sizeof(a));
        ans=0;
        bns=0;
        s=0;
        cin>>n>>k;
        for(int i=31; i>=0; i--)
            if(n>=pow(i))
            {
                n-=pow(i);
                a[i]=1;
                bns++;
            }
        while(bns>k)
        {
            for(int i=s;; i++)
                if(a[i])
                {
                    s=i;
                    a[i]=0;
                    break;
                }
            for(int i=s+1;; i++)
                if(a[i])
                {
                    a[i]=0;
                    --bns;
                    int x=i+1;
                    while(a[x])
                    {
                        a[x]=0;
                        x++;
                        --bns;
                    }
                    a[x]=1;
                    ans+=pow(i)-pow(s);
                    s=x;
                    break;
                }
        }
        cout<<ans<<endl;
    }
  
    return 0;
}



Problem F: tmk找三角

Description

有一棵樹,樹上有隻tmk。他在這棵樹上生活了很久,對他的構造瞭如指掌。所以他在樹上從來都是走最短路,不會繞路。他還還特別喜歡三角形,所以當他在樹上爬來爬去的時候總會在想,如果把剛纔爬過的那幾根樹枝/樹幹鋸下來,能不能從中選三根出來拼成一個三角形呢?

Input

第一行輸入一個T,表示有多少組樣例。

對於每組數據:第一行包含一個整數 N,表示樹上節點的個數(從 到 標號)。

接下來的 N-1 行包含三個整數 a, b, len,表示有一根長度爲 len 的樹枝/樹幹在節點 和節點 之間。

接下來一行包含一個整數 M,表示詢問數。

接下來M行每行兩個整數 S, T,表示毛毛蟲從 爬行到了 T,詢問這段路程中的樹枝/樹幹是否能拼成三角形。

Output

對於每組數據,每個詢問輸出一行,包含"Yes"“No”,表示是否可以拼成三角形。

Sample Input

2
5
1 2 5
1 3 20
2 4 30
4 5 15
2
3 4
3 5
5
1 4 32
2 3 100
3 5 45
4 5 60
2
1 4
1 3

Sample Output

No
Yes
No
Yes

HINT


對於20%數據 1 ≤ N, M ≤ 1000


對於所有數據 1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000

待補。。。。。



Problem G: 等凹數字

Description

定義一種數字稱爲等凹數字,即從高位到地位,每一位的數字先非遞增再非遞減,不能全部數字一樣,且該數是一個迴文數,即從左讀到右與從右讀到左是一樣的,僅形成一個等凹峯,如5432123455544334455是合法的等凹數字,543212346123321,111111不是等凹數字。現在問你[L,R]中有多少等凹數字呢?

Input

第一行一個整數T,表示數據的組數。

接下來T行每行倆個數字L和R,(1<=L<=R<=1e18)

Output

 輸出一個整數,代表[L,R]中有多少等凹數字

Sample Input

2
1 100
101 200

Sample Output

0
1

HINT

 小於等於2位的數字無凹峯

待補。。。。。

Problem H: tmk買禮物

Description

今天是校賽的日子,爲了慶祝這麼喜慶的日子,TMK打算買些禮物給女票LSH慶祝一下。

TMK進入了雪梨超市,然後剛踏入的一瞬間,店主就對TMK說:“恭喜你成爲了本店第2147483647位顧客,本店在搞一個活動,對本店第2147483647位顧客進行贈送活動。你先看看你有多少錢?”

TMK一摸口袋,發現只有n個硬幣,每個硬幣的價值爲a[i]

然後店主繼續說:“現在你用你的錢湊一些數,如果你的錢能湊成[0,x]裏面所有的數,那麼你將會免費獲得該店價值x元的代金券,假設你有四個硬幣面值分別爲1,2,4100,你就可以湊成[0,7]裏面所有的數,我們將會送你7元的代金券。現在就用你的硬幣來試試吧。Enjoy yourself!”

TMK努力湊錢的時候,店主想知道他要送多少代金券給TMK

Input

第一行一個整數T,表示數據組數。

對於每組數據,首先讀入一個整數nn<=100000),然後接下來的一行有n個整數,表示a[i] 0<a[i]<=1e9

Output

對於每個數據,輸出一個整數x,表示店主要送x元的代金券給TMK

Sample Input

1
3
1 2 3

Sample Output

6
數學題:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
 
long long a[100005];
 
int main()
{
    int T,n,i,j;
    bool flag;
    long long coun;
    while(~scanf("%d",&T))
    {
        while(T--)
        {
            scanf("%d",&n);
            for(i=0; i<n; i++)
                scanf("%lld",&a[i]);
            sort(a,a+n);
            if(a[0]!=1)
            {
                printf("0\n");
            }
            else
            {
                coun=1;
                for(i=1; i<n; i++)
                {
                    if(a[i]>coun+1)
                        break;
                    coun=coun+a[i];
                   // printf("%lld\n",coun);
                }
                printf("%lld\n",coun);
            }
        }
    }
    return 0;
}

ps:這次比賽打得不是太好,老是犯一些比較低級的錯誤,希望下次能夠改正


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