A:门牌制作
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要为一条街的住户制作门牌号。
这条街一共有 20202020 位住户,门牌号从 11 到 20202020 编号。
小蓝制作门牌的方法是先制作 00 到 99 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1到 2020 号门牌,总共需要多少个字符 2?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
填空题,挨个遍历,送分题,要把握住;
#include <iostream>
using namespace std;
int ans;
int main()
{
for(int i=1;i<=2020;i++){
int c=i;
while(c){
int a=c%10;
if(a==2){
ans++;
}
c=c/10;
}
}
cout<<ans;
return 0;
}
B:既约分数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如43,81,17, 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1和 2020)?
运行限制
- 最大运行时间:2s
- 最大运行内存: 128M
没啥说的,遍历就行了,才2020个数;
#include <iostream>
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b); //最大公约数
}
int main()
{
int ans=0;
for(int i=1;i<=2020;i++){
for(int j=1;j<=2020;j++){
if(gcd(i,j)==1){
ans++;
}
}
}
cout<<ans;
return 0;
}
C:蛇形填数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下图所示,小明用从 11 开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20列的数是多少?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
找规律,每次增加4*(i-1),i为行列数,第二行第二列就是1+4*1=5,三就是5+4*2=13,以此类推,实在不行挨个列出来都行,so easy;
#include <iostream>
using namespace std;
int main()
{
int sum=1;
for(int i=1;i<20;i++){
sum=sum+i*4;
}
cout<<sum;
return 0;
}
D:七段码
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 77 段可以发光的二 极管,分别标记为 a,b,c,d,e,f,g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如 c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a,b,c,d,e 发光,f,g 不发光可以用来表达一种字符。
例如:b,f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
总通过次数: 6415 | 总提交次数: 7026 | 通过率: 91.3%
难度: 简单 标签: 填空题, 2020, 省赛
其实啊我感觉数一下用的时间更少
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
set<string> num;
int c[4][2]={
{-1,0},{0,-1},{1,0},{0,1}};
string a[3];
int d[5][5];
int ans;
void dfs(int x,int y,string r){
d[x][y]--;
for(int i=0;i<4;i++){
int tx=x+c[i][0];
int ty=y+c[i][1];
if(tx>=0&&tx<3&&ty>=0&&ty<3&&d[tx][ty]!=0&&a[tx][ty]!='*'){
sort(r.begin(),r.end());
num.insert(r);
if(d[1][1]==1&&tx==1&&ty==1){
dfs(tx,ty,r);
}
else{
dfs(tx,ty,r+a[tx][ty]);
}
num.insert(r);
}
}
d[x][y]++;
}
int main()
{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
d[i][j]=1;
}
}
d[1][1]=2;
a[0]="abb";
a[1]="fgc";
a[2]="eed";
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(a[i][j]!='*'){
string r="";
r+=a[i][j];
dfs(i,j,r);
}
}
}
// for(set<string>::iterator it=num.begin();it!=num.end();it++){
// cout<<*it<<endl;
// }
cout<<num.size()/2;
return 0;
}
E:跑步锻炼
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
一天天遍历判断这一天加几就好了
#include <iostream>
using namespace std;
int month12[12]={31,28,31,30,31,30,31,31,30,31,30,31};
long long ans;
int main(){
int year=2000;
int month=1;
int day=1;
int xingqi=6;
while(1){
if(year%400==0 || (year%100!=0 && year%4==0)){
month12[1]=29;
}else{
month12[1]=28;
}
if(day==1||xingqi==1){
ans+=2;
}else{
ans++;
}
if(day==month12[month-1]){
day=1;
month++;
}else{
day++;
}
if(month==13){
month=1;
year++;
}
if(xingqi==7){
xingqi=1;
}
else{
xingqi++;
}
if(year==2020&&month==10&&day==2){
break;
}
}
cout<<ans;
return 0;
}
F:回文日期
题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 NN,表示日期。
对于所有评测用例,10000101≤N≤89991231,保证 NN 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
输入输出样例
示例
输入
20200202
输出
20211202
21211212
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
回文日期就是前四个和后四个对称呗,从最小开始遍历,只取前四位,倒过来后判断是否符合实际,符合存储下来。然后打印第一个,然后找第一个ABABBABA类型的,就是在原来基础上前两位和三四位相等呗,遍历一下数组,打印第一个。
#include <iostream>
using namespace std;
int n;
int c;
int month12[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int shu[4];
int s[1000000];
bool check(int x){
if(x%400==0 || (x%100!=0 && x%4==0)){
month12[1]=29;
}else{
month12[1]=28;
}
int mm=x;
int cc=0;
while(mm){
shu[cc]=mm%10;
mm=mm/10;
cc++;
}
if(shu[0]==0 && shu[1]<=9&& ((shu[2]*10+shu[3])<=month12[shu[1]-1])){
return true;
}
else if(shu[0]==1&&shu[1]<=2&& ((shu[2]*10+shu[3])<=month12[10+shu[1]-1])){
return true;
}
else{
return false;
}
}
int main(){
cin>>n;
int v=0;
int m=n/10000;
for(int i=m+1;i<=10000;i++){
if(check(i)){
s[v]=i*10000+shu[0]*1000+shu[1]*100+shu[2]*10+shu[3];
v++;
}
}
cout<<s[0]<<endl;
for(int i=0;i<v;i++){
int nn=s[i]/10000;
int nnn=nn/100;
int nnnn=nn%100;
if(nnn==nnnn){
cout<<s[i];
break;
}
}
return 0;
}
万万没想到啊
90,就差一奈奈,我真的会谢啊。不想改了,就这样吧,卒。
G:字串排序
题目描述
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan
排序,只需要 1 次交换。对于字符串 qiao
排序,总共需要 4 次交换。
小蓝的幸运数字是 VV,他想找到一个只包含小写英文字母的字符串,对这个串中的字符进行冒泡排序,正好需要 VV 次交换。请帮助小蓝找一个这样的字符串。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。
输入描述
输入一行包含一个整数 (1≤V≤104),为小蓝的幸运数字。
输出描述
输出一个字符串,为所求的答案。
输入输出样例
示例 1
输入
4
输出
bbaa
示例 2
输入
100
输出
jihgfeeddccbbaa
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
#include<iostream>
using namespace std;
const int N = 1e5+5;
char str[N];
int main(){
int n;
cin>>n;
int r=0;
while(r*(r+1)/2<n)r++; //等差序列和
r++;
int t=(r-1)*r/2-n; //r个字母最大逆系数为t
str[r-1]='a';
for(int i=r-2;i>=0;i--){
if(t>r/2){ //这时要有三个相同字母存在
str[i]=str[i+1];
i--;
str[i]=str[i+1];
i--;
t-=3;
}else if(t>0){
str[i]=str[i+1];
i--;t--;
}
if(i>=0)str[i]=str[i+1]+1;
}
puts(str);
return 0;
}
H:成绩统计
题目描述
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。
输入描述
输入的第一行包含一个整数 (1≤n≤104),表示考试人数。
接下来 nn 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
输出描述
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。
输入输出样例
示例
输入
7
80
92
56
74
88
100
0
输出
71%
43%
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
注意舍弃就行了。转移int时加上0.5就行了。地板舍弃原来是
#include <iostream>
using namespace std;
int n;
int hege,youxiu;
int main()
{
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
if(x>=60){
hege++;
if(x>=85){
youxiu++;
}
}
}
int a=hege*100.0/n*1.0+0.5;
int b=youxiu*100.0/n*1.0+0.5;
printf("%d%\n%d%",a,b);
return 0;
}
I:字串分值和
题目描述
对于一个字符串 SS,我们定义 SS 的分值 f(S) 为 SS 中出现的不同的字符个数。例如 f(“aba”) = 2,f(“abc”) = 3, f(“aaa”) = 1。
现在给定一个字符串 S[0...n−1](长度为 nn),请你计算对于所有 S 的非空子串 f(S [i...j])f(S[i...j]) 的和是多少。
输入描述
输入一行包含一个由小写字母组成的字符串 SS。
其中,1≤n≤105。
输出描述
输出一个整数表示答案。
输入输出样例
示例 1
输入
ababc
输出
28
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
找每个字母的价值,找到某个字母下标与上一个相同字母之间的距离,然后再计算出到末尾之间的距离。两个距离乘积就是该字母的价值。求出每个字母价值,累加就好了
#include <iostream>
#include <string>
using namespace std;
string s;
long long sum;
int last[1005];
using namespace std;
int main(){
cin>>s;
int a=s.size(); //字符串的长度
s=' '+s; //避免为0情况出现
for(int i=1;i<=a;i++){
sum+=(long long)(i-last[s[i]])*(a-i+1); //last储存上一次该字母出现的下标
//i-last[s[i]]表示,距离上一个字母出现的距离,(a-i+1)表示到最后的距离
last[s[i]]=i;
}
cout<<sum;
return 0;
}
J:平面切分
题目描述
平面上有 N 条直线,其中第 ii 条直线是 y=Ai×x+Bi。
请计算这些直线将平面分成了几个部分。
输入描述
第一行包含一个整数 NN。
以下 NN 行,每行包含两个整数 Ai,Bi。
其中,1≤N≤1000,−105≤Ai,Bi≤105。
输出描述
一个整数代表答案。
输入输出样例
示例
输入
3
1 1
2 2
3 3
输出
6
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
一开始有一个平面,每多一个直线至少加一个平面,该直线与其余直线每有一个交点就多加一。
#include <iostream>
#include <set>
using namespace std;
int ans,n;
set<pair<double,double> > xian;
void chick(double k1,double b1){
set<pair<double,double> > dian;
int k2,b2;
for(auto it:xian){
k2=it.first;
b2=it.second;
if(k1!=k2){
double x=(b1-b2)/(k1-k2);
double y=k1*x+b1;
dian.insert(make_pair(x,y));
}
}
ans+=dian.size();
dian.clear();
}
int main(){
ans=1;
cin>>n;
for(int i=0;i<n;i++){
double k=0;
double b=0;
cin>>k>>b;
int len=xian.size();
xian.insert(make_pair(k,b));
if(len!=xian.size()){
ans++; //固定加一,有一个交点额外加一
chick(k,b);
}
}
cout<<ans;
return 0;
}