1,结果填空:年龄
今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。
花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”。
请你计算:蒜头君和花椰妹年龄一共有多少种可能情况?
提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内。
分析:
暴力枚举每一个人可能的年龄,然后判断是否符合条件。

#include<stdio.h> int main() { int ans = 0; for(int i = 10;i < 100;++i){ for(int j = 10;j < 100;++j){ int a = i / 10; int b = i % 10; int c = j / 10; int d = j % 10; if(((a+b)*3 == c*10 + d)&&((c+d)*2 == 10*a + b)){ ans++; } } } printf("%d ",ans); return 0; }
答案为:1。
2,结果填空:开关灯
蒜头君今天回到了老家的大宅院,老家的灯还是那中拉线的灯(拉一次为亮,再拉一次就灭),蒜头君觉得无聊。把 1000 盏灯 33 的倍数拉了一次,55 的倍数拉了一次,7的倍数拉了一次(灯得的编号从 1-10001−1000,灯的初始状态都是亮的)。这个时候蒜头君在想还剩下几盏灯还在亮着?
提示:请不要输出多余的符号。

#include<stdio.h> bool f[1010]; int main() { int ans = 0; for(int i = 3;i <= 1000;i += 3){ f[i] = !f[i]; } for(int i = 5;i <= 1000;i += 5){ f[i] = !f[i]; } for(int i = 7;i <= 1000;i += 7){ f[i] = !f[i]; } for(int i = 1;i <= 1000;++i){ if(!f[i]){ ++ans; } } printf("%d ",ans); return 0; }
答案:571。
3,结果填空:U型数字
最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增。比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 3131331313,就是不是U型数字。
现在蒜头君问你,[1,100000][1,100000] 有多少U型数字?
提示:请不要输出多余的符号。
分析:
- 从1到100000枚举每一个数字,然后查看每一个数字,是否符合条件。
- 从前往后找到一个不递减的位置,然后检查这个位置是否递增到最后。

#include<iostream> #include<string> using namespace std; int main() { int ans = 0; for(int i = 1;i <= 100000;i++){ string s = to_string(i); bool down = 0,up = 0; int j; for(j = 1;j < s.size();j++){ if(s[j-1] > s[j]){ down = 1; } else{ break; } } if(down && up){ ans++; } } cout << ans << endl; return 0; }
答案:8193
4,代码填空:LIS
LIS是最长上升子序列。什么是最长上升子序列? 就是给你一个序列,请你在其中求出一段最长严格上升的部分,它不一定要连续。
就像这样:22, 33, 44, 77 和 22, 33, 44, 66 就是序列 22 55 3344 11 77 66 的两个上升子序列,最长的长度是 44。

#include<stdio.h> #include<stdlib.h> #include<string.h> int f[10000], b[10000]; int max(int a, int b) { return a > b ? a : b; } int lis(int n) { memset(f, 0, sizeof f); int res = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { if (b[j] < b[i]) { f[i] = max(f[i],f[j]+1); //在此处填空 } } res = max(res, f[i]); } return res+1; } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", b + i); } printf("%d ", lis(n)); return 0; }
5,代码填空:全排列
相信大家都知道什么是全排列,但是今天的全排列比你想象中的难一点。我们要找的是全排列中,排列结果互不相同的个数。比如:aab
的全排列就只有三种,那就是aab
,baa
,aba
。
代码框中的代码是一种实现,请分析并填写缺失的代码。
分析:
全排列用dfs实现。

#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1000 char str[N], buf[N]; int vis[N], total, len; void arrange(int num) { int i, j; if (num == len) { printf("%s ", buf); total++; return; } for (i = 0; i < len; ++i) { if (!vis[i]) { for (j = i + 1; j < len; ++j) { if (str[i] == str[j] && vis[j]/*在这里填写必要的代码*/) { break; } } if (j == len) { vis[i] = 1; buf[num] = str[i]; arrange(num + 1); vis[i] = 0; } } } } int main() { while (~scanf("%s", str)) { len = strlen(str); int i, j; for (i = 0; i < len; ++i) { for (j = i + 1; j < len; ++j) { if (str[i] > str[j]) { char tmp = str[i]; str[i] = str[j]; str[j] = tmp; } } } total = 0; buf[len] = '