A. Make a Square
n的範圍不超過2*10的9次方,那麼最大的i是44722,從大到小開始,如果在n中找到i的平方,那麼說明存在這個數的平方break即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
int v[1008611];
int prefix[1008611];
int32_t main( )
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s1;
cin>>s1;
int aa=0;
for(int i=44722;i>=1;i--){
int pd=1;
string s= to_string(i*i);
if(s.length()<=s1.length()) {
int j = 0;
for (auto c: s1) {
if (c == s[j]) {
j++;
}
}
if (j == s.length()) {
cout << s1.length() - s.length();
aa = 1;
break;
}
}
}
if(aa==0)cout<<-1;
return 0;
}
A. Load Balancing
我們要讓整個陣列的最大最小值差不超過1,我們可以先找平均值,然後把多餘平均值的數逐一分配給前面的數
#include <bits/stdc++.h>
#define int long long
using namespace std;
int v[1008611];
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
int a;
cin>>a;
v[i]=a;
sum+=a;
}
int s=sum;
s/=n;
//注意如果不能整除說明最後分配出來的會有多出來的情況
if(sum%n)s++;
int p=0;
int q=0;
int ans=0;
int pd=0;
for (int i = 1; i <=n; ++i) {
if(v[i]<s-1)p+=s-1-v[i];
if(v[i]>s)q+=v[i]-s;
}
// cout<<q<<p<<'\n';
cout<<max(q,p);
}
C. Match Points
有點貪心加雙指標的意思
我們要想使得點數最多,那麼n/2就是最多的點對數,我們先對陣列進行排列,讓一個指標l從n開始,一個r從n/2開始
如果符合條件那麼l--,整個過程r一直減r--;
#include <bits/stdc++.h>
#define int long long
using namespace std;
int v[1008611];
int prefix[1008611];
int32_t main( )
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
cin>>n>>m;
for (int i = 1; i <=n ; ++i) {
cin>>v[i];
}
sort(v+1,v+1+n);
int ans=0;
int l=n,r=n/2;
while(r>=1){
if(abs(v[l]-v[r])>=m) {
ans++;
l--;
}
r--;
}
cout<<ans;
return 0;
}