2020年1月2日 OJ习题【暴力枚举】

二倍的问题

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,t,count;
    while(cin>>n)
    {
        for(int k=0;k<n;k++)
        {
           count=0;
           t=0;
        int x[20];
        for(int i=0;i<20;i++)
            x[i]=0;
        for(int i=0;i<20;i++)
        {
            cin>>x[i];
            if(x[i]==0)
                break;
            t++;
        }
        for(int i=0;i<t;i++)
        {
            for(int j=0;j<t;j++)
            {
                if(x[j]==2*x[i])
                    count++;
            }
        }
        cout<<count<<endl;
        }
    }
    //cout << "Hello world!" << endl;
    return 0;
}

大乐透

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0)
            break;
        int x[n+1];
        for(int i=0;i<n;i++)
        {
            cin>>x[i];

        }
        for(int i1=0;i1<n-5;i1++)
        {
            for(int i2=i1+1;i2<n-4;i2++)
            {
                for(int i3=i2+1;i3<n-3;i3++)
                {
                    for(int i4=i3+1;i4<n-2;i4++)
                    {
                        for(int i5=i4+1;i5<n-1;i5++)
                        {
                            for(int i6=i5+1;i6<n;i6++)
                            {
                                cout<<x[i1]<<" "<<x[i2]<<" "<<x[i3]<<" "<<x[i4]<<" "<<x[i5]<<" "<<x[i6]<<endl;
                            }
                        }
                    }
                }
            }
        }
    }
    //cout << "Hello world!" << endl;
    return 0;
}

密码箱

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    while(cin>>n)
    {
            for(int i=n+1;i<1000;i++)
            {
                if(i<10)
                {
                    printf("00%d\n",i);
                }
                else if(i<100)
                {
                    printf("0%d\n",i);
                }
                else
                    printf("%d\n",i);
            }
    }
    //cout << "Hello world!" << endl;
    return 0;
}

字符串统计

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,k,count;
    while(cin>>n)
    {
    	getchar();
        for(int i=0;i<n;i++)
        {
            count=0;
            char str[100];
            gets(str);
            k=strlen(str);
            for(int j=0;j<k;j++)
            {
                if(str[j]>=48&&str[j]<=57)
                    count++;
            }
            printf("%d\n",count);
        }
    }
    return 0;
}

丑数

思路:先把1给x【1】,然后分别走4条路,每条路分别是从以x【1】开始的丑数*2,*3,*5,*7;4条路每走一步,都比较出4个中的最小值,并以这个最小值为下一个丑数,同时得出这个最小值的那一条路(不一定是一条),它下一步的x【】的下标应该向后移动一位,才可以去找接下来可能是最小值的丑数!!!

#include <bits/stdc++.h>
#define min4(a,b,c,d) min(min(a,b),min(c,d))//定义一个方法去找四个数中的最小数// 
using namespace std;

int main()
{
	int n,t2,t3,t5,t7,x[5850];
	x[1]=1;
	t2=t3=t5=t7=1;
	for(int i=2;i<=5842;i++)
	{
		x[i]=min4(x[t2]*2,x[t3]*3,x[t5]*5,x[t7]*7);
		if(x[i]%2==0) t2++;//如果选择的最小值是乘以了2,则*2的丑数下标应该向后移动一位// 
		if(x[i]%3==0) t3++;
		if(x[i]%5==0) t5++;
		if(x[i]%7==0) t7++;
	}
	//如果选择的最小数既能被2整除也能被3整除,说明该最小值可以由x[t2]*2和x[t3]*3同时得到,则它们对应的下标都应该移动//
	//如6,它既可以是x[3]*2,也可以是x[2]*3,因此*2,*3的丑数下标都应该移动,才能去找接下来最小的丑数// 
	while(cin>>n)
	{
		if(n==0)
		break;
		else
		{
			printf("%d\n",x[n]);
		}
	}
	return 0; 
}

矩形

#include <bits/stdc++.h>
using namespace std;

struct jx
{
	int xmin,xmax,ymin,ymax;
}ch[1000];
int main()
{
	int n,count;
	while(cin>>n)
	{
		for(int i=1;i<=n;i++)
		{
			cin>>ch[i].xmin>>ch[i].xmax>>ch[i].ymin>>ch[i].ymax;
		}
		count=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(j!=i)//必须去掉本身,因为一定能被本身覆盖// 
				{
			    	if(ch[i].xmin<=ch[j].xmin&&ch[i].xmax>=ch[j].xmax&&ch[i].ymin<=ch[j].ymin&&ch[i].ymax>=ch[j].ymax)
					{
						count++;
						break;
					}//只需判断每一个矩形能否被其他矩形中的任意一个覆盖,如果能就退出当下循环//	
				}
			}
		}
		cout<<count<<endl;
	}
	return 0; 
}

