做题时间:2022.8.10
Hay Bales(haybales)
题意
有 n n n 堆数量不相同的干草,现在可以移动任意干草堆的任意堆干草到任意干草堆,问最少移动多少堆干草使得每个干草堆数量相同。
思路
先求出每个干草堆应当的数量,然后看当前数量与其的差,得到的答案再除以二即可(因为一个干草堆少了意味着另一个干草堆多了)。
复杂度
O
(
n
)
O(n)
O(n)。
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[10005],sum,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
sum/=n;
for(int i=1;i<=n;i++)
{
ans+=abs(sum-a[i]);
}
cout<<ans/2;
return 0;
}
Cow Photography(photo)
题意
给定五个序列,每个序列都至多有一个数字放到最前面,求原序列。
思路
记
b
i
,
j
b_{i,j}
bi,j 为第
i
i
i 个序列下
j
j
j 所处的位置。在排列时一个数至少会有三次处于正确的相对位置,故以此作为排序依据
复杂度
O
(
n
log
n
)
O(n \log n)
O(nlogn)。
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[20005],b[15][20005];
bool cmp(int x,int y)
{
int s=0;
for(int i=1;i<=5;i++)
{
if(b[i][x]<b[i][y]) s++;
}
return s>2;
}
int main()
{
cin>>n;
for(int i=1;i<=5;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[j];
b[i][a[j]]=j;
}
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<endl;
}
return 0;
}
Escaping the Farm(escape)
题意
给定 n n n 个数 w i w_i wi,问最多可以选多少个数,使得其进行竖式计算时不会出现进位。
思路
dfs 爆搜一遍每种情况,然后模拟高精度一般去判断进位情况即可。
复杂度
O
(
2
n
log
10
w
i
)
O(2^n\log_{10}w_i)
O(2nlog10wi)
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[25],b[25],ans;
void dfs(int dep,int s)
{
if(dep>n)
{
int p=0;
//cerr<<s-1<<':';
for(int i=1;i<s;i++)
{
//cerr<<b[i]<<' ';
int t=p,k=b[i];
p+=b[i];
while(t||k)
{
if(t%10+k%10>9) return;
t/=10;
k/=10;
}
}
//cerr<<endl;
ans=max(ans,s-1);
return;
}
dfs(dep+1,s);
b[s]=a[dep];
dfs(dep+1,s+1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dfs(1,1);
cout<<ans;
return 0;
}