最近做題小結

LteShuai發表於2024-07-24

前言

來到產業園第一次寫題 最近做的題目很雜 涉及很多個平臺 vj loj cf 牛客 lg 然後等會一個個找吧 按照時間順序寫吧
一直拖著 沒寫題解 最近狀態一般 想回家了

第一個題

這個題 我沒寫出來 因為我不會處理第二個平臺的問題 誰能想到只需要記好第一個就行了呢
利用一個while迴圈記錄 很好的trick

for(int i=1;i<=n;i++)
	{
		while(x[r]-x[i]<=k&&r<=n)r++;
		f[i]=r-i;
	}
   
	maxn=max(maxn,f[i]+hsum[f[i]+i]);
//這種雙指標不僅僅配合sum
//我不知道怎麼處理兩條 而且也沒想到 使用字尾最大值去記錄答案 
//至於你說的這個while迴圈 我是想了的 可是我就是沒想到怎麼處理第二條
//哪知道第二條只需要記錄字尾即可 反正一定不相交
//可惜可惜

第二個題

7.15我在看牛客的dp 順手寫的

第三個

聽雨巨講的 這個題
做了蠻久的 對於田忌來說 他只有兩個選擇 要麼拿最好的馬
要麼拿最差的馬 中間的馬是沒用的
對於
田雞 2 3
齊王 1 3
並不是說最大打不贏就一定上早少的 不然上面那個就是平的 所以我們其實可以觀察到
這個狀態方程式只跟首尾有關
dp[l][r]=max(dp[l+1][r],dp[l][r-1]分別表示選l和r的情況
所以這題實際上需要對田雞從大到小排序 對齊王從小到大排序 這樣才滿足我們的想法
我測試了齊王從小到大也行 他順序沒用影響 這個排序因人而異
然後就可以做出來了

點選檢視程式碼
//#include <bits/stdc++.h>
//#define int long long
//#define endl '\n'
//#define debug cout<<endl<<"----------"<<endl;
//using namespace std;
//const int range = 4e3 + 10;
//int n;
//int a[range];
//int tian[range];
//int qi[range];
//int dp[range][range];
//int calc(int x,int y)
//{
//	if(tian[x]>qi[y])return 200;
//	else if(tian[x]==qi[y])return 0;
//	else return -200;
//}
//void solve() {
//	cin >> n;
//	for (int i = 1; i <= n; i++)cin >> tian[i];
//	for (int i = 1; i <= n; i++)cin >> qi[i];
//	sort(tian + 1, tian + 1 + n);
//	sort(qi + 1, qi + 1 + n);
//	//92 83 71
//	//85 87 74	
//	for (int len = 1; len <= n; len++) {
//		for (int l = 1; l + len - 1 <= n; l++) {
//               int r=l+len-1;
//	dp[l][r]=max(dp[l+1][r]+calc(l,len),dp[l][r-1]+calc(r,len));		
////			debug
////			cout<<dp[l][r]<<" "<<l<<" "<<r<<endl;
////			cout<<calc(l,len)<<" "<<calc(r,len)<<endl;
////牛魔 洛谷竟然能過			
//		}
//		//r-l+1=n-k+1
//	//k=n-len+1
//	}
//	cout<<dp[1][n];
//}
//signed main() {
//	ios::sync_with_stdio();
//	cin.tie(0);
//	cout.tie(0);
//	solve();
//	return 0;
//
//
//}
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define debug cout<<endl<<"----------"<<endl;
using namespace std;
const int range = 4e3 + 10;
int n;
int a[range];
int tian[range];
int qi[range];
int dp[range][range];
int calc(int x,int y)
{
	if(tian[x]>qi[y])return 200;
	else if(tian[x]==qi[y])return 0;
	else return -200;
}
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++)cin >> tian[i];
	for (int i = 1; i <= n; i++)cin >> qi[i];
	for(int i=1;i<=3100;i++)
	{
		for(int j=1;j<=3090;j++)dp[i][j]=-1e9;
	}
	sort(tian + 1, tian + 1 + n, greater<int>());
	sort(qi + 1, qi + 1 + n);
	for(int i=1;i<=n;i++)
	{
		dp[i][i]=calc(i,1);
	}
	// 10 3 3 2 2 1 
	// 10 9 9 8 7 6  

	for (int len = 2; len <= n; len++) {
		for (int l = 1; l + len - 1 <= n; l++) {
			int r=l+len-1;	
		//	debug
		//	cout<<dp[l][r]<<endl;
dp[l][r]=max(dp[l][r],max(dp[l+1][r]+calc(l,len),dp[l][r-1]+calc(r,len)));	
		//	cout<<dp[l][r]<<" "<<l<<" "<<r<<endl;
		//	cout<<calc(l,len)<<" "<<calc(r,len)<<endl;
		//	cout<<len<<" ";
		}
		//r-l+1=n-k+1
		//k=n-len+1
	}
	
	//cout<<endl;
	cout<<dp[1][n];
}
signed main() {
	ios::sync_with_stdio();
	cin.tie(0);
	cout.tie(0);
	solve();
	return 0;
	
}

相關文章