组队赛第一场(xiao)第七周

版权声明:转载时 别忘了注明出处 https://blog.csdn.net/ZCY19990813/article/details/83045142

A

找第三大

Input
4
1 1 2 3 4 5 6 7 8 9 1000
2 338 304 619 95 343 496 489 116 98 127
3 931 240 986 894 826 640 965 833 136 138
4 940 955 364 188 133 254 501 122 768 408
Output
1 8
2 489
3 931
4 768
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int main()
{
    ll t,n,i,o;
    ll a[101010]={0};
    cin>>t;
    while(t--)
    {
        cin>>o;
        memset(a,0,sizeof(a));
        for(i=0;i<10;i++)
            cin>>a[i];
        sort(a,a+10);
        cout<<o<<" "<<a[7]<<endl;
    }
    return 0;
}

B

题意:分割找最小的和

思路:答案肯定是在最小值和和中间,直接遍历最小值和和符合条件就输出

Input
3
1 6
2 5 1 3 3 7
2 6
1 2 3 4 5 6
3 20
1 1 2 1 1 2 1 1 2 1
1 2 1 1 2 1 1 2 1 1
Ouput
1 7
2 21
3 2
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int main()
{
    ll t,n,i,o,j;
    ll a[101010]={0};
    cin>>t;
    while(t--)
    {
        cin>>o>>n;
        ll sum=0,minn=101010;
        for(i=0;i<n;i++)
        {
            cin>>a[i];
            sum+=a[i];
            minn=(minn,a[i]);
        }
        ll s=0,num=0;
        for(i=minn;i<=sum;i++)
        {
            num=0,s=0;
            for(j=0;j<n;j++)
            {
                s+=a[j];
                if(s==i)
                {
                    num++;
                    s=0;
                }
                if(s>i)
                {
                    s=0;
                    break;
                }

            }
            if(num*i==sum)
                break;
        }
        cout<<o<<" ";
        if(i<sum)
            cout<<i<<endl;
        else
            cout<<sum<<endl;


    }
    return 0;
}

D

题意:找前奇数位的中位数 注意格式

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
typedef long long ll;
using namespace std;
int main()
{
    ll t,i,j,n,cc=0,flag,x;
    ll a[101001],b[101001],c[101001];
    cin>>t;
    while(t--)
    {
        cin>>x>>n;
        flag=(n+1)/2;
        for(i=0; i<n; i++)
            cin>>a[i];
        ll l=0,cc=0;
        ll y=1;
        while(flag--)
        {

            l=0;
            memset(b,0,sizeof(b));
            for(i=0; i<y; i++)
                b[l++]=a[i];
            sort(b,b+l);
            c[cc++]=b[l/2];
            y+=2;
        }
        cout<<x<<" "<<(n+1)/2<<endl;
        for(i=0;i<cc;i++)
        {
            if((i+1)%10==0)
                cout<<" "<<c[i]<<endl;
            else
            if(i%10==0)
                cout<<c[i];
            else
                cout<<" "<<c[i];
        }
        if(cc%10!=0)
            cout<<endl;
    }
}

E

题意:找比现在数大且最小的

思路:从后面遍历,只要遇到后面比这个数大的就停止,交换后后面的按顺序输出

Input
3
1 123
2 279134399742
3 987
OUT
1 132
2 279134423799
3 BIGGEST
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int main()
{
    ll t,n,i,o,j,len,k,kk;
    char s[101010];
    cin>>t;
    while(t--)
    {
        memset(s,0,sizeof(s));
        cin>>o>>s;
        len=strlen(s);
        for(i=len-2;i>=0;i--)
        {
            ll minn=10;
            for(j=i+1;j<len;j++)
            {
                if(s[j]>s[i])
                {
                    if(s[j]-'0'<minn)
                    {k=j;
                    minn=s[k]-'0';}
                }
            }
            if(minn!=10)
            {
                char tt;
                tt=s[k];
                s[k]=s[i];
                s[i]=tt;
                kk=i;
                break;
            }
        }
        if(i<0)
            cout<<o<<" "<<"BIGGEST"<<endl;
        else
        {
            cout<<o<<" ";
            for(i=0;i<=kk;i++)
                cout<<s[i];
            char ss[10000];
            memset(ss,0,sizeof(ss));
            ll l=0;
            for(i=kk+1;i<len;i++)
                ss[l++]=s[i];
            sort(ss,ss+l);
            for(i=0;i<l;i++)
                cout<<ss[i];
            cout<<endl;
        }
    }
    return 0;
}

