牛客程式設計巔峰賽S1第5場 - 黃金&鑽石&王者
阿新 • • 發佈:2020-07-24
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; } };