B类题目
B1041
主要考察查找问题,可以建立一个结构体数组,里面存放id和testseat。输入时将内容赋值给T[seat],输出时直接输出T[seat]即可。
注意不能直接用char[16],因为字符数组不能一次赋值,需要循环赋值,可以用long long
#include<cstdio>
const int N = 1010;
struct student
{
long long id;
int examseat;
}testnum[N];
int main()
{
long long id;
int examseat, seat;
int n, m;
scanf("%d", &n);
while(n--)
{
scanf("%lld %d %d", &id, &seat, &examseat);
testnum[seat].id = id;
testnum[seat].examseat = examseat;
}
scanf("%d", &n);
while(n--)
{
scanf("%d", &m);
printf("%lld %d\n",testnum[m].id, testnum[m].examseat);
}
return 0;
}
B1028
本题先定义一个结构体,同时写一个大于等于函数和小于等于函数,定义5个结构体变量,temp用于读入,最大最小人,左右边界。初始化时先将最大最小左右边界的年月日赋值。输入时用temp读入同时设置cnt变量记录有效读入数,如果大于左边界小于右边界则合乎规范,cnt + 1并且更新max min。
#include<cstdio>
struct person
{
char name[10];
int yy, mm, dd;
}temp, left, right, old, young;
bool MoreEqu(person a, person b)
{
if(a.yy != b.yy) return a.yy >= b.yy;
if(a.mm != b.mm) return a.mm >= b.mm;
if(a.dd != b.dd) return a.dd >= b.dd;
}
bool LessEqu(person a, person b)
{
if(a.yy != b.yy) return a.yy <= b.yy;
if(a.mm != b.mm) return a.mm <= b.mm;
if(a.dd != b.dd) return a.dd <= b.dd;
}
void Init()
{
left.yy = young.yy = 1814;
right.yy = old.yy = 2014;
left.mm = young.mm = right.mm = old.mm = 9;
left.dd = young.dd = right.dd = old.dd = 6;
}
int main()
{
Init();
int n, cnt = 0;
scanf("%d", &n);
while(n--)
{
scanf("%s %d/%d/%d", temp.name, &temp.yy, &temp.mm, &temp.dd);
if(MoreEqu(temp, left) && LessEqu(temp, right))
{
cnt++;
if(MoreEqu(temp, young)) young = temp;
if(LessEqu(temp, old)) old = temp;
}
}
if(cnt == 0) printf("0");
else printf("%d %s %s", cnt, old.name, young.name);
return 0;
}
B1027
本题是图形输出题目,设置bottom变量又来确定最底行需要输出的个数,首先由数学表达式得出x≤(2*(n+1))1/2,如果bottom为偶数再减1,然后正常输出即可。
#include<cstdio>
#include<cmath>
int main()
{
char c;
int n;
scanf("%d %c", &n, &c);
int bottom = (int)sqrt(2.0 * (n + 1)) - 1;
if(bottom % 2 == 0) bottom --;
int used = (bottom + 1) * (bottom + 1) / 2 - 1;
for(int i = bottom; i >= 1; i = i - 2)
{
for(int j = 0; j < (bottom - i) / 2; j++)
printf(" ");
for(int j = 0; j < i; j++)
printf("%c", c);
printf("\n");
}
for(int i = 3; i <= bottom; i = i + 2)
{
for(int j = 0; j < (bottom - i) / 2; j++)
printf(" ");
for(int j = 0; j < i; j++)
printf("%c", c);
printf("\n");
}
printf("%d", n - used);
return 0;
}
B1037
本题和时间换算一样的,注意输出格式即可
#include<cstdio>
#include<algorithm>
int main()
{
int g, s, k;
scanf("%d.%d.%d", &g, &s, &k);
int pay = k + s *29 + g * 29 * 17;
scanf("%d.%d.%d", &g, &s, &k);
int have = k + s *29 + g * 29 * 17;
int res = have - pay;
if(have < pay)
{
printf("-");
res = -1 * res;
}
printf("%d.%d.%d", res / (29 * 17), res % (29 * 17) / 29,res % 29);
return 0;
}
A类题目
A1011
本题也是查找数字的题目,用两层循环进行读入。外循环读入三行,内循环读入三个数字,每次读入数字时都更新最大值,在内循环结束时,进行累乘并且输入当前行最大行所对应的字母。最后用%.02输入两位有效数字。
#include<cstdio>
char S[3] = {'W','T','L'};
int main()
{
float temp, a, sum = 1.0;
int k;
for(int i = 0; i < 3; i++)
{
temp = 0.0;
for(int j =0; j < 3; j++)
{
scanf("%f", &a);
if(a > temp)
{
temp = a;
k = j;
}
}
sum = sum * temp;
printf("%c ",S[k]);
}
printf("%.02f", (sum * 0.65 - 1) * 2);
return 0;
}
A1006
本题和年龄监测题目一样,先写入一个大于等于的时间函数。同时定义最迟最早和temp结构体变量。先初始化最迟最早的时间。在循环中第一次读入的是最早时间的,对最早时间进行更新。再读入数据是最迟时间,对最迟时间进行更新。
#include<cstdio>
struct person
{
char id[20];
int hh, mm, ss;
}temp, max, min;
bool MoreEqu(person a, person b)
{
if(a.hh != b.hh) return a.hh >= b.hh;
if(a.mm != b.mm) return a.mm >= b.mm;
if(a.ss != b.ss) return a.ss >= b.ss;
}
int main()
{
int n;
scanf("%d", &n);
max.hh = -1, max.mm = 0, max.ss = 0;
min.hh = 24, min.mm = 60, min.ss = 60;
while(n--)
{
scanf("%s %d:%d:%d", temp.id, &temp.hh, &temp.mm, &temp.ss);
if(MoreEqu(min, temp)) min = temp;
scanf("%d:%d:%d", &temp.hh, &temp.mm, &temp.ss);
if(MoreEqu(temp, max)) max = temp;
}
printf("%s %s",min.id, max.id);
return 0;
}
A1036
本题和前面的都是一样的,设置男生最小值和女生最大值和temp三个结构体变量。开始时要对男小和女大变量进行初始化。用temp和一个临时变量gender读入数据,根据gender确定是男生和女生同时做出相应的更新。输出时如果男小或者女大的值等于初始值说明此变量没有更新,从而做出给定输出。
#include<cstdio>
struct student
{
char name[15];
char id[15];
int grade;
}temp, fmax, mmin;
int main()
{
int n;
char gender;
scanf("%d", &n);
fmax.grade = -1;
mmin.grade = 101;
while(n --)
{
scanf("%s %c %s %d",temp.name, &gender, temp.id, &temp.grade);
if(gender == 'F')
if(temp.grade > fmax.grade)
fmax = temp;
if(gender == 'M')
if(temp.grade < mmin.grade)
mmin = temp;
}
if(fmax.grade == -1) printf("Absent\n");
else printf("%s %s\n", fmax.name, fmax.id);
if(mmin.grade == 101) printf("Absent\n");
else printf("%s %s\n", mmin.name, mmin.id);
if(fmax.grade == -1 || mmin.grade == 101) printf("NA\n");
else printf("%d", fmax.grade - mmin.grade);
return 0;
}
A1031
本题关键是正确表示行和列的规律,n1 = n2 = (N + 2) / 3,可以用二维数组输出,也可以直接控制输出。
直接控制:
#include<cstdio>
#include<cstring>
int main()
{
char str[100];
scanf("%s", str);
int N = strlen(str);
int n1 = (N + 2) / 3, n3 = n1, n2 = N + 2 - n1 - n3;
for(int i = 0; i < n1 - 1; i++)
{
printf("%c", str[i]);
for(int j = 0; j < n2 - 2; j++)
printf(" ");
printf("%c\n", str[N - i - 1]);
}
for(int i = 0; i < n2; i++)
printf("%c", str[n1 - 1 + i]);
return 0;
}
二维数组:
#include<cstdio>
#include<cstring>
char str[100], ans[40][40];
int main()
{
scanf("%s", str);
int N = strlen(str);
int n1 = (N + 2) / 3, n3 = n1, n2 = N + 2 - n1 - n3;
for(int i = 1; i <= n1; i++)
{
for(int j = 1; j <= n2; j++)
ans[i][j] = ' ';
}
int pos = 0;
for(int i = 1; i <= n1; i++)
ans[i][1] = str[pos++];
for(int i = 2; i <= n2; i++)
ans[n1][i] = str[pos++];
for(int i = n3 - 1; i >= 1; i--)
ans[i][n2] = str[pos++];
for(int i = 1; i <= n1; i++)
{
for(int j = 1; j <=n2; j++)
printf("%c", ans[i][j]);
printf("\n");
}
return 0;
}
A1019
进制转换+回文数判断
#include<cstdio>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int z[40],num = 0;
bool flag = true;
do{
z[num++] = a % b;
a = a / b;
}while(a != 0);
for(int i = 0; i < (num) / 2; i++)
{
if(z[i] != z[num - 1 - i])
{
flag = false;
break;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
for(int i = num - 1; i >= 0; i--)
{
printf("%d", z[i]);
if(i != 0) printf(" ");
}
return 0;
}
A1027
设置一个字符数组对应字符即可
#include<cstdio>
char radix[13] = {'0','1','2','3','4','5','6','7','8','9','A','B','C'};
int main()
{
int r, g, b;
scanf("%d %d %d", &r, &g, &b);
printf("#");
printf("%c%c", radix[r / 13], radix[r % 13]);
printf("%c%c", radix[g / 13], radix[g % 13]);
printf("%c%c", radix[b / 13], radix[b % 13]);
return 0;
}
A1058
模拟加法运算加一个进位即可,注意和B1037减法做对应
#include<cstdio>
int main()
{
int a[3], b[3], c[3];
scanf("%d.%d.%d", &a[2], &a[1], &a[0]);
scanf("%d.%d.%d", &b[2], &b[1], &b[0]);
int carry = 0;
c[0] = (a[0] + b[0]) % 29;
carry = (a[0] + b[0]) / 29;
c[1] = (a[1] + b[1] + carry) % 17;
carry = (a[1] + b[1] + carry) / 17;
c[2] = a[2] + b[2] + carry;
printf("%d.%d.%d\n", c[2], c[1], c[0]);
return 0;
}
进制转换问题:
进制转换需要两步:
1.将p进制数转换成10进制数
int y = 0, product = 1;
while(x != 0)
{
y = y + (x % 10) * product; //取出x的个位并且乘以对应的位权
x = x / 10; //去掉x的个位
product = product * p; //p是p进制
}
2.将10进制数转换成y进制数z
int z[num], num = 0;
do{
z[num ++] = y % Q;
y = y / Q;
}while(y != 0);
注意不要使用while循环否则若y=0会出错,正确的应该是z[0]=0;