7.25考总

T5:

用两个数组存到达第i位时崇拜的神牛。

if(abs(sum[i]-sum[j-1]==i-j+1)),说明i到j都相同

if(abs(sum[i]-sum[j-1]<=m)),说明i和j之间的不同人数差不超过m 在符合以上两个条件下,

转移方程:dp[i]=min(dp[i],dp[j-1]+1)

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=2505;
int n,m,a[maxn],jia[maxn],yi[maxn],dp[maxn][maxn];
signed main(){
	memset(dp,0x3f,sizeof(dp));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		jia[i]=jia[i-1];
		yi[i]=yi[i-1];
		if(a[i]==1){
			jia[i]++;
		}
		else{
			yi[i]++;
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			int haha1=jia[j]-jia[i-1];
			int haha2=yi[j]-yi[i-1];
			if(abs(haha1-haha2)==j-i+1||abs(haha1-haha2)<=m){
				dp[i][j]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			dp[1][i]=min(dp[1][i],dp[1][j]+dp[j+1][i]);
		}
	}
	cout<<dp[1][n];
	return 0;
}

T6:

观察样例:

175438——>13

显然删去了7548

第一次,从下标0开始遍历,找到了7>5,所以删去7

第二次遍历,找到了5>4,所以删去5

第三次遍历,找到了4>3,所以删去4

第二次遍历,找到了8>0(后面的一个虚拟节点),所以删去8

所以很明显是个贪心,如果一个数位上的数比他后面的数大就选,否则不选。

#include<bits/stdc++.h>
using namespace std;
string s;
int n,a[251],l,k;
int main(){
  	cin>>s;
	cin>>n;
	l=s.size();
  	for(int i=0;i<l;i++)a[i]=s[i]-'0';
  	for(int i=1;i<=n;i++)
    	for(int j=0;j<l;j++)
      		if(a[j]>a[j+1]){
          		for(int k=j;k<l;k++)a[k]=a[k+1];//将后面的全部往前移一位
          		l--; break;//长度--
      		}
  	int i=0; 
  	while(a[i]==0&&k<l-1) {k++;i++;}//找到起点
  	for(int i=k;i<l;i++) cout<<a[i];//输出
  	return 0;
}
posted @   KK_SpongeBob  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示