当前位置:   article > 正文

2014年蓝桥杯C/C++ C组决赛题目汇总_2014年蓝桥杯国赛c

2014年蓝桥杯国赛c


1.国王的遗产

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

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

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

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

2.神奇6位数(暴力+全排列)

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

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

  请计算出这个6位数。

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

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<stack>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<cmath>
  11. const int maxn=1e5+5;
  12. typedef long long ll;
  13. using namespace std;
  14. int a[15]={0,1,2,3,4,5,6,7,8,9};
  15. int f(){
  16. int sum=0;
  17. sum+=a[0]*100000;
  18. sum+=a[1]*10000;
  19. sum+=a[2]*1000;
  20. sum+=a[3]*100;
  21. sum+=a[4]*10;
  22. sum+=a[5];
  23. return sum;
  24. }
  25. int vis[15];
  26. int vis2[15];
  27. int vis3[15];
  28. int vis4[15];
  29. int vis5[15];
  30. int vis6[15];
  31. int main(){
  32. do{
  33. memset(vis,0,sizeof(vis));
  34. memset(vis2,0,sizeof(vis2));
  35. memset(vis3,0,sizeof(vis3));
  36. memset(vis4,0,sizeof(vis4));
  37. memset(vis5,0,sizeof(vis5));
  38. memset(vis6,0,sizeof(vis6));
  39. int flag=1;
  40. int n1=f();
  41. while(n1){
  42. vis[n1%10]++;
  43. n1=n1/10;
  44. }
  45. sort(vis,vis+6);
  46. int n2=2*f();
  47. while(n2){
  48. vis2[n2%10]++;
  49. n2=n2/10;
  50. }
  51. sort(vis2,vis2+6);
  52. int n3=3*f();
  53. while(n3){
  54. vis3[n3%10]++;
  55. n3=n3/10;
  56. }
  57. sort(vis3,vis3+6);
  58. int n4=4*f();
  59. while(n4){
  60. vis4[n4%10]++;
  61. n4=n4/10;
  62. }
  63. sort(vis4,vis4+6);
  64. int n5=5*f();
  65. while(n5){
  66. vis5[n5%10]++;
  67. n5=n5/10;
  68. }
  69. sort(vis5,vis5+6);
  70. int n6=6*f();
  71. while(n6){
  72. vis6[n6%10]++;
  73. n6=n6/10;
  74. }
  75. sort(vis6,vis6+6);
  76. for(int i=0;i<6;i++){
  77. if(vis[i]!=vis2[i]){
  78. flag=0;
  79. break;
  80. }
  81. }
  82. for(int i=0;i<6;i++){
  83. if(vis[i]!=vis3[i]){
  84. flag=0;
  85. break;
  86. }
  87. }
  88. for(int i=0;i<6;i++){
  89. if(vis[i]!=vis4[i]){
  90. flag=0;
  91. break;
  92. }
  93. }
  94. for(int i=0;i<6;i++){
  95. if(vis[i]!=vis5[i]){
  96. flag=0;
  97. break;
  98. }
  99. }
  100. for(int i=0;i<6;i++){
  101. if(vis[i]!=vis6[i]){
  102. flag=0;
  103. break;
  104. }
  105. }
  106. if(flag&&a[0]!=0){
  107. cout<<f()<<endl;
  108. break;
  109. }
  110. }while(next_permutation(a,a+10));
  111. return 0;
  112. }


3.日期差

    历史上,不同的人类聚居地可能有不同的历法,因而记录下来的资料中日期的换算就很麻烦。幸好今天我们统一使用公元纪年法。当然,这种历法对求两个日期差多少天也不是十分简便,但毕竟是可以忍受的。

    下面的程序计算了两个日期的差值,两个日期都使用公元纪年法。

    请分析程序逻辑,并推断划线部分缺失的代码。

int to_day(int y, int m, int d)
{
    int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int day = 0;
    int i;
    for(i=1; i<y; i++){
        day += (i%4==0 && i%100!=0 || i%400==0)? 366 : 365;
    }
    
    if(y%4==0 && y%100!=0 || y%400==0) mon[2]++;
    
    for(i=1; i<m; i++){
       day+=mon[i];  //填空位置
    }
    
    return day + d;
}

