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;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575273
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期