C 扔鸡蛋问题

输入
4
1 2 10
2 2 100
3 2 300
4 25 900
输出
1 4
2 14
3 24
4 10

题目大意:
有一些鸡蛋,我们现在想知道这些鸡蛋的硬度。然后现在有一座很高很高的大楼里,我们现在要在这座大楼上测试鸡蛋的硬度。每个鸡蛋的硬度相同,鸡蛋的硬度定义为:如果鸡蛋从第 m 层上掉下来没有破裂,而从第 m+1 层上掉下来就破裂了,那么这个鸡蛋的硬度就是 m 。某个鸡蛋如果在实验中破裂了就永远的损失了。我们现在有 n 个鸡蛋。那么在最坏情况下我们最少需要做多少次实验呢?

推荐一篇博客https://blog.csdn.net/joylnwang/article/details/6769160   为之叹服

AC代码

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
ll dp[1000][1000];//i是鸡蛋数,j是楼数
int main()
{
    ll n,m,i,a,o,T,j,k;
    cin>>T;
    while(T--)
    {
        cin>>o>>n>>m;//n鸡蛋数 m楼层数
        memset(dp,0,sizeof(dp));
        for(i=1;i<=m;i++)
            dp[1][i]=i;
        for(i=1;i<=n;i++)
            dp[i][1]=1;
        for(i=2;i<=n;i++)//鸡蛋数
        {
            for(j=2;j<=m;j++)//楼层数
            {
                dp[i][j]=inf;
                for(k=1;k<=j;k++)
                    dp[i][j]=min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k])+1);//jia1是因为加上上一步分的 最后max()里面的可以举个例子理解一下 总共10层楼 取k是5,则是求dp[1][4]和dp[2][5]的最大值(最坏的情况)
            }
        }
        cout<<o<<" "<

F

题目链接  http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2099#problem/F

题意: 给你一个长度为 n 的 0/1 串,然后根据公式求答案为 k 的串的个数。

分析:对于长度为 i 的串,假设它的权值为 j,则长度为 i+1 的串的权值只可能为 j 或 j+1,且仅与末位元素和新添加元素有关。

令 dp[i][j][k] 表示长度为 i 的串、权值为 j 、末位为 k (0 or 1) 的方案种数。

状态转移方程为 dp[i][j][0] = dp[i-1][j][0] + dp[i-1][j][1] , dp[i][j][1] = dp[i-1][j][0] + dp[i-1][j-1][1]。

把长度为 n 的串 转化为长度为 n-1 的末尾为 0 或 1 的两种子问题。

input
10 
1 5 2
2 20 8
3 30 17
4 40 24
5 50 37
6 60 52
7 70 59
8 80 73
9 90 84
10 100 90
ouput
1 6
2 63426
3 1861225
4 168212501
5 44874764
6 160916
7 22937308
8 99167
9 15476
10 23076518
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
ll dp[111][111][2];
int main()
{
    ll n,m,i,a,o,T,j,k;
    dp[1][0][1]=1;
    dp[1][0][0]=1;
    for(i=2;i<=110;i++)
    {
        dp[i][0][1]=dp[i-1][0][0];
        dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1];
        for(j=1;j<=110;j++)
        {
            dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
            dp[i][j][1]=dp[i-1][j-1][1]+dp[i-1][j][0];
        }
    }
    cin>>T;
    while(T--)
    {
        cin>>o>>n>>m;
        cout<<o<<" "<<dp[n][m][0]+dp[n][m][1]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ZCY19990813/article/details/83045142