A 完全平方数的尾巴
我们把一个能被表示成某个整数的平方的数称为完全平方数。
例如4=2∗2,16=4∗4,所以4,16是完全平方数。
现在输入一个整数为x(0≤x≤999),请聪明的你判断它是不是由某个完全平方数对1000取模得到的呢。
暴力做法
用for循环i从0到1000.
class Solution { public: /** * * @param x int整型 * @return bool布尔型 */ bool solve(int x) { for(int i=0;i<=1000;i++) { if(i*i%1000==x) { return true; } } return false; } };
B 牛牛的字符串
牛牛有一个长度为N的由小写字母组成的字符串S,还有一个整数K。在每一步中,牛牛都可以选择一个位置 i 并在 i 和 i + K 处交换字符(i + K < N)并且S_{i} < S_{i+k},即交换之后,新形成的字符串应字典序大于旧字符串。牛牛想尽可能交换尽量多的步数。他想知道最多可以交换多少步呢。
归并排序,记录逆序对数
#include<bits/stdc++.h> using namespace std; int a[100005],c[100005],ans=0; class Solution { public: void mergesort(int l,int r) { if(l<r) { int mid=(l+r)>>1,i,j,tmp=l; mergesort(l,mid); mergesort(mid+1,r); for(i=l,j=mid+1; i<=mid&&j<=r;) { if(a[i]>a[j]) { c[tmp++]=a[j++]; ans+=mid-i+1; } else { c[tmp++]=a[i++]; } } while(i<=mid) { c[tmp++]=a[i++]; } while(j<=r) { c[tmp++]=a[j++]; } for(i=l; i<=r; i++) { a[i]=c[i]; } } } int turn(string s, int k) { reverse(s.begin(),s.end()); int len=s.length(); for(int i=1; i<=k; i++) { int tmp=0; for(int j=i-1; j<len; j+=k) { a[++tmp]=(int)(s[j]-'a'); } mergesort(1,tmp); } return ans; } };