鏈接:http://gdutcode.sinaapp.com/contest.php?cid=1057
Problem A: 兩隻老虎
Description
來,我們先來放鬆下,聽聽兒歌,一起“唱”。
兩隻老虎兩隻老虎,跑得快跑得快。
一隻沒有耳朵,一隻沒有尾巴。
真奇怪,真奇怪。
Tmk也覺得很奇怪,因爲在他面前突然出現了一羣這樣的老虎,有的沒耳朵,有的沒尾巴,不過也有正常的。
現在Tmk告訴你這羣老虎的耳朵個數,尾巴條數,以及老虎的腿的數目,問你有多少隻是正常的。
其中只有三種老虎:
第一種(正常的):有2個耳朵、1條尾巴、4條腿
第二種(沒耳朵):有0個耳朵、1條尾巴、4條腿
第三種(沒尾巴):有2個耳朵、0條尾巴、4條腿
Input
第一行一個整數T表示有多少組樣例。
接下來每一行一個樣例:
包含三個整數a,b,c表示總共有a個耳朵,b條尾巴,c(<=4000)條腿,數據保證有解。
Output
對於每組樣例輸出一行,表示有多少隻正常的老虎。
Sample Input
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在一個無限展開的只有整數點的二維平面上找到兩個點,由TMK和Maple分別操控這兩個點,兩人輪流操作,每一次操作中TMK或Maple可以把他的點移動一格到上、下、左、右四個方向,當TMK操作時,移動到的這個點會被染成紅色,而當Maple操作時,移動到的這個點會被染成藍色,需要注意的是,兩個起始時的兩個點也都會被染上相應的顏色,而當任一人走到已經染了不同顏色的點,這個顏色會被覆蓋掉,當兩個點覆蓋在一起時,這個點會被後來的點染色。當遊戲結束時染着自己顏色的點就代表被自己佔領了。
TMK一下就明白了,這個遊戲的目標是讓自己佔領的點比對方佔領的點多,而且要讓差值最大。
爲了公平一些,Maple決定讓TMK來選擇先手或後手和讓TMK來選擇點,相應的Maple就會選擇另一個點。
現在給出遊戲的總輪數N,Maple選擇的兩個點的座標(x1,y1),(x2,y2),要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
Sample Output
Problem C: 爬樓梯
Description
小時候,我只能一階一階得爬樓梯,
後來,我除了能一次爬一階,還可以一次爬兩階,
到現在,我最多一次可以爬三階。
那麼現在問題來了,我想爬上n層樓,相鄰樓層之間有一段樓梯,雖然我一次可以爬1個臺階、2個臺階和3個臺階,但是我在i與i+1層之間的樓梯上時,我不能跨越到i+1與i+2層之間的樓梯。現在有個n層的樓,知道每一段樓梯的階數,我想知道,如果我只會往上走,並且忽略其他不在樓梯上的其他移動,共有多少種方案可以到達第n層。
Input
第一行一個整數T(0<T<=50)表示有多少組樣例。
對於每一組樣例:
第一行一個n(1<n<=50)表示有多少層樓。
接下來一行,包括n-1個整數xi(0<xi<=20),由下到上依次表示每段樓梯的長度。
Output
對於每組數據,輸出一行表示共有多少種方案。由於答案較大,所以輸出答案請對10007取模。
Sample Input
Sample Output
#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
Sample Output
#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^9,K<=1000)。
Output
一個非負整數,表示最少需要買多少新瓶子。
Sample Input
Sample Output
#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,表示樹上節點的個數(從 1 到 N 標號)。
接下來的 N-1 行包含三個整數 a, b, len,表示有一根長度爲 len 的樹枝/樹幹在節點 a 和節點 b 之間。
接下來一行包含一個整數 M,表示詢問數。
接下來M行每行兩個整數 S, T,表示毛毛蟲從 S 爬行到了 T,詢問這段路程中的樹枝/樹幹是否能拼成三角形。
Output
對於每組數據,每個詢問輸出一行,包含"Yes"或“No”,表示是否可以拼成三角形。
Sample Input
Sample Output
HINT
對於20%數據 1 ≤ N, M ≤ 1000
對於所有數據 1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000
待補。。。。。
Problem G: 等凹數字
Description
定義一種數字稱爲等凹數字,即從高位到地位,每一位的數字先非遞增再非遞減,不能全部數字一樣,且該數是一個迴文數,即從左讀到右與從右讀到左是一樣的,僅形成一個等凹峯,如543212345,5544334455是合法的等凹數字,543212346,123321,111111不是等凹數字。現在問你[L,R]中有多少等凹數字呢?
Input
第一行一個整數T,表示數據的組數。
接下來T行每行倆個數字L和R,(1<=L<=R<=1e18)
Output
輸出一個整數,代表[L,R]中有多少等凹數字
Sample Input
Sample Output
HINT
小於等於2位的數字無凹峯
Problem H: tmk買禮物
Description
今天是校賽的日子,爲了慶祝這麼喜慶的日子,TMK打算買些禮物給女票LSH慶祝一下。
TMK進入了雪梨超市,然後剛踏入的一瞬間,店主就對TMK說:“恭喜你成爲了本店第2147483647位顧客,本店在搞一個活動,對本店第2147483647位顧客進行贈送活動。你先看看你有多少錢?”
TMK一摸口袋,發現只有n個硬幣,每個硬幣的價值爲a[i]。
然後店主繼續說:“現在你用你的錢湊一些數,如果你的錢能湊成[0,x]裏面所有的數,那麼你將會免費獲得該店價值x元的代金券,假設你有四個硬幣面值分別爲1,2,4,100,你就可以湊成[0,7]裏面所有的數,我們將會送你7元的代金券。現在就用你的硬幣來試試吧。Enjoy yourself!”
在TMK努力湊錢的時候,店主想知道他要送多少代金券給TMK。
Input
第一行一個整數T,表示數據組數。
對於每組數據,首先讀入一個整數n(n<=100000),然後接下來的一行有n個整數,表示a[i] (0<a[i]<=1e9)
Output
對於每個數據,輸出一個整數x,表示店主要送x元的代金券給TMK
Sample Input
Sample Output
#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:這次比賽打得不是太好,老是犯一些比較低級的錯誤,希望下次能夠改正