前言
部分题目无法通过全部测试样例,待优化。
第1题
问题描述
如果整数 a 是整数 b 的整数倍,则称 b 是 a 的约数。
请问,有多少个正整数是 2020 的约数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:12
代码:
#include <stdio.h>
int main(){
int i;
int num = 2020;
int cnt = 0;
for(i=1;i<=num;i++){
if(num%i == 0){
cnt++;
}
}
printf("%d",cnt);
return 0;
}
第2题
问题描述
如果一个 mp3 文件占用磁盘的大小是 4MB,小蓝的硬盘还剩下 100GB 的空间,请问他还可以放多少个这样的 mp3 文件?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:25600
代码:
#include <stdio.h>
int main(){
int yp = 100*1024;
int ans = yp/4;
printf("%d",ans);
return 0;
}
第3题
问题描述
一个包含 2020 个结点的无向图,如果图中没有自环和重边,最多包含多少条边?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:2039190
代码:
#include <stdio.h>
int main(){
int jd;
int bian;
int anum;
bian = 0;
anum = 1;
for(jd = 2; jd<=2020; jd++){
bian += anum;
anum++;
printf("jd = %d , bian = %d\n",jd,bian);
}
return 0;
}
第4题
问题描述
整数 1 到 6 连在一起,成为 123456,长度为 6。
整数 1 到 12 连在一起,成为 123456789101112,长度为 15。
请问整数 1 到 2020 连在一起,长度为多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:6973
代码:
#include <stdio.h>
int main(){
int ord = 2020;
int i;
int num;
int cnt;
int all_cnt = 0;
for(i=1; i<=ord; i++){
//记录该数字的位数
//默认位数为1
cnt = 1;
num = i;
//每次除以10≠0,则cnt++
while((num/10)!= 0){
cnt++;
num/=10;
}
//cnt为当前数的位数
all_cnt += cnt;
}
printf("%d",all_cnt);
return 0;
}
第5题
问题描述
在一个序列 a = (a[1], a[2], …, a[n]) 中,如果 (i, j) 满足 i < j 且 a[i] > a[j],则称为一个逆序对。
例如:(3, 2, 2, 1) 中包含 6 个逆序对。
请问,(87, 39, 35, 1, 99, 10, 54, 1, 46, 24, 74, 62, 49, 13, 2, 80, 24, 58, 8, 14, 83, 23, 97, 85, 3, 2, 86, 10, 71, 15) 中包含多少个逆序对?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:221或217
代码:
/*
思路:双指针
*/
#include <stdio.h>
int main(){
int a[]={
87, 39, 35, 1, 99, 10, 54, 1, 46, 24, 74, 62, 49, 13, 2, 80, 24, 58, 8, 14, 83, 23, 97, 85, 3, 2, 86, 10, 71, 15,
};
int n = 30;
int i,j;
int cnt = 0;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
cnt++;
}
}
}
printf("%d",cnt);
return 0;
}
第6题
问题描述
给定一个三角形的底边长度 l 和高度 h,求三角形的面积。
输入格式
输入的第一行包含一个整数 l,表示三角形的底边长度。
第二行包含一个整数 h,表示三角形的高。
输出格式
输出一个数,表示三角形的面积。如果面积为整数,请直接输出这个整数,不带小数点。如果面积不是整数,请四舍五入保留正好一位小数。
样例输入
5
6
样例输出
15
样例输入
5
3
样例输出
7.5
数据规模和约定
对于所有评测用例,1 <= l, h <= 100。
代码:
#include <stdio.h>
int main(){
int l,h,temp;
int ians;
double dans;
scanf("%d",&l);
scanf("%d",&h);
temp = l*h;
if(temp%2==0){
ians = temp/2;
printf("%d",ians);
}else{
dans = (double)temp/2.0;
printf("%.1lf",dans);
}
return 0;
}
第7题
问题描述
小蓝正在上小学,老师要求同学们在暑假每天记日记。可是小蓝整个暑假都在玩,直到最后一天才想起要记日记。于是小蓝赶紧编了一些日记交给老师。
没想到,日记很快就被老师发现了问题,原来小蓝记完8月31日的日记,竟又记了8月32日和8月33日的日记。这显然是有问题的,因为根本没有8月32日和8月33日。
给定一个月份和一个日期,请问2021年有没有这一天。
输入格式
输入的第一行包含一个整数 m,表示月份。
第二行包含一个整数 d,表示日期。
输出格式
如果2021年有 m 月 d 日,输入 yes,否则输出 no。
样例输入
8
32
样例输出
no
样例输入
2
28
样例输出
yes
数据规模和约定
对于所有评测用例,1 <= m <= 20,1 <= d <= 40。
代码:
#include <stdio.h>
//2021年不是闰年,2月有28天
const int table[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31,
};
int main(){
int m,d;//月份和日期
int ans;//yes为1,no为0
scanf("%d",&m);
scanf("%d",&d);
if(d<1)ans = 0;
else if(d>table[m])ans = 0;
else ans = 1;
if(ans){
printf("yes");
}else{
printf("no");
}
return 0;
}
第8题
问题描述
给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?
输入格式
输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 t。
输出格式
输出一个单词,表示答案
样例输入
LANQIAO
3
样例输出
AIAO
数据规模和约定
对于所有评测用例,单词长度不超过 100,t 小于单词长度。
代码:
/*
字典序最小单词
遍历所有的可能,找到字典序最小的。
*/
#include <stdio.h>
#include <string.h>
char a[101];
int book[101];
char jg[101];
char b[101];
void fuzhi(char aa[],char bb[]){
int i;
for(i=0;bb[i];i++){
aa[i] = bb[i];
}
aa[i] = 0;
}
int bijiao(char aa[],char bb[]){
int i;
for(i=0;aa[i]!=0 && bb[i]!=0;i++){
if(aa[i]!=bb[i])return aa[i]-bb[i];
}
}
void dfs(int len,int t,int step){
//已经填了t个了,使用strcmp比较
int i,j;
int temp;
if(step==t){
j=0;
for(i=0;i<len;i++){
if(a[i]!=-1){
b[j] = a[i];
j++;
}
}
b[j] = 0;
//如果这个b比jg小,那么它成为新的结果
if(bijiao(b,jg)<0){
fuzhi(jg,b);
}
return;
}
for(i=0;i<len;i++){
if(book[i] == 0){
temp = a[i];
a[i] = -1;
book[i] = 1;
dfs(len,t,step+1);
book[i] = 0;
a[i] = temp;
}
}
}
int main(){
char arr[101];
int t,i,len,maxi,j;
scanf("%s",arr);
scanf("%d",&t);
len = strlen(arr);
fuzhi(a,arr);
for(i=0;i<len;i++){
jg[i] = 127;
}
jg[i] = 0;
dfs(len,t,0);
printf("%s",jg);
return 0;
}
第9题
问题描述
给定一个序列 a_1, a_2, …, a_n。其中 a_1 < a_2 < … < a_n。
相邻两个数之间的差(后一个数减前一个数)称为它们的间隙。
请问序列中最大的间隙值是多少?
输入格式
输入的第一行包含一个整数 n,表示序列的长度。
第二行包含 n 个正整数,为给定的序列。
输出格式
输出一个整数,表示序列中最大的间隙值。
样例输入
5
1 3 8 9 12
样例输出
5
样例说明
a_3 - a_2 = 5。
数据规模和约定
对于所有评测用例,1 <= n <= 1000,1 <= a_i <= 100000。
代码:
#include <stdio.h>
int main(){
int arr[1001];
int n,i;
int jx,max;
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",&arr[i]);
//遍历每个序列的间隙,得到最大值
max = 0;
for(i=1;i<n;i++){
jx = arr[i] - arr[i-1];
if(jx>max){
max = jx;
}
}
printf("%d",max);
return 0;
}
第10题
问题描述
小蓝有黄绿蓝三种颜色的小球,分别为 R, G, B 个。同样颜色的小球没有区别。
小蓝将这些小球从左到右排成一排,排完后,将最左边的连续同色小球个数记为 t_1,将接下来的连续小球个数记为 t_2,以此类推直到最右边的小球。
请问,总共有多少总摆放小球的方案,使得 t_1, t_2, … 为严格单调递增序列,即 t_1 < t_2 < t_3 < …
输入格式
输入一行包含三个整数 R, G, B。
输出格式
输出一个整数,表示答案。
样例输入
3 6 0
样例输出
3
样例说明
用 r 表示红球,g 表示绿球,可能的方案包括:
rrrgggggg
grrrggggg
ggrrrgggg
样例输入
2 4 6
样例输出
3
样例说明
用 r 表示红球,g 表示绿球,b 表示蓝球,可能的方案包括:
rrggggbbbbbb
grrgggbbbbbb
brrggggbbbbb
数据规模和约定
对于30%的评测用例,1 <= R, G, B <= 10;
对于60%的评测用例,1 <= R, G, B <= 30;
对于所有评测用例,1 <= R, G, B <= 50。
调试代码:
/*
遍历出全排列,找出严格增序的
给个数据序列,返回序列的连续数据
*/
#include <stdio.h>
char a[151];
int lxa[100];
int ans;
int zhaolx(){
int i,j;
int cnt;
cnt = 1;
j = 0;
for(i=0;a[i];i++){
if(a[i]==a[i+1]){
cnt++;
}else{
lxa[j] = cnt;
j++;
cnt = 1;
}
}
return j;
}
int isZenxu(int len){
int i;
for(i=1;i<len;i++){
if(lxa[i]<=lxa[i-1]){
return 0;
}
}
return 1;
}
void dfs(int step,int rn,int gn,int bn){
int lx_len;
int j;
if(rn==0&&gn==0&&bn==0){
a[step]=0;
lx_len = zhaolx();
if(isZenxu(lx_len)){
ans++;
printf("%s\n",a);
for(j=0;j<lx_len;j++)printf("%d ",lxa[j]);
printf("\n");
}
return;
}
if(rn!=0){
a[step]='R';
dfs(step+1,rn-1,gn,bn);
}
if(gn!=0){
a[step]='G';
dfs(step+1,rn,gn-1,bn);
}
if(bn!=0){
a[step]='B';
dfs(step+1,rn,gn,bn-1);
}
}
int main(){
int rn,gn,bn;
int i;
scanf("%d%d%d",&rn,&gn,&bn);
ans = 0;
dfs(0,rn,gn,bn);
printf("%d",ans);
return 0;
}
提交代码:
/*
遍历出全排列,找出严格增序的
给个数据序列,返回序列的连续数据
*/
#include <stdio.h>
char a[151];
int lxa[100];
int ans;
int zhaolx(){
int i,j;
int cnt;
cnt = 1;
j = 0;
for(i=0;a[i];i++){
if(a[i]==a[i+1]){
cnt++;
}else{
lxa[j] = cnt;
j++;
cnt = 1;
}
}
return j;
}
int isZenxu(int len){
int i;
for(i=1;i<len;i++){
if(lxa[i]<=lxa[i-1]){
return 0;
}
}
return 1;
}
void dfs(int step,int rn,int gn,int bn){
int lx_len;
int j;
if(rn==0&&gn==0&&bn==0){
a[step]=0;
lx_len = zhaolx();
if(isZenxu(lx_len)){
ans++;
}
return;
}
if(rn!=0){
a[step]='R';
dfs(step+1,rn-1,gn,bn);
}
if(gn!=0){
a[step]='G';
dfs(step+1,rn,gn-1,bn);
}
if(bn!=0){
a[step]='B';
dfs(step+1,rn,gn,bn-1);
}
}
int main(){
int rn,gn,bn;
int i;
scanf("%d%d%d",&rn,&gn,&bn);
ans = 0;
dfs(0,rn,gn,bn);
printf("%d",ans);
return 0;
}