1:单位变换
【问题描述】
在计算机存储中,15.125GB是多少MB?
【答案提交】
这是一道结果填空的题,你只须要算出结果后提交便可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将没法得分。
15.125*1024=15488
答案:15488
node
2:约数个数
【问题描述】
1200000有多少个约数(只计算正约数)。
【答案提交】
这是一道结果填空的题,你只须要算出结果后提交便可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将没法得分。
ios
#include <bits/stdc++.h> #include <algorithm> #define mod 1000000007 #define LL long long using namespace std; int a[100005],bi[100005]; int main() { int sum = 0; for(int i = 1; i*i <= 1200000; i++){ if(1200000%i == 0){ sum++; } } cout << sum * 2; return 0; }
答案:96c++
3:叶节点数
【问题描述】
一棵包含有2019个结点的二叉树,最多包含多少个叶结点?
【答案提交】
这是一道结果填空的题,你只须要算出结果后提交便可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将没法得分。
思路:
方法一:
设有n层
总节点数为2^n-1
第i层节点数最多为2^(i-1)
根据这两个公式就能够算出答案。
方法二:
n=n0+n1+n2,为使叶子节点数(n0)最多,必须n1最小,设为0,而n0=n2+1
得n2=(2019-1)/2=1009
全部n1=1009+1=1010
答案:1010
spa
4:数字9
【问题描述】
在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算时只是算一个数。
【答案提交】
这是一道结果填空的题,你只须要算出结果后提交便可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将没法得分。
code
#include <bits/stdc++.h> #include <algorithm> #define mod 1000000007 #define LL long long using namespace std; bool judge(int x) { while(x){ int d = x % 10; if(d == 9) return true; x /= 10; } return false; } int main() { int cnt = 0; for(int i = 1; i <= 2019; i++){ if(judge(i)){ cnt++; } } cout << cnt << endl; return 0; }
答案:544it
5:数位递增的数
【问题描述】
一个正整数若是任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
30
【样例输出】
26
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n <= 1000。
对于 80% 的评测用例,1 <= n <= 100000。
对于全部评测用例,1 <= n <= 1000000。
io
#include <bits/stdc++.h> #include <algorithm> #define mod 1000000007 #define LL long long using namespace std; bool judge(int x) { int k1,k2; if(x >= 1 && x <= 9) return true; k1 = x % 10; x /= 10; while(x){ k2 = x % 10; if(k1 < k2) return false; k1 = k2; x /= 10; } return true; } int main() { int n,cnt = 0; scanf("%d",&n); for(int i = 1; i <= n; i++){ if(judge(i)){ cnt++; } } printf("%d\n",cnt); return 0; }
6:递增三元组
【问题描述】
在数列 a[1], a[2], …, a[n] 中,若是对于下标 i, j, k 知足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素多是递增三元组的中心。
【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
5
1 2 5 3 5
【样例输出】
2
【样例说明】
a[2] 和 a[4] 多是三元组的中心。
【评测用例规模与约定】
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于全部评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。
class
#include <bits/stdc++.h> #include <algorithm> #define mod 1000000007 #define LL long long using namespace std; int a[1005]; int main() { freopen("In.txt","r",stdin); freopen("Out.txt","w",stdout); int n; while(~scanf("%d",&n)){ int cnt = 0; for(int i = 1; i <= n; i++) scanf("%d",&a[i]); for(int i = 1; i <= n; i++){ int flag1 = 0,flag2 = 0; for(int j = 1; j < i; j++){ if(a[j] < a[i]){ flag1 = 1; break; } } for(int j = i+1; j <= n; j++){ if(a[j] > a[i]){ flag2 = 1; break; } } if(flag1 + flag2 == 2){ cnt++; } } printf("%d\n",cnt); } return 0; }
8:长草
【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其余小块仍然保持是空地。
这些草长得很快,每一个月,草都会向外长出一些,若是一个小块种了草,则它将向本身的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。若是为小数点,表示为空地,若是字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。若是为小数点,表示为空地,若是字母为 g,表示长了草。
【样例输入】
4 5
.g…
…
…g…
…
2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于全部评测用例,2 <= n, m <= 1000,1 <= k <= 1000。
stream
#include <bits/stdc++.h> #include <algorithm> #define mod 1000000007 #define LL long long using namespace std; struct node{ int x,y; int l; node(int a,int b,int k){ x = a; y = b; l = k; } }; queue<node>q; int dis[4][2] = { { 1,0},{ -1,0},{ 0,1},{ 0,-1}}; int vis[1005][1005]; int n,m,d; bool check(int x,int y) { if(x <= 0 || x > n || y < 0 || y >= m) return false; return true; } void bfs() { while(!q.empty()){ node s = q.front(); q.pop(); if(s.l >= d) continue; for(int i = 0; i < 4; i++){ int x = s.x + dis[i][0]; int y = s.y + dis[i][1]; if(check(x,y) && !vis[x][y]){ q.push(node(x,y,s.l+1)); vis[x][y] = 1; } } } } int main() { char s[1005][1005]; scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++){ scanf("%s",&s[i]); } for(int i = 1; i <= n; i++){ for(int j = 0; j < m; j++){ if(s[i][j] == 'g'){ q.push(node(i,j,0)); } } } scanf("%d",&d); bfs(); for(int i = 1; i <= n; i++){ for(int j = 0; j < m; j++){ if(s[i][j] == '.'){ if(vis[i][j]) printf("g"); else printf("."); } else printf("g"); } printf("\n"); } return 0; }
9:序列计数
【问题描述】
小明想知道,知足如下条件的正整数序列的数量:
扩展
- 第一项为 n;
- 第二项不超过 n;
- 从第三项开始,每一项小于前两项的差的绝对值。
请计算,对于给定的 n,有多少种知足条件的序列。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
【样例输入】
4
【样例输出】
7
【样例说明】
如下是知足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
【评测用例规模与约定】
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于全部评测用例,1 <= n <= 1000。
思路:记忆化搜索,O(N^3),会超时,dp[pre][cur], pre表示序列的前一个数,cur表示序列的当前的数,dp[pre][cur]就表示前一个数是pre,当前数是cur的序列有多少个.
#include <iostream> #include <algorithm> #include <vector> #define ll long long using namespace std; int dp[1005][1005]; ll dfs(int pre,int cur) { if(dp[pre][cur]) return dp[pre][cur]; ll ans = 1; for(int i = 1; i < abs(pre-cur); i++){ ans = (ans + dfs(cur,i))%10000; } dp[pre][cur] = ans; return ans % 10000; } int main(){ int n; ll ans = 0; scanf("%d",&n); for(int i = 1; i <= n; i++){ ans = (ans + dfs(n,i))%10000; } printf("%lld",ans); return 0; }