读题

这也是我第一次写博客哈,各位多多担待,欢迎大佬指教,(__) 嘻嘻……

由于pat乙级多次读错题,从而发现原来打代码读题这么重要

1看清条件范围的作用域,不要想当然

/*1067 试密码 (20分)
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。

输入格式:
输入在第一行给出一个密码(长度不超过 20 的、不包含空格、Tab、回车的非空字符串)和一个正整数 N(≤ 10),分别是正确的密码和系统允许尝试的次数。随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码。输入保证至少有一次尝试。当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。

输出格式:
对用户的每个输入,如果是正确的密码且尝试次数不超过 N,则在一行中输出 Welcome in,并结束程序;如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码;当错误尝试达到 N 次时,再输出一行 Account locked,并结束程序。

输入样例 1:
Correct%pw 3
correct%pw
Correct@PW
whatisthepassword!
Correct%pw
#

      
    
输出样例 1:
Wrong password: correct%pw
Wrong password: Correct@PW
Wrong password: whatisthepassword!
Account locked

      
    
输入样例 2:
cool@gplt 3
coolman@gplt
coollady@gplt
cool@gplt
try again
#

      
    
输出样例 2:
Wrong password: coolman@gplt
Wrong password: coollady@gplt
Welcome in
读题注意说了的*/
#include<stdio.h>
#include<string.h>
int main()
{
	char zhen[30];
	int n;
	scanf("%s %d", zhen, &n);
	int i = 1;
	int flag = 0;
	getchar();
	for (; i <= n; i++)
	{
		char jie[30];
		fgets(jie, 30, stdin);//正确的说了但是非正确的却没说。。。。
		int j = 0;
		while (jie[j] != '\n')
		{
			j++;
		}
		jie[j] = '\0';
			if (strcmp(jie, "#") == 0)
			{
				flag = 1;
				break;
			}
		if (strcmp(zhen, jie) == 0)
		{
			printf("Welcome in\n");
			flag = 1;
			break;
		}
		else
		{
			printf("Wrong password: %s\n", jie);
		}
	}
	if (flag == 0)
	{
		printf("Account locked");
	}
	return 0;
}

啦啦啦

2读题在第二遍的时候应当多思考临界条件如:最大值,最小值,题目给的特殊数据的倍数等

/*1044 火星数字 (20分)
火星人是以 13 进制计数的:

地球人的 0 被火星人称为 tret。
地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的数字 29 翻译成火星文就是 hel mar;而火星文 elo nov 对应地球数字 115。为了方便交流,请你编写程序实现地球和火星数字之间的互译。

输入格式:
输入第一行给出一个正整数 N(<100),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。

输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。

输入样例:
4
29
5
elo nov
tam

      
    
输出样例:
hel mar
may
115
13
*/
#include <iostream>
#include <string>
using namespace std;
string a[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };//string也可以用数组
string b[13] = { "####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" };
string s;
int len;
int main()
{
	int n;
	scanf("%d", &n);
	getchar();//不论用什么输入函数都要注意是都用这个
	for (int i = 1; i <= n; i++)
	{
		getline(cin, s);
		len = s.length();
		if (s[0] >= '0'&&s[0] <= '9')
		{
			int shu;
			shu = stoi(s);
			if (shu / 13 == 0)
			{
				 cout<< a[shu % 13] << endl;//<<前后尽量有空格
			}
			else
			{
				if (shu % 13 == 0)//同样是思维难题对于13的倍数有特判,一个东西读错了要联想其他的有没有理解错误
				{
					cout << b[shu / 13] << endl;
				}
				else
				{
					cout << b[shu / 13] << " " << a[shu % 13] << endl;
				}
			}
		}
		else
		{
			if (len == 3)
			{
				string s1;
				s1 = s.substr(0, 3);
				for (int i = 0; i <= 12; i++)
				{
					if (a[i] == s1)
					{
						cout << i << endl;
						break;
					}
					if (b[i] == s1)
					{
						cout << i * 13 << endl;//题目中思维难题,(第二遍读应当多想其他的情况)
						break;
					}
				}
			}
			else
			{
				string s1, s2;
				s1 = s.substr(0, 3);
				s2 = s.substr(4, 3);
				int sum = 0;
				for (int i = 1; i <= 12; i++)
				{
					if (b[i] == s1)
					{
						sum += 13*i;
						break;
					}
				}
				for (int i = 0; i <= 12; i++)
				{
					if (a[i] == s2)
					{
						sum +=  i;
						break;
					}
				}
				cout << sum << endl;
			}
		}
	}
	return 0;
}

