Fork me on Gitee

第5届 蓝桥杯决赛

标题:国王的遗产

X国是个小国。国王K有6个儿子。在临终前,K国王立下遗嘱:国王的一批牛作为遗产要分给他的6个儿子。
其中,大儿子分1/4,二儿子1/5,三儿子1/6,....
直到小儿子分1/9。
牛是活的,不能把一头牛切开分。

最后还剩下11头牛,分给管家。

请计算国王这批遗产中一共有多少头牛。

这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)
#include <bits/stdc++.h>

/**
@author:d g w
*/
using namespace std;
typedef long long LL ;

const LL maxn=1000000;

int main(){

    for(int x=1;x<5000;x++){
        int temp=x/4+x/5+x/6+x/7+x/8+x/9;
        if(temp+11==x&&x%4==0&&x%5==0&&x%6==0&&x%7==0&&x%8==0&&x%9==0){
            cout<<x<< " ";
        }

    }
    return 0;
}


标题:神奇6位数

有一个6位的正整数,它有个很神奇的性质:

分别用2 3 4 5 6去乘它,得到的仍然是6位数,并且乘积中所包含的数字与这个6位数完全一样!只不过是它们的顺序重新排列了而已。

请计算出这个6位数。

这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)

  • 看到很多都是枚举解法,我是使用的排列

枚举解法


#include<stdio.h>
#include<string.h>
int flag[10];
int val[10];
int main()
{
	int check=0 ,i=100000,count=0;
	memset(flag,0,sizeof(flag));	
	while(i<=200000) //因为200000*6超过了6位数,粗略的减少一点数据
	{
		i++;			
		int temp=i;		
		memset(flag,0,sizeof(flag));
		while(temp)
		{
			flag[temp%10]++;
			temp/=10;	
		}		
		int bb=true;
		for(int j=2;j<=6;j++)
		{
			int temp2=i*j;
			memcpy(val,flag,sizeof(flag));
			while(temp2)
			{
				val[temp2%10]--;
				temp2/=10;
			}				
			for(int k=0;k<10;k++) 
			{
				if(val[k]!=0)
					bb=false;	
			}
		}
		if(bb==true)
			printf("%d\n",i);		
	}	
	return 0;
}

我的排列解法


#include <bits/stdc++.h>

/**
@author:d g w
*/
using namespace std;
typedef long long LL ;

const LL maxn=1000000;

int b[7];
int c[7];
void getnum(int y){
    int i=0;
    do{
      b[i++]=y%10;
      y/=10;
    }while(y!=0);
    //cout<<b[0]<<b[1]<<b[2]<<b[3]<<b[4]<<b[5]<<endl;
}

int main(){

    int a[]={1,2,3,4,5,6,7,8,9};
    do{
        int x=a[0]*100000+a[1]*10000+a[2]*1000+a[3]*100+a[4]*10+a[5];
        //2 3 4 5 6
        int ans=0;
        for(int i=2;i<=6;i++){
            int y=x*i;
            int flag=true;
            getnum(y);
            c[0]=a[0]; c[1]=a[1]; c[2]=a[2]; c[3]=a[3]; c[4]=a[4]; c[5]=a[5];
            sort(b,b+6);sort(c,c+6);
            for(int i=0;i<6;i++){
                if(b[i]!=c[i]){
                    flag=false;
                }
            }
            if(flag){
                ans++;
            }
        }
        if(ans==5){
                cout<<x;
        }
    }while(next_permutation(a,a+9));
    return 0;
}



重复模式

标题:重复模式

作为 drd 的好朋友,技术男 atm 在 drd 生日时送给他一个超长字符串 S 。atm 要 drd 在其中找出一个最长的字符串 T ,使得 T 在 S 中至少出现了两次,而他想说的秘密就藏在 T 中。

由于字符串实在是太长了,drd 总是找不到合适的 T 。于是 drd 请你帮他找到这个 T 的长度。

【输入格式】
一行。一个字符串,即题目中说的S 。

【输出格式】
一行。一个整数,表示最长的 T 的长度。

【样例输入】
ababa

【样例输出】
3

「数据范围」
对于 30% 的数据,S长度 <= 100
对于 60% 的数据,S长度 <= 8000
对于 100% 的数据,S长度 <= 500000

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include <bits/stdc++.h>

/**
@author:d g w
*/
using namespace std;
typedef long long LL ;

const LL maxn=1000000;

char s[1000];

bool finds(string s,string c){
    int j = 0;
    for(int i=0;i<s.length();i++){
        if(j == 0 && (s.length()-i)<c.length())
            return false;
        if(s[i]== c[j]){
            j++;
            if(j == c.length())
                return true;
        }else{
            j = 0;
        }
    }
    return false;

}
int main(){
    string s;
    cin>>s;
    int max=0;
    for(int i=0;i<s.length()-1;i++){
        for(int j=1;j<=s.length()-i;j++){
            if(finds(s.substr(i+1),s.substr(i,i+j))){
                max=j>max?j:max;
            }
        }
    }
    cout<<max;
    return 0;
}




