2020.1.2大一寒假集训三(暴力枚举)

Problem:A    二倍的问题(NEFU OJ 8)

思想:桶排序计数器。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int t;
    while(cin >> t)
    {
        while(t--)
        {
            int num[20],i=1,j,flag[300]={0};//flag是计数器
            int ans=0;
            while(cin >> num[i]&&num[i])
                i++;
            for(j=1;j<i;j++)
                flag[2*num[j]]=1;//标记num的2倍
            for(j=1;j<i;j++)
            {
                if(flag[num[j]]==1)//检验是否被标记
                    ans++;
            }
            cout << ans << endl;
        }
    }
    return 0;
}

Problem:B    大乐透(NEFU OJ 573)

思想:可以暴力,可以二进制枚举。

解法一,暴力法:

#include <bits/stdc++.h>

using namespace std;
int main()
{
    int n;
    int a[100];
    while(cin >> n)
    {
        int i1,i2,i3,i4,i5,i6;
        if(n==0)
            break;
        int i;
        for(i=1;i<=n;i++)
        {
            cin >> a[i];
        }
        sort(a+1,a+1+n);
        int t=0;
        for(i1=1;i1<=n-5;i1++)
        {
            for(i2=i1+1;i2<=n;i2++)
            {
                for(i3=i2+1;i3<=n;i3++)
                {
                    for(i4=i3+1;i4<=n;i4++)
                    {
                        for(i5=i4+1;i5<=n;i5++)
                        {
                            for(i6=i5+1;i6<=n;i6++)
                            {
                                printf("%d %d %d %d %d %d",a[i1],a[i2],a[i3],a[i4],a[i5],a[i6]);
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

解法二,二进制枚举:

//虽然能一一枚举出来,但是他输出的顺序和答案不一样,所以会WA
#include <bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    int n;
    while(cin >> n&&n)
    {
        int num[55],i,j;
        int ans[55];
        for(i=0;i<n;i++)
            cin >> num[i];
        sort(num,num+n);
        for(i=0;i<(1<<n);i++)
        {
            int tmp=0,k=0;
            for(j=0;j<n;j++)
            {
                if(i&(1<<j))
                {
                    tmp++;
                    ans[++k]=num[j];
                }
            }
            if(tmp==6)
            {
                for(int z=1;z<=6;z++)
                {
                    cout << ans[z];
                    if(z==6)
                        cout << endl;
                    else
                        cout << " ";
                }
            }
        }
    }
    return 0;
}

Problem:C    密码箱(NEFU OJ 572)

思想:暴力

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    while(cin >> n)
    {
        for(int i=n+1;i<=999;i++)
            printf("%03d\n",i);

    }
    return 0;
}

Problem:D    字符串统计(NEFU OJ 193)

思想:暴力

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    while(cin >> n)
    {
        int i,x;
        char a[105];
        getchar();        //消去回车
        while(n--)
        {
            int ans=0;
            memset(a,0,sizeof(a));
            gets(a);
            x=strlen(a);
            for(i=0;i<x;i++)
                if(a[i]>='0'&&a[i]<='9')
                    ans++;
            cout << ans << endl;

        }

    }
    return 0;
}

Problem:E    丑数(NEFU OJ 574)

很难!!

打表尽管跑的很慢QAQ

#include <bits/stdc++.h>

using namespace std;
int num[5880];
int tmp=1;
bool judje(int i)//判断i是不是2,3,5,7组成;
{
    while(i%2==0)
    {
        i/=2;
    }
    while(i%3==0)
    {
        i/=3;
    }
    while(i%5==0)
    {
        i/=5;
    }
    while(i%7==0)
    {
        i/=7;
    }
    if(i==1)
        return 1;
    else
        return 0;
}

int main()
{
    freopen("list.txt", "w", stdout);    //打表的关键,去自己文件夹里找
    num[1]=1;
    for(int i=2;;i++)
    {
        if(judje(i))
            num[++tmp]=i;
        if(tmp==5870)
            break;
    }
    for(int i=1;i<=5870;i++)
        printf("%d,",num[i]);
    return 0;
}

Problem:F    矩形(NEFU OJ 575)

思想:一个一个进行比较(冒泡),注意边界问题。

#include <bits/stdc++.h>

using namespace std;

struct jz{
    double minx,maxx;
    double miny,maxy;
    int flag=0;
}a[10005];
int main()
{
    int n;
    while(cin >> n)
    {
        memset(a,0,sizeof(a));
        int i,ans=0;
        for(i=1;i<=n;i++)
            scanf("%lf%lf%lf%lf",&a[i].minx,&a[i].maxx,&a[i].miny,&a[i].maxy);
        for(i=1;i<n;i++)
            for(int j=i+1;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)
                {
                    a[i].flag=1;        //关键:::注意做标记,避免重复判断
                    a[j].flag=1;
                }
            }
        for(i=1;i<=n;i++)
            if(a[i].flag==1)
                ans++;
        cout << ans << endl;
    }
    return 0;
}

Problem:G    抽奖(NEFU OJ 1639)

思想:暴力。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,a[105],flag=0;
    cin >> n;
    for(int i=1;i<=n;i++)
        cin >> a[i];
    int t;
    cin >> t;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==t)
        {
            flag=i;
            break;
        }
    }
    cout << flag << endl;
    return 0;
}

Problem:H    比身高(NEFU OJ 1640)

思想:暴力,注意边界。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    int n,a[1005];
    while(cin >> n)
    {
        int i,ans=0;
        for(i=1; i<=n; i++)
            cin >> a[i];
        for(i=1;i<=n;i++)
        {
            int ans1=0,ans2=0;
            for(int j=1;j<i;j++)    //与他之前的进行比较
            {
                if(a[i]<a[j])
                    ans1++;
            }
            for(int j=i+1;j<=n;j++)    //与他之后的进行比较
            {
                if(a[i]<a[j])
                    ans2++;
            }
            if(ans1==ans2)
                ans++;
        }
        cout << ans << endl;
    }
    return 0;
}