抽奖

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,num,flag=0;
    cin>>n;
    int x[101];
    for(int i=1;i<=n;i++)
    cin>>x[i];
    cin>>num;
    for(int i=1;i<=n;i++)
    {
    	if(x[i]==num)
    	{
    		flag=1;
    		printf("%d\n",i);
    		break;
		}
	}
	if(flag==0)
	printf("0\n");
    return 0;
}

比身高

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,count=0,count1,count2;//count1,2分别记录每个人前面与后面比他高的人数,count记录满足条件的人数// 
	cin>>n;
	int x[1001];
	for(int i=1;i<=n;i++)
	cin>>x[i];
	for(int i=1;i<=n;i++)
	{
		count1=count2=0;
		for(int j=1;j<i;j++)
		{
			if(x[j]>x[i])
			count1++;
		}
		for(int k=n;k>i;k--)
		{
			if(x[k]>x[i])
			count2++;
		}
		if(count1==count2)
		count++;
	}
	printf("%d\n",count);
    return 0;
}

楼层编号

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int m,t,count=0,r;
	int a,b;
	cin>>m>>t;
	for(int i=1;i<=m;i++)
	{
		a=i;
		do
		{
			b=a%10;
			if(b==t)
			{
				count++;
				break;
			}
			a=a/10;
		}while(a!=0);
	}
	r=m-count;
	cout<<r<<endl;
	return 0; 
}

比例简化

#include <bits/stdc++.h>
using namespace std;

int huzhi(int a,int b)//判断是否为互质的函数// 
{
	int i,flag=0;
	for(i=2;i<=a;i++)
	{
		if(a%i==0&&b%i==0)
		{
			flag=1;
			break;
		}
	}
		if(flag==0)
		return 1;
		else
		return 0;
	
}
int main()
{
	int a,b,l;
	int m,n;//要输出的值,即提干的A‘,B’// 
	double cha,min; 
	cin>>a>>b>>l;
	min=10000;
	for(int i=l;i>0;i--)
	{
		for(int j=1;j<=l;j++)
		{
			if(huzhi(i,j)==1)
			{
				cha=1.0*i/j-1.0*a/b;
				if(cha>=0&&cha<min)
				{
					min=cha;
					m=i;
					n=j;
				}
			}
		}
	}
	printf("%d %d\n",m,n);
	return 0; 
}

奶牛碑文

思路:找出每一个O前面有多少个C,后面又多少个W,两个数相乘,既是由该O组成的COW的个数,所有个数相加即的出结果

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	long long count=0,c[100001],w[100001],t1,t2;//t1,t2是临时记录C,W,个数的变量,C,W数组分别记录每个字母前面的C,或后面的W的个数// 
	cin>>n;
	char x[100001];
	for(int i=1;i<=n;i++)
	cin>>x[i];
	t1=t2=count=0;
	for(int i=1;i<=n;i++)
	{
		if(x[i]=='C') t1++;
		c[i]=t1;
	}
	for(int i=n;i>0;i--)
	{
		if(x[i]=='W')  t2++;
		w[i]=t2;
	}
	for(int i=1;i<=n;i++)
	{
		if(x[i]=='O')
		count+=c[i]*w[i];
	}
	printf("%lld\n",count);
	return 0; 
}

另一种方法

先定义三个变量C,CO,COW,从头到尾遍历一遍,遇见C就C++,遇见O把C+CO赋值给CO,遇见W,把CO+COW赋值给COW,走一遍后,COW的值就是结果!!!

思路:变量C一直在记录符号C出现的次数,当出现一次O就相当于一次断点,此时CO记录了由该符号O和其前面的C所组成的CO的个数,当再遇到O的时候就累加,遇到W时同理,且记录的就是COW的个数了!!!

#include <bits/stdc++.h>
using namespace std;

int main()
{
	char x[100010]; 
	int n;
	long long C,CO,COW;
	C=CO=COW=0;
	cin>>n;
	getchar();
	for(int i=1;i<=n;i++)
	cin>>x[i]; 
	for(int i=1;i<=n;i++)
	{
		if(x[i]=='C') C++;
		if(x[i]=='O') CO+=C;
		if(x[i]=='W') COW+=CO;
	}
	cout<<COW<<endl;
	return 0; 
}

发布了10 篇原创文章 · 获赞 1 · 访问量 145

猜你喜欢

转载自blog.csdn.net/shiroi2333/article/details/103807416