OJ算法题共10个篇幅,不定期在篇幅里增加题目(篇幅不增加)。
个人水平有限,如有错误和可以改进的地方,非常期待批评指正,谢谢!
题目描述:
象棋中,车走一步可以抵达同一行或同一列的某个位置,给你三个车的坐标,判断有几辆车可以一步到达指定坐标。
输入:
第一行输入两个整数x,y
(中间用空格隔开),代表需要抵达的坐标。
第二行输入x1,y1,x2,y2,x3,y3
(中间用空格隔开),代表三辆车的坐标。 数据保证坐标合法(即你不用考虑输入不合法的情况,无须进行不合法数据的判断和处理),且车不会阻碍其他车到达指定的坐标。
输出:
输出可以一步抵达指定坐标的车的数量。
输入样例:
1 1
1 7 8 1 3 3
输出样例:
2
#include"stdio.h"
int main(){
int x,y;
int x1,y1,x2,y2,x3,y3;
int i=0;
scanf("%d%d%d%d%d%d%d%d",&x,&y,&x1,&y1,&x2,&y2,&x3,&y3);
if(x==x1||y==y1){
i++;
}
if(x==x2||y==y2){
i++;
}
if(x==x3||y==y3){
i++;
}
printf("%d",i);
return 0;
}
题目描述
给出一个分子式(不带括号),求相对分子质量。本题只包含4种原子,分别为C,H,O,N,相对原子质量分别为12.01,1.008,16.00,14.01,(单位:g/mol)。
输入
输入一个不带括号的分子式,字符串长度不超过100,分子式只有大写字母。
输出
输出分子式的相对分子质量,小数点后保留三位。
输入样例
C2H5OH
输出样例
94.108
考察知识点:
字符串处理
解题思路:
将输入的串从头到尾扫描,遇到字母,则进一步扫描后面的数字的区间,进行字符串到整数的转换,再乘以其的原子质量,最后累加到sum中即可。
注意两个字母相邻的情况,直接累加原子质量到sum。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char s[100];
int main () {
scanf("%s", s);
int i;
int sum = 0;
double m = 0, n = 0;
for (i = 0; i < strlen(s); i++) {
if (isupper(s[i])) {
switch (s[i]) {
case 'C': n = 12.01; break;
case 'H': n = 1.008; break;
case 'O': n = 16.00; break;
case 'N': n = 14.01; break;
}
sum = 0;
}
// 字符串转整数
while (isdigit(s[i])) {
sum = sum * 10 + s[i] - '0';
if (!isdigit(s[i + 1]))
break;
i++;
}
if (sum != 0)
m += sum * n;
else if (!isdigit(s[i + 1]))
m += n;
}
printf("%.3f\n", m);
return 0;
}
题目描述
给定一个长度为 n
的单调非下降有序数组(可能有重复元素),以及 k 个询问,每个询问包含一个整数 m
。
对于每个询问,输出数组中整数 m
出现的最大下标(下标从0开始),若数组中没有 m,则输出 ?1
。
输入
第一行为两个正整数 n,k(n,k≤105)
,n 为数组长度,k
为询问个数。
第二行为 n
个整数 ai,为数组的 n
个元素,保证在 int 范围内,且这n个数是单调非下降的。
第 3~k+2
行每行一个整数mi,保证在 int 范围内,依次为 k 个询问对应的整数 m
。
输出
对于每个询问,输出一行一个整数 index
,为该询问的答案。
输入样例
10 3
1 2 3 3 4 5 6 8 8 8
5
3
8
输出样例
5
3
9
HINT
使用线性查找可能会超时
#include<stdio.h>//内存超时
int main()
{
int a,b,c,d;
scanf("%d%d",&a,&b);
int e[a+1],f[b+1];
for(c=1;c<=a;c++)
{
scanf("%d",&e[c]);
}
for(d=1;d<=b;d++){
scanf("%d",&f[d]);
}
for(int j=1;j<=d;j++){
int x=0;
for(int i=1;i<=a;i++)
{
if(e[i]==f[j]){
x=i;
}
}
if(x!=0)printf("%d\n",x-1);
}
return 0;
}
题目描述
Terry 现在有一个括号序列,问它们是否可以完全匹配。
输入
一行字符串,长度小于 100
,只包括 ()[]<> 中的字符。
输出
输出一行,如果可以完全匹配,输出 Yes,失配则输出 No。
输入样例
<>>
输出样例
No
#include<stdio.h>
int stack[100],s_top=0;
void push(int?v)
{
stack[s_top++]=v;
}
int stack_empty()
{
return s_top==0;
}
int pop()
{
return stack[--s_top];
}
int main()
{
char s[100];
scanf("%s",?s);
char*p;
int d;
for(p=s;*p!='\0';p++)
{
if(*p=='('||*p=='['||*p=='<')
push(*p);
if(*p==')'||*p==']'||*p=='>')
{
if(stack_empty()){
printf("No");
return?0;}
d=pop();
if((*p=='('&&d==')')||(*p=='['&&d==']')||(*p=='<'&&d=='>'))
continue;
}
}
stack_empty()?printf("Yes"):printf("No");
}
一个整数 a(0<a<100)
输出
a+1
行,从到 0℃ 到 a℃
所有整数对应的华氏温度,结果向下取整。
输入样例
3
输出样例
0 C = 32 F
1 C = 33 F
2 C = 35 F
3 C = 37 F
HINT
不需要长度控制,确认输出格式与样例一致
#include<stdio.h>
int main()
{
int a,i;
scanf("%d",&a);
for(i=0;i<=a;i++)
printf("%d C = %d F\n",i,i*9/5+32);
}