算法笔记刷题(100000575-100000577)
100000575
A
一直运行错误 原来tree
少写了一位
memset
头文件 按字节填补 0或-1
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int L, M, tree[10001], remain;
while (~scanf("%d%d", &L, &M)) {
remain = 0;
memset(tree, 0, sizeof(tree));
if (M == 0) break;
for (int i = 0; i < M; i++) {
int start, end;
scanf("%d%d", &start, &end);
for (int i = start; i <= end; ++i) {
tree[i] = 1;
}
}
for (int i = 0; i <= L; ++i) {
if (tree[i] == 0) {
++remain;
}
}
printf("%d\n", remain);
}
return 0;
}
B
sscanf
字符串提取数字 提取负数有点问题,数字最后一位提取不出
#include <cstdio>
int main()
{
char a[15], b[15], A[15], B[15];
int resa, resb;
while (~scanf("%s %s",a,b))
{
int signa=(a[0]=='-')?1:0, signb= (b[0] == '-') ? 1 : 0,i,k=0;
for (i = 0; a[i] != '\0'; ++i) {
if (a[i] != ',') {
A[k] = a[i];
k++;
}
}
A[k] = '\0';
k = 0;
for (i =0; b[i] != '\0'; ++i) {
if (b[i] != ',') {
B[k] = b[i];
k++;
}
}
B[k] = '\0';
sscanf(A, "%d", &resa);
sscanf(B, "%d", &resb);
if (signa == 1) {
resa = -resa;
}
if (signb == 1) {
resb = -resb;
}
printf("%d\n", resa+resb);
}
return 0;
}
C
#include <cstdio>
int main()
{
char a[15], b[15];
while (~scanf("%s %s", a, b)) {
int i=0,j =0,as,bs,sum=0;
while ((as=a[i] )!= '\0') {
j = 0;
while ((bs = b[j]) != '\0') {
sum += (as-48) *(bs-48);
++j;
}
++i;
}
printf("%d\n", sum);
}
return 0;
}
D
#include <cstdio>
int main()
{
int num,n;
while (~scanf("%d", &n)) {
int odd=0, even=0;
while (n--) {
scanf("%d", &num);
if (num % 2 == 0) {
++even;
}
else{
++odd;
}
}
if (even > odd) {
printf("NO\n");
}
else {
printf("YES\n");
}
}
return 0;
}
E
比较顺时针和逆时针的距离大小,选出最小的:与环的周长一半比较
dis:离1的距离
#include<cstdio>
#include<algorithm>
int main() {
int a[100000], dis[100000],n, sum=0,i,m;
scanf("%d", &n);
for (i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
dis[i + 1] = sum;
}
scanf("%d", &m);
while (m--) {
int x, y;
scanf("%d%d", &x, &y);
if (x > y)
swap(x, y);
int sum1 = dis[y] - dis[x];
printf("%d\n", sum0 < sum/2 ? sum0 : sum - sum1);
}
return 0;
}
F
int
不包括231,只包括231-1
#include<cstdio>
int main() {
int N,i=1;
long long A, B, C;
scanf("%d", &N);
while (N--)
{
scanf("%lld%lld%lld", &A, &B, &C);
if (A + B > C) {
printf("Case #%d: true\n", i);
++i;
}
else {
printf("Case #%d: false\n", i);
++i;
}
}
return 0;
}
G
#include<cstdio>
#include<cstring>
int main() {
int n, num[1000], i = 0;
while (~scanf("%d", &n)) {
int flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0, sum1 = 0, sum2 = 0, k2 = 0, num3 = 0, sum4 = 0, k4=0, max5 = -1;
memset(num, 0, sizeof(num));
for(i=0;i<n;++i) {
scanf("%d", &num[i]);
if (num[i] % 5 == 0 && num[i] % 2 == 0) {
sum1 += num[i];
flag1 = 1;
}
if (num[i] % 5 == 1) {
if (k2 % 2 == 0) {
sum2 += num[i];
}
else {
sum2 -= num[i];
}
++k2;
flag2 = 1;
}
if (num[i] % 5 == 2) {
num3 += 1;
flag3 = 1;
}
if (num[i] % 5 == 3) {
sum4 += num[i];
++k4;
flag4 = 1;
}
else if(num[i] % 5 == 4){
if (num[i] > max5) {
max5 = num[i];
}
flag5 = 1;
}
}
double avg4 = (double)sum4 / k4;
if (flag1 == 1) {
printf("%d ", sum1);
}
else {
printf("N ");
}
if (flag2 == 1) {
printf("%d ", sum2);
}
else {
printf("N ");
}
if (flag3 == 1) {
printf("%d ", num3);
}
else {
printf("N ");
}
if (flag4 == 1) {
printf("%.1f ", avg4);
}
else {
printf("N ");
}
if (flag5 == 1) {
printf("%d", max5);
}
else {
printf("N");
}
}
return 0;
}
//switch语句替换
switch (num[i] % 5)
{
case 0:
if(num[i] % 2 == 0) {
sum1 += num[i];
flag1 = 1;
}
break;
case 1:
if (k2 % 2 == 0) {
sum2 += num[i];
}
else {
sum2 -= num[i];
}
++k2;
flag2 = 1;
break;
case 2:
num3 += 1;
flag3 = 1;
break;
case 3:
sum4 += num[i];
++k4;
flag4 = 1;
break;
case 4: {
if (num[i] > max5) {
max5 = num[i];
}
flag5 = 1;
}
break;
default:
break;
}
H
重复部分可用函数实现复用
#include<cstdio>
#include<cstring>
int main() {
char DA ,DB;
char A[11], B[11],resa[11],resb[11];
int PA, PB;
int flag1 = 0, flag2 = 0;
while (~scanf("%s %c %s %c", A, &DA, B, &DB)) {
int i = 0,i1=0;
while (A[i] != '\0') {
if (A[i] == DA) {
resa[i1] = DA;
++i1;
flag1 = 1;
}
i++;
}
resa[i1] = '\0';
i=i1 = 0;
while (B[i] != '\0') {
if (B[i] == DB) {
resb[i1] = DB;
++i1;
flag2 = 1;
}
i++;
}
resb[i1] = '\0';
sscanf(resa,"%d",&PA);
sscanf(resb,"%d",&PB);
if (flag1 == 0) {
PA = 0;
}
if (flag2 == 0) {
PB = 0;
}
printf("%d\n",PA + PB);
}
return 0;
}
I
输赢关系为一个圈 用数组存输赢顺序
注意输入char之前可能需要getchar()
#include<cstdio>
#include<cstring>
char circle[5] = { 'C','J','B','C','J' };
int judge(char a, char b) {
if (a == b) {
return 0;
}
else {
for (int i = 0; i < 5; ++i) {
if (circle[i] == a && i - 1 >= 0 && i + 1 <= 4) {
if (b == circle[i - 1]) {
return -1;
}
else if(b == circle[i + 1]) {
return 1;
}
}
}
}
return -2;
}
int main() {
int n;
int lose = 0, draw = 0, win = 0, sum[3] = { 0 }, sum1[3] = {0};
char a, b;
scanf("%d",&n);
getchar();
while (n--) {
scanf("%c %c", &a, &b);
getchar();
int play = judge(a, b);
if (play == -1) {
++lose;
if (b == 'J') {
sum1[2]++;
}
else if (b == 'B') {
sum1[0]++;
}
else {
sum1[1]++;
}
}
else if (play == 0) {
++draw;
}
else if (play == 1) {
++win;
if (a == 'J') {
sum[2]++;
}
else if (a == 'B') {
sum[0]++;
}
else {
sum[1]++;
}
}
}
printf("%d %d %d\n", win, draw, lose);
printf("%d %d %d\n", lose, draw, win);
int max=-1,maxi=-1;
for (int i = 0; i < 3; ++i) {
if (sum[i] > max) {
max = sum[i];
maxi = i;
}
}
if (maxi == 0) {
printf("B ");
}
else if (maxi == 1) {
printf("C ");
}
else {
printf("J ");
}
max = -1, maxi = -1;
for (int i = 0; i < 3; ++i) {
if (sum1[i] > max) {
max = sum1[i];
maxi = i;
}
}
if (maxi == 0) {
printf("B");
}
else if (maxi == 1) {
printf("C");
}
else {
printf("J");
}
return 0;
}
100000576
A
#include<cstdio>
int main() {
int N, a[1000],score;
while (true) {
int sum = 0;
scanf("%d", &N);
if (N == 0) {
break;
}
for (int i = 0; i < N;++i) {
scanf("%d", &a[i]);
}
scanf("%d", &score);
for (int i = 0; i < N; ++i) {
if (a[i] == score) {
++sum;
}
}
printf("%d\n", sum);
}
return 0;
}
B
注意输入是多组还是一组
#include<cstdio>
int main() {
int n, x, a[200];
while (~scanf("%d", &n)) {
;int k = -1;
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
scanf("%d", &x);
for (int i = 0; i < n; ++i) {
if (x == a[i]) {
k = i;
break;
}
}
if (k < 0) {
printf("-1\n");
}
else {
printf("%d\n", k);
}
}
return 0;
}
C
char长度要设长一点 要不然运行错误
不能将编号设为int
,0开头就是8进制(0x开头是十六进制)
字符串比较strcmp
,等于=0
少一个\n
都是结果错误
没说多组数据,但是一组数据答案错误
scanf
输入字符串 空格或回车表示结束 getline
字符串中可有空格
#include<cstdio>
#include <cstring>
struct info
{
char num[50];
char name[100];
char sex[10];
int age;
}stu[1000];
int main() {
int N, M, i;
char searchnum[50];
while (~scanf("%d", &N)) {
;
for (i = 0; i < N; ++i) {
scanf("%s%s%s%d", stu[i].num, stu[i].name, stu[i].sex, &stu[i].age);
}
scanf("%d", &M);
while (M--) {
int k = -1;
scanf("%s", searchnum);
for (i = 0; i < N; i++) {
if (strcmp(stu[i].num, searchnum) == 0) {
k = i;
break;
}
}
if (k ==-1) {
printf("No Answer!\n");
}
else {
printf("%s %s %s %d\n", stu[k].num, stu[k].name, stu[k].sex, stu[k].age);
}
}
}
return 0;
}
D
#include<cstdio>
int main() {
int n, m,a[100],i,search;
while (~scanf("%d", &n)) {
for (i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
scanf("%d", &m);
while (m--) {
int flag = 0;
scanf("%d", &search);
for (i = 0; i < n; ++i) {
if (a[i] == search) {
flag = 1;
}
}
if (flag == 0) {
printf("NO\n");
}
else {
printf("YES\n");
}
}
}
return 0;
}
E
#include<cstdio>
struct info
{
int no;
char name[100];
char gender[5];
int age;
}stu[20];
int main() {
int n,m,i,no;
scanf("%d", &m);
while (m--) {
scanf("%d", &n);
for (i = 0; i < n; ++i) {
scanf("%d%s%s%d", &stu[i].no, &stu[i].name, &stu[i].gender, &stu[i].age);
}
scanf("%d", &no);
int k=-1;
for (int i = 0; i < n; ++i) {
if (stu[i].no == no) {
k = i;
break;
}
}
printf("%d %s %s %d\n", stu[k].no, stu[k].name, stu[k].gender, stu[k].age);
}
return 0;
}
100000577
A
需要多批输入,如果没有就是错误
#include<cstdio>
int main() {
int n,i,j;
while (~scanf("%d", &n)) {
for (i = 0; i < n; ++i) {
for (j = 0; j < n - 1 - i; ++j) {
printf(" ");
}
for (j = 0; j < n + i * 2; ++j) {
printf("*");
}
printf("\n");
}
}
return 0;
}
B
注意数组最后一个下标为sum-1
题目的等式与不等式翻译为:n1 n3 为不大于n2的最大值且总和为sum+2
即n1=n3=(sum+2)/3
#include<cstdio>
int main() {
char sentence[80];
while (~scanf("%s", sentence)) {
int n = 0,side,i,j,middle;
for (i = 0; sentence[i] != '\0'; ++i);
int sum = i;
side = (sum + 2) / 3;
middle = sum + 2 - 2 * side;
for (i = 0; i < side-1; ++i) {
printf("%c", sentence[i]);
for(j = 0; j < middle-2; ++j) printf(" ");
printf("%c", sentence[sum - i-1]);
printf("\n");
}
for (i = side-1; i < side-1+middle; ++i) {
printf("%c", sentence[i]);
}
printf("\n");
}
return 0;
}
C
每次都要设置成多批样例输入
#include<cstdio>
int main() {
int h,m,i,j;
while (~scanf("%d", &m)) {
while (m--) {
scanf("%d", &h);
for (i = 0; i < h; ++i) {
for (j = 0; j < h - 1 - i; ++j) {
printf(" ");
}
for (j = 0; j < h+2*i; ++j) {
printf("*");
}
for (j = 0; j < h - 1 - i; ++j) {
printf(" ");
}
printf("\n");
}
}
}
return 0;
}
D
注意下标的关系
#include<cstdio>
int main() {
int n,j,i;
while (~scanf("%d", &n)) {
for (j = 0;j < n ;++j) {
for (i = 0; i < j; ++i) {
printf(" ");
}
for (i = 0; i < n - 1-j; ++i) {
printf("* ");
}
printf("*");
for (i = 0; i < j; ++i) {
printf(" ");
}
printf("\n");
}
for (j = 1; j < n ; ++j) {
for (i = 0; i <n-1-j; ++i) {
printf(" ");
}
for (i = 0; i < j; ++i) {
printf("* ");
}
printf("*");
for (i = 0; i < n - 1 - j; ++i) {
printf(" ");
}
printf("\n");
}
}
return 0;
}