大一寒假集训2020.1.2 //暴力枚举

暴力枚举

直接暴力

二倍的问题

遍历数组找出二倍关系sum++

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;int k,sum;
    cin>>n;
    int a[20];
    while(n--)
    {
        k=0;sum=0;
        int x;
        while(cin>>x)
        {
            if(x==0) break;
            k++;
            a[k]=x;
        }
        for(int i=1;i<k;i++)
        {
            for(int j=i+1;j<=k;j++)
            {
                if(a[i]==2*a[j]||a[i]*2==a[j])
                {
                    sum++;
                }
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

大乐透

毫无技巧可言,六层循环暴力搞定。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int k;
    int a[100];
    while(cin>>k)
    {
        memset(a,0,sizeof(a));
        for(int i=1;i<=k;i++)
        {
            cin>>a[i];
        }
        for(int i1=1; i1<=k-5; i1++)
        {
            for(int i2=i1+1; i2<=k-4; i2++)
            {
                for(int i3=i2+1; i3<=k-3; i3++)
                {
                    for(int i4=i3+1; i4<=k-2; i4++)
                    {
                        for(int i5=i4+1; i5<=k-1; i5++)
                        {
                            for(int i6=i5+1; i6<=k; i6++)
                            {
                                printf("%d %d %d %d %d %d\n",a[i1],a[i2],a[i3],a[i4],a[i5],a[i6]);
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

密码箱

只需要注意一下前缀0就轻松AC

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0; i<1000; i++)
        {
            if(i>n)
            {
                if(i<10)
                    cout<<"00"<<i<<endl;
                else if(i<100&&i>=10)
                {
                    cout<<"0"<<i<<endl;
                }
                else
                {
                    cout<<i<<endl;
                }
            }
        }
    }
    return 0;
}

字符串统计

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        char ch[105];
        int k=0;
        cin>>ch;
        for(int i=0;ch[i];i++)
        {
            if(ch[i]>='0'&&ch[i]<='9')
                k++;
        }
        cout<<k<<endl;
    }
    return 0;
}

抽奖

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int num,o=0;
    int a[100];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    cin>>num;
    for(int i=0;i<n;i++)
    {
        if(num==a[i])
        {
            o=i+1;break;
        }
    }
    cout<<o<<endl;
    return 0;
}

比身高

本蒟蒻的方法是外层循环定点,两个计数器向前向后暴搜++,判断前后相等再++

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;

    int a[1000];
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
    }
    int ans=0;
    int counter1=0,counter2=0;
    for(int i=0; i<n; i++)
    {
        counter1=0;
        counter2=0;
        for(int j=i; j>=0; j--)
        {
            if(a[j]>a[i])
            {
                counter1++;
            }

        }
        for(int k=i; k<n; k++)
        {
            if(a[k]>a[i])
            {
                counter2++;
            }
        }
        if(counter1==counter2)
        {
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

楼层编号

把每一层编号都转成字符型,和高能数字比较,相等减去

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int m,t;
    cin>>m>>t;
    int x;
    char ch[100000];
    char c;
    c=t+'0';
    x=m;
    for(int i=1; i<=m; i++)
    {

        sprintf(ch,"%d",i);
        for(int j=0; ch[j]; j++)
        {
            if(ch[j]==c)
            {
                x--;
                break;
            }
        }
    }
    cout<<x<<endl;
    return 0;
}

有点技巧的暴搜

矩形

被所有其他的矩形覆盖才算一个。
被覆盖就是minx>=,maxx<= 、 y同理。

#include<bits/stdc++.h>
using namespace std;
struct jx
{
    int minx;
    int miny;
    int maxx;
    int maxy;
};

int main()
{
    int n;
    while(cin>>n)
    {
        int sum=0;
        struct jx a[n];
        for(int i=0;i<n;i++)
        {
            cin>>a[i].minx>>a[i].maxx>>a[i].miny>>a[i].maxy;
        }
        for(int i=0;i<n;i++)
        {
            int k=0;
            for(int j=0;j<n;j++)
            {
                if(a[i].minx>=a[j].minx&&a[i].maxx<=a[j].maxx&&a[i].miny>=a[j].miny&&a[i].maxy<=a[j].maxy)
                    k++;
            }
            if(k==n)
            {
                sum++;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

比例简化

借鉴大佬的手笔。

C++求解近似比例(比例的压缩)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    double min,x,y,dl,max,result,t;
    int left,right;
    while(cin>>x>>y>>dl)
    {
        min=left=right=dl;
        result=x/y;
        max=x>y?x:y;
        x=ceil(x/max*dl);
        y=ceil(y/max*dl);
        while(x&&y)
        {
            t=x/y-result;
            if(t>=0&&t<=min)
            {
                min=t;
                left=x;
                right=y;
            }
            if(x/y>=result)
                x--;
            else
                y--;
        }
        cout<<left<<" "<<right<<endl;
    }
    return 0;
}

奶牛碑文

和前几天写的竞赛题差不多
思路就是看O前的C数和O后的W数,用C*W加和。

试试划水

#include<bits/stdc++.h>
using namespace std;
struct oo
{
    int c;
    int w;
};
int main()
{
    int N;
    cin>>N;
    string ch;
    cin>>ch;
    struct oo o[ch.size()];
    memset(o,0,sizeof(o));
    int cn=0,on=0,wn=0;
    for(int i=0; i<ch.size(); i++)
    {
        if(ch[i]=='C')
        {
            cn++;
        }
        if(ch[i]=='O')
        {
            o[on].c=cn;
            on++;
        }
    }
    int t=on-1;
    for(int i=ch.size()-1; i>=0; i--)
    {
        if(ch[i]=='W')
        {
            wn++;
        }
        if(ch[i]=='O')
        {
            o[t].w=wn;
            t--;
        }
        if(t<0) break;
    }
    long long sum=0;
    for(int i=0; i<on; i++)
    {
        sum=sum+o[i].c*o[i].w;
    }
    cout<<sum<<endl;
    return 0;
}

然后蒟蒻借鉴大佬发现了更简单的写法
只要记录C的个数再在遇到O时把C一起加进来,有W时把CO一起加进来,就得到了结果。

#include<bits/stdc++.h>
using namespace std;
int l;
long long c,co,cow;
int main()
{
    int N;
    cin>>N;
    string s;
    cin>>s;
    l=s.size();
    for(int i=0;i<N;i++)
    {
        if(s[i]=='C')c++;
        if(s[i]=='O')co+=c;
        if(s[i]=='W')cow+=co;
    }
    cout<<cow<<endl;
    return 0;
}

丑数

这是一道难倒蒟蒻的题。

暴力打表

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[5842]={};           //直接把打好的表搞进来。
    int n;
    while(cin>>n)
    {
        if(n==0)
        {
            return 0;
        }
        else
        {
            cout<<a[n-1]<<endl;
        }
        
    }
}

密恐勿入!!!这有打好的表
下面推荐大佬的写法。
这里有打表的方法
这位是算法。不打表的那种~~
大一寒假训练三(暴力枚举)

发布了7 篇原创文章 · 获赞 0 · 访问量 1319

猜你喜欢

转载自blog.csdn.net/qq_34212975/article/details/103805883