今天课多,明天细补
A、门牌制作(5分)
直接暴力了
#include <iostream>
#include<cstring>
using namespace std;
string s;
int main()
{
for(int i = 1 ; i <= 2020 ; i++)
s += to_string(i);
int res = 0;
for(int i = 0 ; i < s.size() ; i++)
if(s[i] == '2')
res++;
cout<<res<<endl;
return 0;
}
// 624
B、既约分数(5分)
如果硬要说,难点的话,应该是求最大公约数
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
return b ? gcd(b,a % b) : a;
}
int main()
{
int res = 0;
for(int i = 1 ; i <= 2020 ; i++)
for(int j = 1 ; j <= 2020 ; j++)
if(gcd(i,j) == 1)
res ++;
cout<<res<<endl;
return 0;
}
// 2481215
C、蛇形填数(10分)
简简单单偏移打表
#include <iostream>
using namespace std;
const int N = 50;
int g[N][N];
int dx[] = {-1,1},dy[] = {1,-1};
int main()
{
int k = 1;
for(int x = 1 ,y = 1 ,t = 0; x <= 20 || y <= 20 ; k++)
{
g[x][y] = k;
int a = x + dx[t],b = y + dy[t];
if(a < 1)
{
t = 1;
a = 1;
}
else if(b < 1)
{
t = 0;
b = 1;
}
x = a , y = b;
}
cout<<g[20][20]<<endl;
return 0;
}
// 761
D、跑步锻炼(10分)
要是是考试的时候,👴直接开日历来数,也就20年,360个月,我30s数一个月,也就180min,3h罢了,哈哈,开玩笑的,不许开摆!!!😡😡😡,这题很简单的
#include <iostream>
using namespace std;
int mouths[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int week = 6;
int res = 0;
for(int year = 2000 ; year <= 2020 ; year++)
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0; // 判断是否是闰年
mouths[2] = 28 + leap;
for(int mouth = 1 ; mouth <= 12 ; mouth++)
for(int day = 1 ; day <= mouths[mouth] ; day++ )
{
if(week == 1 || day == 1) res += 2;
else res += 1;
week = (week + 1) % 7; // 0 表示周日
if(year == 2020 && mouth == 10 && day == 1)
{
cout<<res<<endl;
return 0;
}
}
}
return 0;
}
// 7979
,
E、七段码(15分)
SET + DFS,我看完别人的题解后,感觉自己在写💩,所以就copy了别人的
#include <iostream>
#include<set>
using namespace std;
int d[7][7];
int ans;
bool st[7];
set<set<int>> se;
void dfs(int x,set<int> s)
{
if(!se.count(s))
{
se.insert(s);
ans++;
}
if(s.size()==7) return;
for(int i = 0 ; i < 7 ; i++)
{
if(st[i] || !d[x][i]) continue; // 如果被搜索过或者之间没有边
st[i] = true;
s.insert(i);
dfs(i,s);
st[i] = false;
s.erase(i);
}
}
void add(int a,int b)
{
d[a][b] = 1;
d[b][a] = 1;
}
int main()
{
// 0 和 1 加边
add(0,1);
// 0 和 5 加边
add(0,5);
// 1 和 6 加边
add(1,6);
// 1 和 2 加边
add(1,2);
// 2 和 6 加边
add(2,6);
// 2 和 3 加边
add(2,3);
// 3 和 4 加边
add(3,4);
// 4 和 6 加边
add(4,6);
// 4 和 5 加边
add(4,5);
// 5 和 6 加边
add(5,6);
set<int> s;
for(int i = 0 ; i < 7 ; i++)
{
s.insert(i);
st[i] = true;
dfs(i,s);
st[i] = false;
s.erase(i);
}
cout<<ans<<endl;
return 0;
}
F、成绩统计(15分)
【样例输入】
7
80
92
56
74
88
100
0
【样例输出】
71%
43%
【评测用规模与约定】
对于 50% 的评测用例, 1 ≤ n ≤ 100 {1 \leq n \leq 100 } 1≤n≤100
对于所有评测用例, 1 ≤ n ≤ 10000 {1 \leq n \leq 10000 } 1≤n≤10000
语法题
#include <iostream>
using namespace std;
int n;
int minN = 110,maxN = -1,sum;
int main()
{
cin >> n;
int a;
for(int i = 0 ; i < n ; i++)
{
cin>>a;
if(maxN < a) maxN = a;
else if(minN > a) minN = a;
sum += a;
}
printf("%d\n%d\n%.2lf\n",maxN,minN,sum * 1.0/ n);
return 0;
}
G、回文日期(20分)
【样例输入】
20200202
【样例输出】
20211220
21211212
【评测用规模与约定】
对于所有评测用例, 10000101 ≤ N ≤ 89991231 {10000101 \leq N \leq 89991231 } 10000101≤N≤89991231,保证N是一个合法日期的8位表示
模拟题,嗯造,就完事了,时间转换出了点问题,一直 没发现,卡了亿点顶时间
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int mouths[] = {31,28,31,30,31,30,31,31,30,31,30,31};
bool isValid(int year,int mouth,int day)
{
if(mouth > 12 || mouth < 0) return false;
if(mouth != 2)
{
if(mouths[mouth-1] < day)
return false;
}
else
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if(mouths[mouth-1] + leap < day)
return false;
}
return true;
}
int main()
{
string date;
cin>>date;
int year = 0;
for(int i = 0 ; i < 4 ; i++)
year = year * 10 + (date[i] - '0');
int dateMouth = ( date[4] - '0' ) * 10 + (date[5] - '0');
int dateDay = ( date[6] - '0' ) * 10 + (date[7] - '0');
for(int i = year ; ; i++) // 用i代替年来枚举
{
int mouth = i % 10 * 10 + i / 10 % 10 ;
int day = i / 100 % 10 * 10 + i / 1000;
if(i == year && mouth <= dateMouth && day <= dateMouth) continue;
if(isValid(i, mouth , day ))
{
cout<<i * 10000 + mouth * 100 + day<<endl;
break;
}
}
// 枚举回文字年
int ab = (date[0] - '0') * 10 + (date[1] - '0');
int mm = (date[4] - '0') * 10 + (date[5] - '0');
int abxx = ab * 100 + (date[2] - '0') * 10 + (date[3] - '0');
for(int i = ab ; ; i++)
{
int a = i / 10;
int b = i % 10;
int newYear = a * 1000 + b * 100 + a * 10 + b;
int newMouth = b * 10 + a;
if(abxx > newYear) continue; // 年月日比较,枚举的必须比它大
if(abxx == newYear && mm >= newMouth) continue;
if(isValid(newYear, newMouth, newMouth))
{
printf("%d%02d%02d\n",newYear,newMouth,newMouth);
break;
}
}
return 0;
}
H、子串分值和(20分)
I、平面切分(25分)
【样例输入】
20200202
【样例输出】
20211220
21211212
【评测用规模与约定】
对于 50% 的评测用例, 1 ≤ V ≤ 100 {1 \leq V \leq 100 } 1≤V≤100
对于所有评测用例, 1 ≤ V ≤ 10000 {1 \leq V \leq 10000 } 1≤V≤10000
J、字符串排序(25分)
【样例输入】
4
【样例输出】
bbaa
【样例输入】
100
【样例输出】
jihgfeeddccbbaa
【评测用规模与约定】
对于 30% 的评测用例, 1 ≤ V ≤ 20 {1 \leq V \leq 20 } 1≤V≤20
对于 50% 的评测用例, 1 ≤ V ≤ 100 {1 \leq V \leq 100 } 1≤V≤100
对于所有评测用例, 1 ≤ V ≤ 10000 {1 \leq V \leq 10000 } 1≤V≤10000