20240609比賽總結

wangsiqi2010916發表於2024-06-09

因為很多奇奇怪怪的問題,成功被小學生爆殺

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} \]