洛谷刷题忘记多少天

题1:
https://www.luogu.com.cn/problem/P1015

题目描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个十进制数 5656,将 5656 加 6565(即把 5656 从右向左读),得到 121121 是一个回文数。

又如:对于十进制数 8787:

STEP1:87+78=16587+78=165
STEP2:165+561=726165+561=726
STEP3:726+627=1353726+627=1353
STEP4:1353+3531=48841353+3531=4884

在这里的一步是指进行了一次 �N 进制的加法,上例最少用了 44 步得到回文数 48844884。

写一个程序,给定一个 �N(2≤�≤102≤N≤10 或 �=16N=16)进制数 �M(100100 位之内),求最少经过几步可以得到回文数。如果在 3030 步以内(包含 3030 步)不可能得到回文数,则输出 Impossible!

输入格式

两行,分别是 �N,�M。

输出格式

如果能在 3030 步以内得到回文数,输出格式形如 STEP=ans,其中 ansans 为最少得到回文数的步数。

否则输出 Impossible!

输入输出样例

输入 #1复制

10
87

输出 #1复制

STEP=4

思路:定义判断回文数的函数,字符转数值的函数,数值转字符的函数,两个数字相加的函数。这里重点关注一下有关字符串的翻转函数(reverse),模拟就OK。

#include
#include
#include 
using namespace std;
#include 
#include 
using namespace std;
bool ishuiwen(const string& s)
{
	int len=s.size();
	for (int i=0;i0)res.push_back(valuetochar(carry));
	reverse(res.begin(),res.end());
	return res;
}
int main()
{
	int n;
	string m;
	cin>>n>>m;
	int cnt=0;
	while (!ishuiwen(m))
	{
		m=add(n,m);
		cnt++;
		if (cnt>30)
		{
			cout<<"Impossible!";
			return 0;
		}
	}
	cout<<"STEP="<

题2:https://www.luogu.com.cn/problem/P1102

题目描述

给出一串正整数数列以及一个正整数 �C,要求计算出所有满足 �−�=�A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个正整数 �,�N,C。

第二行,�N 个正整数,作为要求处理的那串数。

输出格式

一行,表示该串正整数中包含的满足 �−�=�A−B=C 的数对的个数。

输入输出样例

输入 #1复制

4 1
1 1 2 3

输出 #1复制

3

思路:打表就完事,用哈希表的形式完成,这里关注一下map的用法,把每个数出现的个数记录下来,然后找A=B+C.

#include
#include
#include 
using namespace std;
#include 
#include 
using namespace std;
mapa;
long long num[20000005];
int main()
{
	int n,k;
	cin>>n>>k;
	long long  ans=0;
	for (int i=0;i>num[i];
		a[num[i]]++;
	}
	for (int i=0;i

你可能感兴趣的:(算法)