題目 B1047 編程團體賽
-
題意
計算每個隊伍的總分數,並輸出得分最高的隊伍編號及其分數。 -
思路
隊伍編號連續大小固定,直接建立數組以下標與之對應,並且在輸入的過程中就可以用一個變量去指示最大值得下標。(這裏可以巧妙利用0下標不會使用並且其值初始化爲0) -
Code in C++
#include <cstdio>
#include <algorithm>
int group[1001] = {0};
int main()
{
int n, gp, member, score, maxscore = 0;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d-%d %d", &gp, &member, &score);
group[gp] += score;
if (group[maxscore] < group[gp]) {
maxscore = gp;
}
}
printf("%d %d", maxscore, group[maxscore]);
return 0;
}
題目 A1041 Be Unique
-
題意
輸入n個數,輸出第一個不與其他數重複的數。 -
思路
根據需求很明顯與輸入數相關,所以需要將輸入數存下來,然後在輸入的過程中對每個數出現的次數記錄,然後遍歷輸入的數,如果次數爲1則輸出即可。 -
Code in C++
#include <cstdio>
#define maxnu 10001
#define maxn 100001
int number[maxnu] = {0};
int guess[maxn] = {0};
int main()
{
int n;
scanf("%d",&n);
for (int i = 0; i < n; ++i) {
scanf("%d", &guess[i]);
++number[guess[i]];
}
int num = -1;
for (int i = 0; i < maxn; ++i) {
if (number[guess[i]] == 1) {
num = guess[i];
break;
}
}
if (num == -1) printf("None");
else printf("%d", num);
return 0;
}
題目 A1050 String Subtraction
-
題意
輸出去除第二個字符串中字符後第一個字符串的結果。 -
思路
記錄第二個串中出現的字符,因爲字符最多256
個,值大小爲0-255
。所以我這裏直接申請了大小爲256
的數組。然後遍歷第一個字符串,輸出沒有出現的字符。 -
Code in C++
#include <iostream>
#include <string>
int hashTable[256] = {0};
int main()
{
std::string s1, s2;
getline(std::cin, s1);
getline(std::cin, s2);
for (int i = 0; i < s2.size(); ++i) {
++hashTable[s2[i]];
}
for (int i = 0; i < s1.size(); ++i) {
if (hashTable[s1[i]] == 0) {
printf("%c", s1[i]);
}
}
return 0;
}
題目 B1005 繼續(3n+1)猜想
-
題意
按從大到小的順序輸出沒有被其他數字在求解3n+1
過程中覆蓋的數字。 -
思路
對於輸入的每個數字都進行3n+1
操作,然後針對操作過程中的每個n
爲映射中的鍵,遇到就加一。存下輸入的數組,並對其排序,然後逆序遍歷找到其中值爲1
的項就輸出,這裏通過flag
去控制是否輸出空格。
注意:
映射方式如果採用數組的話大小不能設置太小,因爲99會因爲計算過程暴漲到224,我試了好幾次改大小但是還是段錯誤了。後來直接換了map
的方式。 -
Code in C++
#include <cstdio>
#include <algorithm>
#include <map>
#define maxn 101
int number[maxn] = {0};
std::map<int, int> hashTable;
void guess(int n) {
while (n!=1) {
if (hashTable.count(n) == 0) hashTable[n] = 1;
else ++hashTable[n];
if (n % 2 == 1) {
n = (3*n+1) / 2;
} else {
n /= 2;
}
}
}
int main()
{
int k;
scanf("%d", &k);
for (int i = 0; i < k; ++i) {
scanf("%d", &number[i]);
guess(number[i]);
}
std::sort(number, number + k);
bool flag = false;
for (int i = k - 1; i >= 0; --i) {
if (hashTable.count(number[i]) && hashTable[number[i]] == 1) {
if (flag) printf(" ");
flag = true;
printf("%d",number[i]);
}
}
return 0;
}
小結
map
映射方式可以用於不確定大小的情況以及下標不連續的情況,其他情況使用數組更爲優化。
今天刷題依舊還是挺快的,最後一個的數組大小調了一會兒,耗時卡到了59分,所以就沒有刷這一章節的最後一題了。