3东西读错了要想一下有无相关

同上

4用样例检验自己的思路是否想歪了

/*1075 链表元素分类 (25分)
给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K 为 10,则输出应该为 -4→-6→-2→7→0→5→10→18→11。

输入格式:
每个输入包含一个测试用例。每个测试用例第 1 行给出:第 1 个结点的地址;结点总个数,即正整数N (≤10
?5
?? );以及正整数K (≤10
?3
?? )。结点的地址是 5 位非负整数,NULL 地址用 ?1 表示。

接下来有 N 行,每行格式为:

Address Data Next

      
    
其中 Address 是结点地址;Data 是该结点保存的数据,为 [?10
?5
?? ,10
?5
?? ] 区间内的整数;Next 是下一结点的地址。题目保证给出的链表不为空。

输出格式:
对每个测试用例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。

输入样例:
00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218

      
    
输出样例:
33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1

      
    
作者: CHEN, Yue
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
*/
#include <stdio.h>
#include<iostream>
#include <vector>
using namespace std;
struct node
{
	int data;
	int next;
}lianbiao[100000];
int main()
{
	int head, n, k;
	scanf("%d %d %d",&head,&n,&k);
	for (int i = 1; i <= n; i++)//建立链表的方式 
	{
		int dizhi1, dizhi2, dat;
		scanf("%d %d %d", &dizhi1, &dat, &dizhi2);
		lianbiao[dizhi1].data = dat;
		lianbiao[dizhi1].next = dizhi2;
	}
	int l = head;
	vector<int> v[4];//初始化链表的方法
	while (l != -1)//一种访问链表的方式
	{
		if (lianbiao[l].data<0)
		{
			v[1].push_back(l);
		}
		else if (lianbiao[l].data >= 0 && lianbiao[l].data <= k)
		{
			v[2].push_back(l);
		}
		else
		{
			v[3].push_back(l);
		}
		l = lianbiao[l].next;
	}
	int flag = 0;
	for (int i = 1; i <= 3; i++)//将链表所有信息都输出的方法
	{
		for (int j = 0; j<v[i].size(); j++)
		{
			if (flag == 0)
			{
				flag = 1;
				printf("%05d %d", v[i][j], lianbiao[v[i][j]].data);//此处注意补0
			}
			else
			{
				printf(" %05d\n%05d %d", v[i][j], v[i][j], lianbiao[v[i][j]].data);
			}
		}
	}
	printf(" -1");
	return 0;
}

5重复元素的考虑

#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c );

int main()
{
    char str[MAXN], c;
    scanf("%c\n", &c);
	gets(str);
    delchar(str, c);
    printf("%s\n", str);

    return 0;
}

/* 你的代码将被嵌在这里 */
void delchar( char *str, char c )
{
    int l=0;
    while(str[l]!='\0') l++;
    for(int i=0;i<=l;i++)
    {
        if(str[i]==c)
        {
            for(int j=i+1;j<=l;j++) str[j-1]=str[j];
            i--;
        }
    }
}

6关于-0.0的四舍五入

/*
7-4 平面向量加法 (15分)
本题要求编写程序,计算两个二维平面向量的和向量。

输入格式:
输入在一行中按照“x
​1
​​  y
​1
​​  x
​2
​​  y
​2
​​ ”的格式给出两个二维平面向量v
​1
​​ =(x
​1
​​ ,y
​1
​​ )和v
​2
​​ =(x
​2
​​ ,y
​2
​​ )的分量。

输出格式:
在一行中按照(x, y)的格式输出和向量,坐标输出小数点后一位(注意不能输出−0.0)。

输入样例:
3.5 -2.7 -13.9 8.7

      
    
输出样例:
(-10.4, 6.0)

      
    
作者: 乔林
单位: 清华大学
时间限制: 400 ms
内存限制: 64 MB

*/
#include <stdio.h>

int main(void) {
    double x1, y1, x2, y2, result_x, result_y;

    scanf("%lf %lf", &x1, &y1);
    scanf("%lf %lf", &x2, &y2);
    result_x = x1 + x2;
    result_y = y1 + y2;
    if ((result_x > -0.05) && (result_x < 0.0)) {  //防止输出-0.0
        result_x = 0.0;
    }
    if ((result_y > -0.05) && (result_y < 0.0)) {  //防止输出-0.0
        result_y = 0.0;
    }
    printf("(%.1f, %.1f)\n", result_x, result_y);

    return 0;
}

