Test Message

d511: 小明的作業

內容

小明這學期的數學課教到了三角形,於是老師給了他們一個作業,這個星期一到星期五每個人上學時都要帶三根樹枝到學校來,如果那三根樹枝可以構成一個三角形,那天就可以加一分。給你小明所帶樹枝的長度,請你幫他看看他可以加幾分?


輸入

輸入一共有 5 行,每行有 3 個整數,代表當天小明所帶的樹枝的長度。

1 2 3
2 4 6
3 4 5
5 3 2
1 3 5

輸出

輸出一個整數,代表小明可以加幾分。

1


解題思路

簡單的迴圈 + 排序 + 條件判斷。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>
#include <stdlib.h>

int cmp(const int* lhs, const int* rhs)
{
return *lhs - *rhs;
}

int main()
{
int list[3], ans = 0;
for (int h = 0; h < 5; h++)
{
for (int i = 0; i < 3; i++)
scanf(" %d", &list[i]);
qsort(list, 3, sizeof(int), cmp);
if (list[0] + list[1] > list[2]) ans++;
}
printf("%d\n", ans);
return 0;
}

d498: 我不說髒話

內容

文文小學時因交友不慎,學會了說髒話。有一天他說髒話時被老師聽到了,結果被罰在黑板上寫 n 遍「I don’t say swear words!」


輸入

輸入只有一行,其中含有一個正整數 n,代表文文被罰寫的次數。

2

輸出

輸出 n 行「I don’t say swear words!」

I don’t say swear words!
I don’t say swear words!


解題思路

簡單的迴圈。


完整程式碼

AC (2ms, 96KB)
#include <stdio.h>

int main()
{
int n;
scanf("%d", &n);
while (n--)
puts("I don't say swear words!");
return 0;
}

d491: 我也愛偶數 (swap 版)

內容

文文愛偶數,無獨有「偶」地,珊珊也愛偶數。珊珊除了收藏偶數以外,每次她收到一些數字時,她還會把其中的偶數挑出來把玩並予以加總。今天珊珊又收到了一個範圍的連續整數,請問這次她從這段數字中所收集到的偶數的總和是多少?


輸入

輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a, b ≤ 2147483647)。(a 不一定會小於等於 b 哦!)

5 2

輸出

請輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 所有偶數的和,(答案會 ≤ 2147483647)。

6


解題思路

d490,但題目不再保證 a <= b,所以在計算前先判斷 a > b 的話就先互換再做計算。


完整程式碼

AC (2ms, 112KB)
#include <stdio.h>
#define SWAP(x, y) (x)^=((y)^=((x)^=(y)))

int main()
{
int n, m;
scanf(" %d %d", &n, &m);
if (m < n) SWAP(n, m);
n += (n & 1), m -= (m & 1);
printf("%d\n", ((n + m) * ((m - n) / 2 + 1)) / 2);
return 0;
}

d490: 我也愛偶數

內容

文文愛偶數,無獨有「偶」地,珊珊也愛偶數。珊珊除了收藏偶數以外,每次她收到一些數字時,她還會把其中的偶數挑出來把玩並予以加總。今天珊珊又收到了一個範圍的連續整數,請問這次她從這段數字中所收集到的偶數的總和是多少?


輸入

輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a ≤ b ≤ 2147483647)。

2 5

輸出

請輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 所有偶數的和,(答案會 ≤ 2147483647)。

6


解題思路

觀念承接 d485 ,這題就是再用梯形公式算出總和即可。


完整程式碼

AC (2ms, 116KB)
#include <stdio.h>

int main()
{
int n, m;
scanf(" %d %d", &n, &m);
n += (n & 1), m -= (m & 1);
printf("%d\n", ((n + m) * ((m - n) / 2 + 1)) / 2);
return 0;
}

d489: 伏林的三角地

內容

斜角巷是一個已開發的老社區,其中的空地取得非常地困難。但是隨著社會的進步,人們想要蓋的房子越來越大,但是越大的土地就越難取得,因此,越大的土地價格也越高。事實上,在斜角巷的土地價格便是以土地面積的平方來計算的。伏林在斜角巷有一塊三角形的土地,給你那塊土地的邊長,她想請你幫她算算那塊土地價值多少錢?


輸入

輸入只有一行,含有三個以空白隔開的正整數,代表伏林的三角形土地的三邊長。

3 4 5

輸出

請輸出一個整數,代表伏林的土地的價值。其價值會是一個介於 1 和 2147483647 之間的整數。

36


解題思路

