切数字乘法(枚举)

思路

直接暴力枚举,枚举每一个分界点,再记录最大值。

代码

#include <bits/stdc++.h>
#define int long long 
using namespace std;

string s;

int solve(int cnt){
	int a=0,b=0;
	for(int i=0;i<=cnt;i++){
		a=a*10+s[i]-'0';
	}
	for(int i=cnt+1;i<s.size();i++){
		b=b*10+s[i]-'0';
	}
	return a*b;
}

signed main(){
	freopen("num.in","r",stdin);
	freopen("num.out","w",stdout);
	cin >>s;
	int max_n=-2e9;
	for(int i=0;i<s.size();i++){
		max_n=max(max_n,solve(i));
	}
	cout <<max_n;
	return 0;
}

合并班级(模拟)

思路没想到的原因

没有考虑如果成绩相同时的规则,导致只拿了3030分。

思路

首先,把两个班的成绩排名排好序,记录当前的排名。然后在按照成绩合并两个班的名次。

最后,再来按照题目要求计算所有的落差值。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int tt=2e5+10;

struct node{
	int x,y,num;
}f[tt];
int a[tt],b[tt];

bool cmp_1(int a,int b){
	return a>b;
}

bool cmp_2(node a,node b){
	return a.num>b.num;
}

signed main(){
	freopen("class.in","r",stdin);
	freopen("class.out","w",stdout);
	int n,m;
	cin >>n>>m;
	for(int i=1;i<=n;i++){
		cin >>a[i];
	}
	for(int i=1;i<=m;i++){
		cin >>b[i];
	}
	sort(a+1,a+1+n,cmp_1);
	sort(b+1,b+1+m,cmp_1);
	for(int i=1;i<=n;i++){
		if(i!=1&&a[i]==a[i-1]){
			f[i].x=f[i-1].x;
		}else{
			f[i].x=i;
		}
		f[i].num=a[i];
	}
	for(int i=1;i<=m;i++){
		if(i!=1&&b[i]==b[i-1]){
			f[i+n].x=f[i+n-1].x;
		}else{
			f[i+n].x=i;
		}
		f[i+n].num=b[i];
	}
	sort(f+1,f+1+n+m,cmp_2);
	int ans=0;
	for(int i=1;i<=n+m;i++){
		if(i!=1&&f[i].num==f[i-1].num){
			f[i].y=f[i-1].y;
		}else{
			f[i].y=i;
		}
		ans+=(f[i].x-f[i].y)*(f[i].x-f[i].y);
	}
	cout <<ans;
	return 0;
}

彩彩玩跳棋(DP)

思路没想到的原因

用了暴搜,但还是TLETLE了。

思路

状态表示:dp[i]dp[i]表示从第ii个位置跳跃最左能跳到的位置。

状态计算:dp[i]=dp[a[i]d]+d2dp[i]=dp[a[i]-d]+d*2

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int tt=2e5+10;
int a[tt];
int dp[tt];

signed main(){
	freopen("chess.in","r",stdin);
	freopen("chess.out","w",stdout);
	int n,m;
	cin >>n>>m;
	for(int i=1;i<=m;i++){
		int x;
		cin >>x;
		a[x]++;
	}
	for(int i=1;i<=n;i++){
		if(a[i]==0) a[i]=a[i-1];
		else a[i]=i;
	}
	int max_n=0;
	for(int i=1;i<=n;i++){
		if(a[i]==1) continue;
		int d=i-a[i];
		int res=a[i]-d;
		if(res<=0) continue;
		if(res<=a[a[i]-1]) continue;
		dp[i]=dp[res]+d*2;
		max_n=max(max_n,dp[i]);
	}
	cout <<max_n;
	return 0;
}

彩彩玩扫雷(二维差分)

待更新……

谢谢