题目 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分,所以就没有刷这一章节的最后一题了。