【训练3】2024.4.7小红书

这期的题目整体比较简单,相比之前的都简单

第一题-塔子哥送粉丝周边

简单排序

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int N = 2e5+100;

struct str{
	int num;
	int s;
}st[N];
bool cmp(str a,str b){
	if(a.s!=b.s){
		return a.s>b.s;
	}else{
		return a.num<b.num;
	}
}
signed main(){
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		st[i].num=i;
		st[i].s=x+2*y;
	}
	sort(st+1,st+1+n,cmp);
	vector<int> p;
	for(int i=1;i<=k;i++){
		p.push_back(st[i].num);
	}
	sort(p.begin(),p.end());
	for(auto pi:p) cout<<pi<<" "; 
	return 0;
}

第二题-塔子哥的优秀题解

优先队列维护下,写代码必须专注,脑袋别混乱,刚开始的时候输入写错了

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int N = 2e5+100;

struct str{
	int a,b;
}st[N];
bool cmp(str aa,str bb){
	return aa.b>bb.b;
}
priority_queue<int,vector<int> ,greater<int>> q;	
int n,k;
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>st[i].a;
	}
	for(int i=1;i<=n;i++){
		cin>>st[i].b;
	}
	
//	for(int i=1;i<=n;i++) cout<<st[i].a<<" "<<st[i].b<<endl;
	
	sort(st+1,st+1+n,cmp);	
	
//	for(int i=1;i<=n;i++) cout<<st[i].a<<" "<<st[i].b<<endl;
	
	int sum=0,ans=0;
	for(int i=1;i<=k;i++){
		sum+=st[i].a;
		q.push(st[i].a);
	}
	ans=sum*st[k].b;
//	cout<<ans<<" "<<sum<<" "<<st[k].b<<endl;
	for(int i=k+1;i<=n;i++){
		ans=max(ans,(st[i].a+sum-q.top())*st[i].b);
		if(q.top()<st[i].a){
			sum-=q.top();
			q.pop();
			sum+=st[i].a;
			q.push(st[i].a);
		}
	}
	cout<<ans;
	return 0;
}

第三题-塔子哥的题解点赞方案

简单DP一下

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int N = 2e3+100;

const int mod = 1e9+7;

int dp[N][N],sum[N];
int n,m;
char str[N];
/* 
dp[i,j]=dp[i-1,j]

*/
signed main(){
	memset(dp,0,sizeof(dp));
	cin>>n>>m>>(str+1);
	// for(int i=1;i<=n;i++) cout<<str[i]<<" ";cout<<endl;
	// dp[i,j]:表示当前已经处理到第i位,且以j为结尾的方案数 
	for(int i=1;i<=m;i++){
		dp[1][i]=1;
		sum[i]=sum[i-1]+1;
	} 
	for(int i=2;i<=n;i++){
		if(str[i-1]=='='){
			for(int j=1;j<=m;j++) dp[i][j]=dp[i-1][j];
		}else if(str[i-1]=='<'){
			for(int j=1;j<=m;j++) dp[i][j]=sum[j-1];
		}else if(str[i-1]=='>'){
			for(int j=1;j<=m;j++) dp[i][j]=(sum[m]-sum[j]+mod)%mod;
		}
		for(int j=1;j<=m;j++) sum[j]=(sum[j-1]+dp[i][j])%mod;
	}
	int ans=0;
	for(int i=1;i<=m;i++) ans=(ans+dp[n][i])%mod;
	cout<<ans;
	return 0;
}
posted @ 2024-04-29 15:07  pengge666  阅读(7)  评论(0编辑  收藏  举报