百度松果菁英班oj赛(22周)

1、MT2192 动物们
(1)题目描述

有某类动物,可以在农场中待n天,每天最多增加一只动物,第i天到来的动物每天要吃的粮食为c[i],现在初始粮草是X,问你在每天动物尽可能多的情况下最多容纳几只动物?

格式

输入格式: 第一行为n和X,第二行为上述c[i]
.
输出格式: 输出一个整数,表示最多可以容纳的动物数量

样例1

输入:
3 4
1 1 1
.
输出: 2

备注:

其中:1≤n ≤100,1≤X ≤10000,c[i]≤300

#include<bits/stdc++.h> 

using namespace std;
int c[1005],dp[100005],n,X;

int main( )
{
  
    cin>>n>>X;
  
    for(int i=1;i<=n;i++){
        cin>>c[i];
        c[i]=c[i]*(n-i+1);
    }
    for(int i=1;i<=n;i++){
        for(int j=X;j>=c[i];j--){
            dp[j]=max(dp[j],dp[j-c[i]]+1);
        }
    }
    cout<<dp[X];

    return 0;
}

2. MT2193 赶deadline
(1)题目描述
小码哥有严重的拖延症,因此他经常赶deadline(即忙于要完成的任务)。有一天小码哥向你求助,因为要做的事太多了,只能舍弃一些相对不重要的。小码哥共有n项任务,每个任务有重要度Ⅰ和需要消耗的时间t。小码哥现在还有时间T,他希望你帮他写一个程序判断应该选择完成哪些任务使得完成的任务重要度之和最大。

格式

输入格式:
第一行两个整数n(0 <n <104),T(T <2000)
第2至n+1行输入第i项任务的重要度Ⅰ和完成需要的时间(0 <I,ti<1000)
.
输出格式:
第一行一个整数,完成任务的重要度之和的最大值
第二行若干个由空格隔开的整数,从小到大输出最优选择的任务的序号(从1开始)

样例1

输入:
4 1000
50 500
75 400
60 300
22 200
.
输出:
157
2 3 4

备注:

当做不完所有任务,但有多个重要度与消耗时间都一样的任务,可以选取其中一部分时,选取编号较小的,例如输入为:
4 1000
50 500
50 500
80 300
22 200
对应输出:
152
134
 

#include<bits/stdc++.h> 
using namespace std;
const int N=1e4+7;
int T,n,w[N],v[N],dp[N],path[N][N],ans[N];
int main()
{
    cin>>n>>T;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=T;j>=w[i];j--){
            if(dp[j-w[i]]+v[i]>dp[j]){
                dp[j]=dp[j-w[i]]+v[i];
                path[i][j]=1;
            }
        }
    }
    cout<<dp[T]<<endl;
    int i=n,j=T,cnt=0;
    while(i>=1&&j){
        if(path[i][j]){
            ans[cnt++]=i;
            j-=w[i];
        }
        i--;
    }
    for(int k=cnt-1;k>=0;k--){
        cout<<ans[k]<<" ";

    }




    return 0;
}

3. MT2203 s的排列
(1)题目描述
给两个字符串s1和s2,判断s2中是否有s1的排列。

如果是返回true ,否则返回false 。

s1的排列指的是s1字符的不同排列。

格式

输入格式:
第一行输入字符串s1
第二行输入字符串s2
.
输出格式: 输出小写的true或false

样例1

输入:
ab
eidbaooo
.
输出: true
 

#include<bits/stdc++.h> 

using namespace std;
string s1,s2;

int main( )
{
    cin>>s1;
    cin>>s2;
    int l1=s1.length(),l2=s2.length();
    if(l1>l2){
        cout<<"false";
        return 0;
    }

    vector<int>a1(26),a2(26);
    for(int i=0;i<l1;i++){
        a1[s1[i]-'a']++;
        a2[s2[i]-'a']++;
    }
    if(a1==a2){
        cout<<"true";
        return 0;
    }
    for(int i=l1;i<l2;i++){
        a2[s2[i]-'a']++;
        a2[s2[i-l1]-'a']--;
        if(a1==a2){
            cout<<"true";
            return 0;
        }        
    }
    cout<<"false";
     

    return 0;
}

4. MT2201 字符串转换
(1)题目描述
对于两个字符串A和B,需要找出最少的变换次数使得A与B一致。

每次变换可以选择如下三种操作的其中一种:
1.删除一个字符,
2.插入一个字符,
3.将一个字符改写为另一个字符。

格式

输入格式: 输入两行,每行一个非空字符串分别对应A和B,字符串仅由小写字母组成。
.
输出格式: 输出一个整数,代表将A变为B所需的最小操作次数。

样例1

输入:
asdfghjkl
ssdghjkl
.
输出: 2

备注:

字符串长度不超过2000。
 

#include<bits/stdc++.h> 

using namespace std;
const int N=2007;
int dp[N][N];
int main( )
{
    string s1,s2;
    cin>>s1>>s2;
    int m=s1.size(),n=s2.size();
    for(int i=0;i<=m;i++){
        dp[i][0]=i;
    }
    for(int i=0;i<=n;i++){
        dp[0][i]=i;
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            dp[i][j]=min(dp[i][j-1],dp[i-1][j])+1;
            dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(s1[i-1]!=s2[j-1]));
        }
    }
    cout<<dp[m][n];
    


    return 0;
}

5. MT2204 字母匹配
(1)题目描述
小码哥有一个字符串s。

现在他想请你判断有多少对(x , gy)满足s[c] =s[y]。其中x可以等于y。

注意(ac, y)和(g, z)是不相同的一对。

格式

输入格式:
第一行一个字符串S,长度小于等于1e5,包含ASClI码从33到125的所有字符。
.
输出格式: 按题目要求输出一行一个整数,表示(x,y)的对数。

样例1:

输入: greaat
.
输出:8
 

#include<iostream>
#include<bits/stdc++.h> 
using namespace std;
int sum;
string s;
map<char,int> mp;
map<char,int>::iterator it;
int main(){
	
	
	cin>>s;
	for(int i=0;i<s.size();i++){
	mp[s[i]]++;
	}

	for(it=mp.begin();it!=mp.end();it++){
	sum+=it->second*it->second; 
	}
	cout<<sum;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code Slacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值