# EA 的练习赛 2 题解

EA 的练习赛 2 题解

未完待续……

一些简单的题目就口胡了……

A. ix35 的等差数列

枚举哪一个位置不动,然后枚举公差。用map记录。

时间复杂度为\(O(n\log ^2 n)\)。

/*
{
######################
#       Author       #
#        Gary        #
#        2021        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){
//    int x=0;
//    char ch=getchar();
//    while(ch<'0'||ch>'9'){
//        ch=getchar();
//    }
//    while(ch>='0'&&ch<='9'){
//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
int n,w,a[300000+233];
map<mp,int> m;
int main(){
	scanf("%d%d",&n,&w);
	rb(i,1,n) scanf("%d",&a[i]);
	int rest=1;
	rb(i,2,n){
		rb(j,0,(a[i]-1)/(i-1)){
			m[II(j,a[i]-(i-1)*j)]++;
		}
	}
	for(auto ite=m.begin();ite!=m.end();++ite){
		if(1ll*(ite->FIR).SEC+1ll*(n-1)*(ite->FIR).FIR<=w)
			check_max(rest,ite->SEC+((ite->FIR).SEC==a[1]));
	} 
	cout<<n-rest<<endl; 
	return 0;
}

D. 送给好友的礼物

算法1:

首先可以存储下面没有草莓的有草莓的节点。

可以发现只需要走到每一个这个点就ok了。

然后把他们以dfs序排序。

然后dp就好了,时间复杂度为\(O(N^3)\)。

算法2:

树形dp。

\(dp_{i,j}\)表示两个人遍历以\(i\)为根的子树,其中一个人花费了\(j\)的时间另一个人花费了的最少时间。

然后背包就好了!

时间复杂度为\(O(n^3)\)的,可以过了。

这题是口胡没有代码……

上一篇:STL 容器操作


下一篇:链表找头节点并判断链表环状,以及节点不在链表内等异常情况