牛客xb月赛47 ABCD

A-牛牛的装球游戏

求装入最大数量球的剩余体积。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const double PI=3.141592653589;
int main()
{
    //圆柱体的体积为PI*r^2*h
    //球体的体积为4/3*PI*r^3
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        int r,h;
        cin>>r>>h;
        int num=h/(2*r);
        printf("%.3lf\n",PI*r*r*h-num*r*r*r*PI*4/3);
    }
    return 0;
}

B-牛牛的数字集合

牛牛想使得最后分成的m个集合的价值和最小,定义每个集合的价值为:集合中数的乘积的m次方。

直接放在一个集合就好。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
LL a[2002000];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int n;
    cin>>n;
    LL res=1;
    for(LL i=1;i<=n;i++)
    {
        cin>>a[i];
        res=(res*a[i])%mod;
    }
    cout<<res%mod<<endl;
    return 0;
}

C-小猫排队

题目大意:啾啾前面有n只小猫,每次小猫能跳向离它最近的比它可爱度大的位置,(先跳跃,再计入时间),问排到它的最少时间是多少?

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<queue>
#include<vector>
using namespace std;
int a[200200];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int x;
    cin>>x;
    vector<int> v;
    for(int i=n;i>=1;i--)
        if(a[i]>x) v.push_back(i);
    //for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
    if(v.size()==0) cout<<n+1<<endl;
    else{
    int idx=0,flag=0;
    for(int i=0;i<v.size();i++)
    {
        if(v[i]>=i+1)
            idx=i,flag=(v[i]-i);
        else break;
    }
    cout<<idx+flag<<endl;
    }
    return 0;
}

D-造桥

n个字符串能拼接的最大字符串长度(string 1尾和string 2头相同可相连)。

第一反应就是最长上升子序列,老老实实套模板真的出来了

结果tle了,只能过88.46%的样例

tle版本 

//和acwing1117单词接龙好像
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;
string s[200200];
int dp[200200];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>s[i];
        //for(int i=1;i<=n;i++) cout<<s[i][s[i].size()-1];
        int maxn=0;
        for(int i=1;i<=n;i++)
        {
            int len=s[i].size();
            dp[i]=len;
            //cout<<dp[i]<<endl;
            for(int j=1;j<i;j++)
                if(s[j][s[j].size()-1]==s[i][0]) dp[i]=max(dp[j]+len,dp[i]);
            if(dp[i]>maxn) maxn=dp[i];
        }
        cout<<maxn<<endl;
    }
    return 0;
}

每次两个for for行不通的话,就该想到用一个for了,每次都不够的思维,嗐,我还是太菜了

佬们的ac方法:

(debug de了半天,没初始化!)

是字符串尾巴已经包含的长度更长呢?还是加上这个字符串更长呢?

从这两个方案中选取最大的那个赋值给字符串尾巴,表示在之后的对比中他已经把这个字符串取舍好了。

//和acwing1117单词接龙好像
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cstdio>
using namespace std;
int dp[200200];
char s[200200];
int main()
{
    //cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=0;i<=30;i++) dp[i]=0;
        int maxn=0;
        for(int i=1;i<=n;i++)
        {
            string s;
            cin>>s;
            int len=s.size();
            int x=s[0]-'a';
            int y=s[len-1]-'a';
            //cout<<x<<" "<<y<<endl;
            dp[y]=max(dp[y],dp[x]+len);
            //cout<<dp[y]<<endl;
            maxn=max(maxn,dp[y]);
        }
        cout<<maxn<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vijurria

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

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

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

打赏作者

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

抵扣说明:

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

余额充值