七段码
题目:
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二
极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上
一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
答案: 80
代码:
#include <iostream>
using namespace std;
int ans=0; //ans种不同字符
int light[8]; //7个数码管的发光情况
int father[8]; //并查集所有元素的父结点
int pipe[8][8]=
{
{
0,0,0,0,0,0,0,0},
{
0,0,1,0,0,0,1,0},
{
0,1,0,1,0,0,0,0},
{
0,0,1,0,1,0,0,1},
{
0,0,0,1,0,1,0,0},
{
0,0,0,0,1,0,1,1},
{
0,1,0,0,0,1,0,1},
{
0,0,1,1,0,1,1,0}
};//初始化数码管数组
//查找根结点
int findFather(int i)
{
if(i != father[i])
i = findFather(father[i]);
return i;
}
//有相邻的并且发光的数码管合并为一个集合
void Union(int a,int b)
{
int fa = findFather(a);
int fb = findFather(b);
if(fa != fb && light[a] && light[b] && pipe[a][b])
father[fa] = fb;
}
//列举数码管发光的所有情况
void dfs(int x)
{
//当x>7时,当前所有数码管的发光情况均已确定
if(x > 7)
{
//初始化所有结点的父结点
for(int i=1;i<8;i++)
father[i] = i;
for(int i=1;i<8;i++)
{
for(int j=1;j<8;j++)
{
Union(i,j);
}
}
int y = 0; //连通集个数
for(int i=1;i<8;i++)
if(i==father[i] && light[i])
y++;
if(y == 1)
ans++;
return;
}
light[x] = 0; //第x个数码管不发光
dfs(x+1);
light[x] = 1; //第x个数码管发光
dfs(x+1);
}
int main()
{
dfs(1);
cout << ans;
return 0;
}
成绩统计
题目:
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是
一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分
四舍五入保留整数。
代码:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n,scores;
cin >> n;
double a=0.0,b=0.0;
for(int i=0;i<n;i++)
{
cin >> scores;
if(scores >= 60)
a++;
if(scores >= 85)
b++;
}
cout << round(a/n*100) << "%" << endl;
cout << round(b/n*100) << "%" << endl;
return 0;
}
回文日期
题目:
【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按“yyyymmdd”的格式写
成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上“千年一遇”,顶多算“千年两遇”。给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数 N,表示日期。
【输出格式】
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
【样例输入】
20200202
【样例输出】
20211202
21211212
代码:
#include <iostream>
#include <math.h>
using namespace std;
bool leapYear(int year)
{
if((year%100!=0 && year%4==0) || year%400==0)
return true;
else
return false;
}
bool huiwei(int y,int m,int d)
{
if(y/100 == (d%10)*10+d/10)
{
if(y%100 == (m%10)*10+m/10)
return true;
else
return false;
}
else
return false;
}
int main()
{
int n,year,month,day;
int c=0;
int m[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
cin >> n;
year = n/10000;
month = (n%10000)/100;
day = n%10;
while(1)
{
if(leapYear(year))
m[2] = 29;
else
m[2] = 28;
day++;
if(day > m[month])
{
day = 1;
month++;
}
if(month > 12)
{
month = 1;
year++;
}
if(huiwei(year,month,day) && !c)
{
cout << year*10000+month*100+day << endl;
c++;
}
if(huiwei(year,month,day))
{
if(year/100 == year%100 || month == day)
{
cout << year*10000+month*100+day << endl;
break;
}
}
}
return 0;
}