因為很多奇奇怪怪的問題,成功被小學生爆殺
T1 小奇挖礦2
https://gxyzoj.com/d/hzoj/p/767
最簡單的方法,列舉m,然後暴力求解,顯然會T
可以發現,當飛船停在有礦的點時,才會有貢獻,所以可以列舉n
經過列舉,可以得到當兩個點的距離大於17時,就一定可以轉移成功,所以可以開一個陣列,記錄到每個點之前的所有點的最大值,滿足條件則直接轉移
對於其他部分,則暴力判斷是否能轉移即可
程式碼:
#include<cstdio>
#include<algorithm>
using namespace std;
const int inf=1e9+7;
int n,m,a[100005],b[100005],f[100005],ans,mx[100005];
struct node{
int a,b;
}x[100005];
bool cmp(node x,node y)
{
return x.b<y.b;
}
int lst[100005];
bool fl[105];
void solve2()
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i].a,&x[i].b);
}
fl[0]=fl[4]=fl[7]=1;
for(int i=8;i<=100;i++)
{
fl[i]=fl[i-4]|fl[i-7];
}
sort(x+1,x+n+1,cmp);
lst[1]=1;
for(int i=1;i<=n;i++)
{
int j=i-1;
for(;j>=0;j--)
{
int p=x[i].b-x[j].b;
if(p>18) break;
if(p>=18||fl[p])
{
f[i]=max(f[i],f[j]+x[i].a);
lst[i]=j;
}
}
if(x[i].b<18&&!fl[x[i].b]) continue;
f[i]=max(mx[j]+x[i].a,f[i]);
mx[i]=max(mx[i-1],f[i]);
ans=max(ans,f[i]);
}
printf("%d",ans);
}
int main()
{
scanf("%d%d",&n,&m);
solve2();
return 0;
}
T2 小奇的矩陣(matrix)
可以直接把平均數替換為\(\dfrac{\sum A_i}{n+m-1}\),得到:
\[\begin{aligned}
V &= (n+m-1)\sum_{i-1}^{n+m-1} (A_i+\dfrac{\sum A_i}{n+m-1})^2\\ &= (n+m-1)\sum_{i-1}^{n+m-1} (A_i^2-2\times A_i\times \dfrac{\sum A_i}{n+m-1}+(\dfrac{\sum A_i}{n+m-1})^2)\\ &= (n+m-1)\sum_{i-1}^{n+m-1} A_i^2-2(\sum A_i)^2+(\sum A_i)^2 \\ &=(n+m-1)\sum A_i^2-(\sum A_i)^2
\end{aligned}
\]