7当自己的理解与样例不同或者怎么改都wa但是自己的代码绝对没错时,按照样例的想法去改变思考,或者是读题去改变思考

/*链接:https://ac.nowcoder.com/acm/contest/5929/A
来源:牛客网
A.Race
小红和小明喜欢赛跑。小明虽然跑得比较快,但是他在任一时刻领先T米或以上,他就会停下来休息S秒。
现在告诉你小明的速度V1(m/s)和小红的速度V2(m/s),T(米)和S(秒)的值,以及赛道的长度L(米),请你预测小红和小明谁会赢。
输入描述:
输入一行,五个正整数V1,V2,T,S,L(L是V1,V2的公倍数)
(1 ≤ V1, V2 ≤ 100,1 ≤ T ≤ 300,1 ≤ S ≤ 10,1 ≤ L ≤ 10000)
输出描述:
输出一行,比赛的结果和获胜者或两人同时到达终点的时间(秒),中间用空格分开
字符串"Ming"、"Hong"和"Tie"分别表示小明获胜、小红获胜和他们同时到达终点
示例1
输入
复制
2 1 1 2 8
输出
复制
Tie 8
示例2
输入
复制
2 1 1 1 8
输出
复制
Ming 7
示例3
输入
复制
2 1 1 5 8
输出
复制
Hong 8*/
#include<stdio.h>
#include<iostream>
using namespace std;

int v1,v2,t,s,l;

int main(){
	scanf("%d%d%d%d%d",&v1,&v2,&t,&s,&l);
	int minute = 0, tmp = 0, dis1 = 0,dis2 = 0;
	while(true){
		minute++;
		if(tmp > 0)	tmp--,  dis2 += v2;
		else dis1 += v1, dis2 += v2;
        if(dis1 - dis2 >= t&&!tmp)	tmp += s;
		if(dis1 == l && dis2 < l){
			printf("Ming %d",minute);
			break;
		}else if(dis2 == l && dis1 < l){
			printf("Hong %d",minute);
			break;
		}else if(dis2 == l && dis1 == l){
			printf("Tie %d",minute);
			break;
		}
	}
	return 0;
}
//C. A Cookie for You
//https://codeforces.ml/contest/1371/problem/C
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		ll a,b,n,m;
		scanf("%lld %lld %lld %lld",&a,&b,&n,&m);
		if(a<=b) 
		{
			a=a-m;
			if(a<0||b<0) printf("No\n");
			else
			{
				ll cha=b-a;
				if(n-cha<=0) printf("Yes\n");
				else
				{
					ll temp=n-cha;
					b=a;
					if(temp%2==1)
					{
						a=a-temp/2;
						b=b-temp/2-1;
						if(a<0||b<0) printf("No\n");
						else printf("Yes\n");
					}
					else
					{
						a=a-temp/2;
						b=b-temp/2;
						if(a<0||b<0) printf("No\n");
						else printf("Yes\n");
					}
				}
			}
		}
		else 
		{
			b=b-m;
			if(a<0||b<0) printf("No\n");
			else
			{
				ll cha=a-b;
				if(n-cha<=0) printf("Yes\n");
				else
				{
					ll temp=n-cha;
					a=b;
					if(temp%2==1)
					{
						a=a-temp/2;
						b=b-temp/2-1;
						if(a<0||b<0) printf("No\n");
						else printf("Yes\n");
					}
					else
					{
						a=a-temp/2;
						b=b-temp/2;
						if(a<0||b<0) printf("No\n");
						else printf("Yes\n");
					}
				}
			} 
		}
		
	}
	return 0;
}

8英文题比如cf的题。先看英文,看不懂了,翻译句子或者单词,实在不行看样例,最后不行就看题目是否给hint,从中总结规律

//https://codeforces.ml/contest/1371/problem/B
//B. Magical Calendar
#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	ll n,r;
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		scanf("%lld %lld",&n,&r);
		if(n<=r) printf("%lld\n",(n-1)*n/2+1);
		else if(n>r) printf("%lld\n",r*(r+1)/2);
	}
	return 0;
} 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值