int diff(int y1, int m1, int d1, int y2, int m2, int d2)
{
    int a = to_day(y1, m1, d1);
    int b = to_day(y2, m2, d2);
    return b-a;
}

int main()
{
    int n = diff(1864,12,31,1865,1,1);
    printf("%d\n", n);
    return 0;
}

注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)。


4.拼接平方数

    小明发现49很有趣,首先,它是个平方数。它可以拆分为4和9,拆分出来的部分也是平方数。169也有这个性质,我们权且称它们为:拼接平方数。

    100可拆分1 00,这有点勉强,我们规定,0 00 000 等都不算平方数。

    小明想:还有哪些数字是这样的呢?

    你的任务出现了:找到某个区间的所有拼接平方数。

【输入格式】
两个正整数  a b (a<b<10^6)

【输出格式】
若干行,每行一个正整数。表示所有的区间[a,b]中的拼接平方数

例如:
输入:
1 200

程序应该输出:
49
169

再例如:
输入:
169 10000

程序应该输出:
169
361
1225
1444
1681
3249
4225
4900
9025

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


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

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

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

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


5.套娃

    作为 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 <xxx>, 不能通过工程设置而省略常用头文件。

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


6.重复模式

    作为 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 <xxx>, 不能通过工程设置而省略常用头文件。

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

replace4.排列序数(全排列)

   如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
  abcd  0
  abdc  1
  acbd  2
  acdb  3
  adbc  4
  adcb  5
  bacd  6
  badc  7
  bcad  8
  bcda  9
  bdac  10
  bdca  11
  cabd  12
  cadb  13
  cbad  14
  cbda  15
  cdab  16
  cdba  17
  ...

    现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?

【输入格式】
一行,一个串。

【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。

例如:
输入:
bdca

程序应该输出:
11

再例如:
输入:
cedab

程序应该输出:
70


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


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

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

数据不大,可以直接全排列

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<stack>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<cmath>
  11. const int maxn=1e5+5;
  12. typedef long long ll;
  13. using namespace std;
  14. string pre[4000000];
  15. int main(){
  16. string s;
  17. cin>>s;
  18. int len=s.length() ;
  19. char a[len+1];
  20. for(int i=0;i<len;i++){
  21. a[i]=s[i];
  22. }
  23. sort(a,a+len);
  24. int l=0;
  25. do{
  26. for(int i=0;i<len;i++){
  27. pre[l]+=a[i];
  28. }
  29. l++;
  30. }while(next_permutation(a,a+len));
  31. for(int i=0;i<l;i++){
  32. if(pre[i]==s){
  33. printf("%d\n",i);
  34. break;
  35. }
  36. }
  37. return 0;
  38. }

replace5.幂一矩阵

    天才少年的邻居 atm 最近学习了线性代数相关的理论,他对“矩阵”这个概念特别感兴趣。矩阵中有个概念叫做幂零矩阵。对于一个方阵 M ,如果存在一个正整数 k 满足 M^k = 0 ,那么 M 就是一个幂零矩阵。(^ 表示乘方)

    atm 不满足幂零矩阵,他自己设想了一个幂一矩阵:对于一个方阵 M ,如果存在一个正整数 k 满足 M^k = I ,其中 I 是单位矩阵,那么 M 就是一个幂一矩阵。

    atm 特别钟情于这样一种方阵:每行每列有且仅有一个 1 。经过 atm 不断实验,他发现这种矩阵都是幂一矩阵。

    现在,他的问题是,给定一个满足以上条件的方阵,他想求最小的 k 是多少。

【输入格式】
第一行一个正整数 n ,表示矩阵大小是 n * n 。
接下来 n 行,每行两个正整数 i j 表示方阵的第 i 行第 j 列为 1。
1 <= i, j <= n 。
行号,列号都从1开始。

【输出格式】
一行。一个正整数,即题目中所说最小的 k 。

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

【样例输出】
3

【数据范围】
对于 30% 的数据满足 n <= 10
对于 60% 的数据答案不超过 10^18
对于 100% 的数据满足 n <= 10000


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


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

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

 

 

 

 

 

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/302680?site
推荐阅读
相关标签
  

闽ICP备14008679号