题目大意: 【Codeforces Round #609 (Div. 2)——C. Long Beautiful Integer(思维)】题目传送门:https://codeforces.com/contest/1269/problem/C
给你一个由n个数字组成的大整数和一个k值,想请你找到大于等于这个数字的最小的由k个数字循环组成的数,并输出它的位数和它的值。比如样例2中:给定的数字为1234,k=2,则满足题意的数值应该为1313(1313是大于等于1234的最小的由k=2个数字1和3循环组成的数)。
题目分析: 这个题的难点在于找最小值。因为数字的范围太大,所以要用字符数组去保存这个整数,咱们不妨先令一个数等于所给数的前k位循环组成的数,位数和原数字相同。还用样例2举例,咱们不妨先令一个数为1212(前k=2位循环组成的位数和原数字一样的数),然后比较它和原数的大小,如果其大于等于原数,直接按要求输出即可。否则的话,让循环的数的最后一个数字+1。这里就要详细说一下了,假如这个数由k个数(编号分别为a0,a1……,ak-1)循环构成,那么当我们需要调整大小来使得循环数大于等于原数的时候,我们只需要调整ak-1就行了,因为这样做对原循环数的改变最小,从而满足题目要求的“最小”。
AC代码
#include
#include
#include
#include
#include
#include
#define PI 3.1415926
typedef long long ll;
using namespace std;
static char s[2000010];
static char s2[2000010];
int main()
{
ll n=0,k=0;
cin>>n>>k;
cin>>s;
for(ll i=0;
i=0)//判断一下循环数和原数哪个大,注意这个函数的用法,谁在前谁在后
{//如果循环数比原数大或者相等的时候就直接按要求输出
cout<=10)//考虑进位的情况
{
s2[t]='0';
t--;
s2[t]++;
}
for(ll i=0;
i
注意事项 1、C++中的string能存的字符数量是有限制的,当字符数量比较大的时候,还是开静态的字符数组或者全局变量字符数组好使,前几次写的超时就是因为这个。
2、注意考虑进位的情况,进位后这个位直接置0就可以。
3、注意strcmp()函数的用法。
4、别忘了最后再更新一下s2。
推荐阅读
- ACM|HDU 5322 Hope (CDQ分治+NTT)
- 牛客算法周周练15——A、B
- FZU - 2107题解
- ACM OJ 2036 多边形面积计算
- #|【牛客】牛客练习赛67-E-牛妹游历城市——位运算优化
- ACM|回文树(自动机)(练习和总结)
- acm|扩展欧几里德算法(附证明)
- ACM|[dsu] codeforces 375D. Tree and Queries
- ACM|codeforces 732-D. Exams (二分)