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 longusing 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 longusing 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;}