第一周
填空题找规律
1.门牌制作
#include <iostream>
using namespace std;
int main()
{
int cnt = 0;
for(int i = 1;i<=2020;i++){
if(i/1000==2)cnt++;//千位
if(i%10==2)cnt++;//个位
if(i/100%10==2)cnt++;//百位
if(i%100/10==2)cnt++;//十位
}
printf("%d",cnt);
// 请在此输入您的代码
return 0;
}
2.卡片制作
#include <iostream>
using namespace std;
int main()
{
int cnt = 0,s,i;
for( i = 0;cnt<2021;i++){
s = i;
for(int j = 1; s!=0 ;j++){
if(s%10==1)cnt++;
s/=10;
}
}
printf("%d",i-1);
// 请在此输入您的代码
return 0;
}
3.分数
#include <iostream>
using namespace std;
int gcd(int a,int b){
if(a%b==0)return b;
else return gcd(b,a%b);
}
int main()
{
int fz=0,n = 1;
int m[21];
for(int i = 0;i<21;i++){
m[i] = 0;
}
for(int i = 1;i<=20;i++){
m[i] = n;
n*=2;
}
for(int i = 1;i<=20;i++){
fz += m[i];
}
printf("%d/%d",fz/gcd(fz,m[20]),m[20]/gcd(fz,m[20]));
// 请在此输入您的代码
return 0;
}
4.星期一
(excel计算第一天是星期几)
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int i,s = 0;
for(i = 1901;i<=2000;i++){
if((i%4==0&&i%100!=0)||i%400==0){
s++;
}
}
printf("%d",(100*365+s)/7);
return 0;
}
5.顺子日期
(打表题)
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
cout<<14;
return 0;
}
6.修剪灌木
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int n;
cin>>n;
for(int i = 1;i<=n;i++){
cout<<2*(max(i-1,n-i))<<endl;
}
return 0;
}
7.最少砝码
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
// 请在此输入您的代码
int n;
cin>>n;
int sum=1,weight=1,num=1; //1:(1) 1
while(sum<n){ //2:(1,3)4
num++; //3:(1,3,9)13
weight*=3;
sum+=weight;
}
cout<<num;
return 0;
}
第二周
较简单
8.成绩分析
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int n;
cin>>n;
int m[n];
int sum = 0;
int temp;
for(int i= 0;i<n;i++){
scanf("%d",&m[i]);
}
for(int i =0;i<n;i++){
for(int j = 0;j<n-i-1;j++){ //冒泡
if(m[j]>m[j+1]){
temp = m[j];
m[j] = m[j+1];
m[j+1] = temp;
}
}
}
for(int i = 0;i<n;i++){
sum+=m[i];
}
printf("%d\n",m[n-1]);
printf("%d\n",m[0]);
printf("%.2f",sum*1.00/n);
return 0;
}
9合法日期
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int m,d;
cin>>m>>d;
if(m>=1&&m<=12){
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
if(d>=1&&d<=31){
printf("yes\n");
}
else printf("no");
}
if(m==4||m==6||m==9||m==11){
if(d>=1&&d<=30){
printf("yes");
}
else printf("no");
}
if(m==2){
if(d>=1&&d<=28){
printf("yes");
}
else printf("no");
}
}
else printf("no");
return 0;
}
10时间加法
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int a,b,t;
cin>>a>>b>>t;
int f,s;
f=(b+t)%60;
s =(b + t)/60;
printf("%d\n%d",s+a,f);
return 0;
}
11扫雷(边界问题)
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int n,m;
cin>>n>>m;
int num[n+2][m+2]={0};
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
scanf("%d",&num[i][j]);
}
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
if(num[i][j]==1){
printf("9 ");
}
else {
int a=0;
if(num[i-1][j-1]==1)a++;
if(num[i-1][j]==1)a++;
if(num[i-1][j+1]==1)a++;
if(num[i][j-1]==1)a++;
if(num[i][j+1]==1)a++;
if(num[i+1][j-1]==1)a++;
if(num[i+1][j]==1)a++;
if(num[i+1][j+1]==1)a++;
printf("%d ",a);
}
}
printf("\n");
}
return 0;
}
12大写(注意类型转换string的使用)
#include <iostream>
#include<cstring>
using namespace std;
int main()
{
// 请在此输入您的代码
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]>='a'&&s[i]<='z'){
cout<<(char)(s[i]-32);
}
else cout<<s[i];
}
return 0;
}
13标题统计(getline)
#include <iostream>
#include<cstring>
using namespace std;
int main()
{
// 请在此输入您的代码
int sum = 0;
string s;
getline(cin,s);
for(int i = 0;i<s.length();i++){
if(s[i]!=' '&&s[i]!='\n'){
sum++;
}
}
cout<<sum;
return 0;
}
14求和
#include <iostream>
using namespace std;
int isnum (int n){
while(n){
if(n%10==2||n%10==0||n%10==1||n%10==9){
return 1;
}
n/=10;
}
return 0;
}
int main()
{
// 请在此输入您的代码
long long sum = 0;
for(int i = 1;i<=2019;i++){
if(isnum(i)){
sum+=i;
}
}
cout<<sum;
return 0;
}
15最大间隙
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int n,max = 0;
cin>>n;
int m[1000];
for(int i = 0;i<n;i++){
scanf("%d",&m[i]);
}
for(int i = 0;i<n;i++){
if(m[i]-m[i-1]>=max){
max= m[i]-m[i-1];
}
}
cout<<max;
return 0;
}
16金币(计算1+2+2+3+3+3,,,)
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int k,sum=0,i,m;
cin>>k;
for(i = 1;;i++){
for(int j=1;j<=i;j++){
sum+=i;
m++;
if(m==k){
cout<<sum;
return 0;
}
}
}
return 0;
}
17天干地支
#include <iostream>
#include<cstring>
using namespace std;
int main()
{
// 请在此输入您的代码
int n;
cin>>n;
string a[10]={"geng", "xin", "ren", "gui", "jia", "yi" , "bing", "ding", "wu", "ji"};
string b[12]={"shen", "you", "xu", "hai", "zi", "chou", "yin", "mou", "chen", "si", "wu", "wei"};
cout<<a[n%10]<<b[n%12]<<endl;
return 0;
}
18明明的随机数
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int n,num=0,x;
cin>>n;
int m[1001]={0};
for(int i = 0;i<n;i++){
cin>>x;
m[x]=1;
}
for(int i = 1;i<=1000;i++){
if(m[i]==1)num++;
}
cout<<num<<endl;
for(int i = 1;i<=1000;i++){
if(m[i]==1){
cout<<i<<" ";
}
}
}
19灌溉(bfs)
#include <iostream>
using namespace std;
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int book[101][101];
int squ[101][101];
int k,m,n;
int ans = 0;
void dfs(int x, int y,int step)
{
if (step> k) return ;
for (int i = 0; i < 4; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (nx>=1 || ny>=1 || nx<=n || ny<=m)
book[nx][ny]++;
dfs(nx, ny, step+1);
}
}
int main()
{
cin >> n >> m;
int t,k;
int x, y;
cin >> t;
while (t--)
{
cin >> x >> y;
squ[x][y] = 1;
book[x][y] = 1;
}
cin >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (squ[i][j] == 1)
dfs(i, j, 0);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (book[i][j] >= 1)ans++;
cout << ans;
return 0;
}
20特殊日期(有点迷)
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int ans=0;
int d[] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
for( int y = 1900;y<=9999;y++){
int ysum = y%10+y/1000%10+y/100%10+y/10%10;
if((y%4==0&&y%100!=0)||(y%400==0)){
d[2]=29;
}
else d[2] =28;
for(int m = 1;m<=12;m++){
for(int dd=1;dd<=d[m];dd++){
int sum = dd%10+dd/10%10+m%10+m/10%10;
if(sum==ysum)ans++;
}
}
}
cout<<ans;
}
21最大距离
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int m[10010];
int main()
{
int n,ans=0;
cin>>n;
for(int i = 1;i<=n;i++){
scanf("%d",&m[i]);
}
for(int i =1;i<=n;i++){
for(int j = i+1;j<=n;j++){
if((j-i+abs(m[j]-m[i]))>=ans){
ans = j-i+abs(m[j]-m[i]);
}
}
}
cout<<ans;
}
22最长递增(ans=0)
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int m[10010],ans=0;
int main()
{
int n,max=0;
cin>>n;
for(int i = 1;i<=n;i++){
scanf("%d",&m[i]); }
for(int i =1;i<=n;i++){
if(m[i]>m[i-1]){
ans++;
}else {
if(ans>max){
max = ans;
}
ans = 1;
}
}
cout<<max;
}
23串的处理
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s;
getline(cin,s);
for(int i = 0;i<s.length();i++){
if(s[i]==' '&&s[i+1]==' '){
continue;
}
else if((s[i-1]==' '||i==0)&&(s[i]>='a'&&s[i]<='z')){
cout<<char(s[i]+('A'-'a'));
}
else if((s[i]>='0'&&s[i]<='9')&&(s[i-1]>='a'&&s[i-1]<='z')){
cout<<'_'<<char(s[i]);
}
else if((s[i]>='a'&&s[i]<='z')&&(s[i-1]>='0'&&s[i-1]<='9')){
cout<<'_'<<char(s[i]);
}
else cout<<s[i];
}
return 0;
}
24幸运数字
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
//From Wuhan Institute of Technology Wolf King Team
int Njz(int N,int a)//把十进制数N转换成a进制字符串
{
int sum=0;
while(N)
{
sum+=N%a;//逆序存放
N/=a;
}
return sum;
}
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int i,N,sum;
for(i=1,N=0;N<2023;i++)
{
if(i%Njz(i,2)==0&&i%Njz(i,8)==0&&i%Njz(i,10)==0&&i%Njz(i,16)==0)
{N++;sum=i;}
}
printf("%d\n",sum);
return 0;
}
25缩位求和(有点绕)
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int sum = 0;
for (int i = 0; i < s.length(); i++) { //第一次逐位求和
sum += (s[i] - '0'); //char转int
}
int t = sum;
while (t >= 10) { //再次逐位求和,直到为一位数
t = 0;
while (sum) {
t += sum % 10;
sum /= 10;
}
sum = t;
}
cout << t << endl;
return 0;
}
26幸运数
#include<cstdio>
#include<iostream>
using namespace std;
int a[5][50]={0};
int cnt = 0;
void name(int i){
int t = 0,sum = 0;
while(i){
sum +=i%10;
i/=10;
t++;
}a[t][sum]++;
}
int main()
{
for(int i = 1;i<=9999;i++){
name(i);
}
for(int i = 1;i<=4;i++){
for(int j = 1;j<=i*9;j++){
for(int k = 1;k<=i;k++){
cnt+=a[i][j]*a[k][j];
}
}
}
cout<<cnt;
}
27有奖问答超时
#include<cstdio>
#include<iostream>
using namespace std;
int ans=0;
void dfs(int x,int score,int k){
if(k==0)score=0;
if(k==1){
score+=10;
if(score==100)return ;
}
if(score==70)ans++;
if(x==30)return;
dfs(x+1,score,0);
dfs(x+1,score,1);
}
int main(){
dfs(0,0,0);
cout<<ans;
}
28求和
import os
import sys
# 请在此输入您的代码
n = 20230408
print(n * (n + 1) // 2)
29星期几
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int n,m;
cin>>n>>m;
if(((m+n)%7)==0)cout<<0;
else cout<<((m+n)%7);
return 0;
}
30特别数的和
#include<iostream>
using namespace std;
bool check(int n){
while(n){
int s = n%10;
n/=10;
if(s==2||s==0||s==1||s==9){
return true;
}
}
return false;
}
int main()
{
int n,sum=0;
cin>>n;
for(int i = 1;i<=n;i++){
if(check(i))sum+=i;
}
cout<<sum;
}
31清理水域
#include <iostream>
using namespace std;
int b[110][110],a[110][110],r1,r2,c1,c2,n,m,t,ans;//数组b为a数组的差分数组,数组a为数组b的前缀和数组
int main()
{
cin>>n>>m>>t;
while(t--){
cin>>r1>>c1>>r2>>c2;
b[r1][c1]++;
b[r2+1][c2+1]++;
b[r1][c2+1]--;
b[r2+1][c1]--;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+b[i][j];//本题也可以只使用数组b完成,为了方便理解就使用了数组a(若只是要一个数组则可以写成:b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1])
if(a[i][j]==0)ans++;
}
}
cout<<ans;
return 0;
}
32奖学金
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
int id;
int c,m,e;
int sum;
}s[305];
bool cmp(student a,student b){
if(a.sum>b.sum)return true;
else if(a.sum<b.sum)return false;
else {
if(a.c>b.c)return true;
else if(a.c<b.c)return false;
else {
if(a.id>b.id)return true;
else return false;
}
}
}
int main()
{
int n;
cin>>n;
for(int i = 1;i<=n;i++){
s[i].id = i;
cin>>s[i].c>>s[i].m>>s[i].e;
s[i].sum = s[i].c+s[i].m+s[i].e;
}
sort(s+1,s+n+1,cmp);
for(int i = 1;i<=5;i++){
cout<<s[i].id<<' '<<s[i].sum<<endl;
}
return 0;
}
33手机位数
#include <stdio.h>
char s[16];
int main(void)
{
int n;
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%s",&s);
int ans = 0;
if (s[0] == s[1] + 1 && s[1] == s[2] + 1 && s[2] == s[3] + 1) ans += 5;
if (s[0] == s[1] - 1 && s[1] == s[2] - 1 && s[2] == s[3] - 1) ans += 5;
if (s[0] == s[1] && s[1] == s[2]) ans += 3;
if (s[1] == s[2] && s[2] == s[3]) ans += 3;
if (s[0] == s[1] && s[2] == s[3]) ans += 1;
if (s[0] == s[2] && s[1] == s[3]) ans += 1;
for (int j=0;j<4;j++)
{
switch (s[j])
{
case '6':
case '8':
case '9':
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}