套娃

标题:套娃

作为 drd 送的生日礼物,atm 最近得到了一个俄罗斯娃娃。他对这个俄罗斯娃娃的构造很感兴趣。

俄罗斯娃娃是一层一层套起来的。假设:一个大小为 x 的俄罗斯娃娃里面可能会放任意多个大小小于 x 的俄罗斯娃娃(而市场上的套娃一般大娃里只能放一个小娃)。

drd 告诉 atm ,这个俄罗斯娃娃是由 n 个小娃娃组成的,它们的大小各不相同。    我们把这些小娃娃的大小从小到大依次记为 1 到 n 。

如果 atm 想观赏大小为 k 的小娃娃,他会先看这个小娃娃是否已经在桌子上了。    如果已经在桌子上,那么他就可以观赏了。否则他就打开桌子上某一个俄罗斯娃娃,将它套住的所有的小娃娃拿出来,摆在桌子上。
一开始桌子上只有 drd 送的大小为 n 的娃娃。注意,他只会将其中所有小娃娃拿出来,如果小娃娃里面还套着另外的小娃娃,他是不会将这些更里层的这些小娃娃拿出来的。
而且 atm 天生具有最优化的强迫症。他会最小化他所需要打开的娃娃的数目。

atm 是一个怪人。有时候他只想知道观看大小为 x 的娃娃时需要打开多少个娃娃(但并不去打开);有时候听 drd 说某个娃娃特别漂亮,于是他会打开看。现在请你输出他每次需要打开多少个娃娃。

【输入格式】
第一行两个数 n m ,表示娃娃的数目以及 atm 想看的娃娃的数目。
接下来 n - 1 行,每行两个数 u v,表示大小为 u 的娃娃里面套着一个大小为 v 的娃娃。保证 u > v 。
接下来 m 行,每行形如:
P x :表示 atm 一定要看到大小为 x 的娃娃;
Q x :表示 atm 只想知道为了看大小为 x 的娃娃,他需要打开多少个娃娃,但实际上并不打开他们。

【输出格式】
输出 m 行。对应输入中P操作或Q操作需要打开(或假想打开)多少个俄罗斯娃娃。

【样例输入】
5 5
5 3
5 4
3 2
3 1
Q 1
Q 4
P 2
Q 1
Q 4

【样例输出】
2
1
2
0
0

【数据范围】
对于 30% 的数据:n, m <= 1000
对于 100% 的数据:n, m <= 100000

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include <bits/stdc++.h>

/**
@author:d g w
*/
using namespace std;
typedef long long LL ;

const LL maxn=1000000;

int b[7];
int c[7];
void getnum(int y){
    int i=0;
    do{
      b[i++]=y%10;
      y/=10;
    }while(y!=0);
    //cout<<b[0]<<b[1]<<b[2]<<b[3]<<b[4]<<b[5]<<endl;
}
bool ccc(int x){
    int y=sqrt(x);
    if((y*y)==x){
        return true;
    }
    return false;
}

bool check(int n){
    int a[9]={0};
    int i=0;
    do{
      a[i++]=n%10;
      n/=10;
    }while(n);
    int s1=0,s2=0,j;
    for(i--;i>0;i--){
        s1+=a[i];
        if(!ccc(s1)){
            s1*=10;
            continue;
        }
        for(j=i-1;j>=0;j--){
            s2+=a[j];
            if(j==0){
                continue;
            }
            s2*=10;
        }
        if(s2==0)continue;
        if(ccc(s2))return true;
        s2=0;
        s1*=10;
    }
    return false;
}
    int mat[1000]={0};
    int book[1000]={0};
int main(){

    int n,m;
    cin>>n>>m;
    int big=0;
    for(int i=0;i<n-1;i++){
        int a,b;
        cin>>a>>b;
        mat[b]=a;
        big=max(big,a);
        big=max(big,b);
    }
    mat[big]=big+1;
    book[big+1]=1;
    for(int j=0;j<m;j++){
        char x;int y;
        cin>>x>>y;
        int time=0;
        if(x=='Q'){
           int x=mat[y];
           while(book[x]!=1){
                x=mat[x];
                time++;
           }
          cout<<time<<endl;
        }else if(x=='P'){
            int x=mat[y];
            while(book[x]!=1){
                book[x]=1;
                x=mat[x];
                time++;
           }
           cout<<time<<endl;
        }
    }
    return 0;
}




posted @ 2018-05-06 21:58  ---dgw博客  阅读(364)  评论(0)    收藏  举报