海龍公式了解一下。


完整程式碼

AC (2ms, 112KB)
#include <stdio.h>

int main()
{
int a, b, c, s;
scanf(" %d %d %d", &a, &b, &c);
s = (a + b + c) / 2;
printf("%d\n", s * (s - a) * (s - b) * (s - c));
return 0;
}

d485: 我愛偶數

內容

文文很喜歡偶數,他甚至有收集偶數的習慣。你給他一個範圍的連續整數,他就會把其中的偶數留下來收藏。如今他又拿到了一個範圍的整數,請問他這次收藏了幾個偶數?對文文來說,0 也算是一個偶數哦!


輸入

輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a ≤ b ≤ 2147483647)。

1 4

輸出

輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 一共有多少個偶數。

2

提示

你可以只用算術運算子,而不用 if 指令來完成這題嗎?


解題思路

  1. 先不考慮首末兩項,中間項目總數 = (max - min) + 1
  2. 而如果末項為奇數,那 ((max - 1) - min) + 1 和 (max - min) + 1 的總偶數項不會變,同理套用到首項。
  3. 偶數的出現頻率為每兩項出現一次,所以假設首末兩項皆為偶數,那偶數出現的總次數 = Floor((max - min) / 2) + 1,
  4. 任何整數和位元 AND('&')做運算,若該數為偶數則值恆為 0 ,反之則為 1 。

運用上面的想法,整理出公式

偶數次數 = (max - (max & 1) - (min + (min & 1))) / 2 + 1
= (max - min - (max & 1) - (min & 1)) / 2 + 1

將輸入套入公式輸出即可。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>

int main()
{
int n, m;
scanf(" %d %d", &n, &m);
printf("%d\n", (m - n - (m & 1) - (n & 1)) / 2 + 1);
return 0;
}

d483: hello, world

內容

Hello, World 程式指的是只在計算機螢幕上輸出「Hello, World!」(意為「世界,你好!」)這行字元串的計算機程式。一般來說,這是每一種計算機程式語言中最基本、最簡單的程式,亦通常是初學者所編寫的第一個程式。它還可以用來確定該語言的編譯器、程式開發環境,以及執行環境是否已經安裝妥當。

將輸出字元串 “Hello World” 作為第一個範例程式,現在已經成為程式語言學習的傳統。該程式因 Brian Kernighan 和丹尼斯·裡奇(Dennis M. Ritchie)所著的計算機程式設計教程《C 語言程式設計》(The C Programming Language)中使用而廣泛流傳;但這本書並不是 “Hello World” 的濫觴,雖然這是一個普遍存在的錯誤認知。

「Hello World」範常式式最早出現於 1972 年,由貝爾實驗室成 員 Brian Kernighan 撰寫的內部技術文件《Introduction to the Language B》之中。不久同作者於 1974 年所撰寫的《Programming in C: A Tutorial》,也延用這個範例;而以本文件擴編改寫的《C 語言程式設計》也保留了這個範例程式。

起初,”hello, world” 程式的標準列印內容必須滿足「全小寫,無驚嘆號,逗點後需空一格」。不過沿用至今,完全恪守傳統的反而罕見。


輸入

為了驗證程式的正確性,大多數的題目多會提供輸入資料。你的程式必須讀入輸入資料,再依據你讀到的資料求出所要求的結果並將之輸出。你看不到這些輸入的資料,所以你也無法預測要輸出什麼結果,因此你的程式必須依照題目的要求來計算。但是作為學習程式設計的第一題,你的程式不需要讀入任何的資料,當然也不需要依據輸入的資料來計算,只需要輸出一個固定的字串就可以了。

輸出

請輸出「hello, world」文字 (不含「」)。

hello, world


解題思路

簡單的 hello, world。


完整程式碼

AC (1ms, 92KB)
#include <stdio.h>

int main()
{
puts("hello, world");
return 0;
}

d478: 共同的數 - 簡易版

內容

因為學長覺得 d136 太可怕,所以出一題簡單版的 XD

小潘跟小花都有很多個正整數,自己的數不會有重覆出現的,而且都是遞增排列。

現在她們想要知道,兩個人的數有幾個重覆的呢?


輸入

第一行有兩個數字 n,m。 (1<=n<=100,1<=m<=10000)

接著共有 n 筆測資,每筆測資共有兩行,分別代表兩個人擁有的數,每行共有 m 個數。

所有數字都不大於 23-1。

2 6
1 5 6 8 9 13
3 4 5 7 8 11
4 6 7 14 16 23
6 9 12 13 16 23