Problem:I    楼层编号(NEFU OJ 1642)

思想:暴力,一位一位进行判断,注意什么时候跳出。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int m,t;
    while(cin >> m >> t)
    {
        int sum=0;
        int tmp=m,x;
        for(int i=1; i<=m; i++)
        {
            tmp=i;
            while(tmp)                //每一位进行判断
            {    
                x=tmp%10;
                if(x==t)
                    {
                        sum++;
                        break;        //及时跳出,否则sum会多加
                    }
                tmp=tmp/10;
            }
        }
        cout << m-sum << endl;

    }
    return 0;
}

Problem:J    比例简化(NEFU OJ 1643)

思想:暴力,类似于擂台赛。

#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b)        //判断是否互为素数,gcd模板。
{
    return b?gcd(b,a%b):a;
}
int main()
{
    int a,b,i,j,l,ans1,ans2;
    double s1,s2,d,min;
    while(cin>>a>>b>>l)
    {
        min=10000;
        for(i=l;i>=1;i--)            //循环
        {
            for(j=l;j>=1;j--)        
            {
                if(gcd(i,j)==1)      //判断条件1:A′ 和 B′ 互质,内置gcd函数跑的会慢,若用//__gcd(i,j);                             
                {
                    s1=1.0*i/j;      //暂存即A′和B′
                    s2=1.0*a/b;      //原来d的A与B
                    if(s1>=s2)       //判断条件2:A′/B′≥ A/B
                    {
                        d=s1-s2;
                        if(d<min)    //判断条件3:A′/B′-A/B数值尽可能小
                        {
                            min=d;
                            ans1=i;
                            ans2=j;
                        }
                    }
                }
            }
        }
        printf("%d %d\n",ans1,ans2);
    }
    return 0;
}

Problem:K    奶牛碑文(NEFU OJ 1644)

思想:暴力不可取,递推,简单状态转移,类似于动态规划。

设三个变量,分别计算C,CO,COW的个数;遇到C就++;遇到O就加上C的个数;遇到W就加上CO的个数;

#include <bits/stdc++.h>

using namespace std;
int main()
{
    int n;
    while(cin >> n)
    {
        getchar();
        char ch1;            //巧妙避开字符串的长度问题,若是字符串,一定要注意范围;
        long long b[5]={0};
        for(int i=0;i<n;i++)
        {
            cin >> ch1;
            if(ch1=='C'||ch1=='c')
                b[1]++;
            if(ch1=='O'||ch1=='o')
                b[2]+=b[1];
            if(ch1=='W'||ch1=='w')
                b[3]+=b[2];
        }
        cout << b[3] << endl;
    }
    return 0;
}
发布了11 篇原创文章 · 获赞 18 · 访问量 1943

猜你喜欢

转载自blog.csdn.net/acm_durante/article/details/103801869