輸出

每筆測資請輸出一個數字,

代表兩個人的數有幾個重覆的。

2
3


解題思路

兩陣列皆為遞增排列,所以不用排序直接從頭開始比較比較兩陣列

  • 若相同,數量 + 1,兩陣列索引都加一
  • 若不同,值較小的陣列索引加一

當某一陣列數字用完了就跳出,得到的數量就是答案。

本題輸入測資頗大,做輸入優化可以省不少時間。


完整程式碼

AC (21ms, 1.1MB)
#include <stdio.h>
#define BUFSIZE 1048576
#define MAX 10010

unsigned int lhs[MAX], rhs[MAX];

inline char readChar()
{
static char buffer[BUFSIZE], * now = buffer + BUFSIZE, * end = buffer + BUFSIZE;
if (now == end)
{
if (end < buffer + BUFSIZE)
return EOF;
end = (buffer + fread(buffer, 1, BUFSIZE, stdin));
now = buffer;
}
return *now++;
}

inline char readUInt(unsigned int* dst)
{
register char ch;
while ((ch = readChar()) < '0')
if (ch == EOF) return 0;
*dst = ch ^ '0';
while ((ch = readChar()) >= '0')
* dst = (*dst << 3) + (*dst << 1) + (ch ^ '0');
return 1;
}

int main()
{
int n, m, l, r, count;
scanf(" %d %d", &n, &m);
while (n--)
{
count = l = r = 0;
for (int i = 0; i < m; i++)
readUInt(&lhs[i]);
for (int i = 0; i < m; i++)
readUInt(&rhs[i]);
for (;;)
{
if (lhs[l] < rhs[r])
{
if (++l == m) break;
}
else if (rhs[r] < lhs[l])
{
if (++r == m) break;
}
else
{
count++;
if (++l == m) break;
if (++r == m) break;
}
}
printf("%d\n", count);
}
return 0;
}

d471: 0 與 1 的遊戲

內容

有 1 個 bit,可以表示 0 與 1。

有 2 個 bit,可以表示 00,01,10,11。

有 n 個 bit,請產生所有 n 個 bit 所能表示的 2 進位數字。


輸入

每行一個數字 n ( 0 < n < 15 )

代表 n 個 bit

1
2

輸出

請參考範例輸出

0
1
00
01
10
11


解題思路

用 DFS 窮舉目標位元數的所有 2 進制可能性即可。


完整程式碼

AC (3ms, 76KB)
#include <stdio.h>

int n;
char ans[16];

void dfs(int lv)
{
if (lv == n)
{
puts(ans);
return;
}
ans[lv] = '0';
dfs(lv + 1);
ans[lv] = '1';
dfs(lv + 1);
}

int main()
{
while (scanf(" %d", &n) == 1)
{
ans[n] = 0;
dfs(0);
}
return 0;
}

d461: 班際籃球賽

內容

又到了一年一度班際籃球賽的季節了,今年有 10 個班級組隊參加,比賽採單淘汰制,學校所排的賽程如下:

img1

為了公平起見,學校在排賽程時,有兩個規定:

  1. 每個隊伍要取得冠軍所需贏得的比賽場數的差異不能大於一場。例如 101 贏 3 場可以獲得冠軍,但是 102 卻必須贏 4 場才可以獲得冠軍,其差異沒有大於一場。

  2. 每一場比賽的兩個隊伍必須由兩個隊數差異不大於一隊的組別所產生。例如 101, 102, 103 這三隊所產生的優勝隊伍必須和 104, 105 這兩隊所產生的隊伍比賽,兩邊所包含的隊伍數差異不大於一隊。

在這兩個規則下,請幫忙計算如果有 n 個隊伍報名參賽,至少必須舉辦幾場比賽才能產生一個冠軍隊伍。


輸入

輸入只有一行,包含一個整數 n,代表報名參賽的隊伍數目。

10

輸出

請輸出一個整數,代表至少必須舉辦幾場比賽。

9


解題思路

題目中的規定並不是很重要,本題重點是單淘汰制,所以每比一場賽,就會有一組被淘汰。

而要產生冠軍,就只能將其他組都淘汰剩下一組,那根據上面一場比賽一個淘汰的邏輯,要產生冠軍的總賽數 = 總組數 - 1,所以將輸入 - 1 輸出即可。


完整程式碼

AC (2ms, 100KB)
#include <stdio.h>

int main()
{
int n;
scanf(" %d", &n);
printf("%d", n - 1);
return 0;
}
1789101127