由于这几天比较忙,只能写一些相对简单的题目,今天来看一题我们学校的校选的题目,难度不大,但是也是非常有一些小技巧的
L1-6 有色图
分数 15
全屏浏览题目
切换布局
作者 JMU_ACM
单位 集美大学
某天何大佬准备在机房中给学弟们讲解图论知识。碰巧何大佬最近刚刚了解了乔治米勒的"7±2"原则——人类短期记忆一般一次只能记住5∼9个事物,即由于人类大脑处理信息的能力有限,它会将复杂信息划分成块和小的单元。这一事实经常被用来作为限制导航菜单选项到7个的论据。
所以,如果一张图包含超过9种颜色,人不能一眼记住有多少种颜色出现,即冲击了视觉又刺激了大脑,一定程度上提高观者的注意度,何大佬将其命名为“有色图”。反之,如果一张图的颜色数量不超过9种,则称之为“无色图”。
于是何大佬再一次仔细的研读了乔治米勒的研究后,更加坚定的相信:“有色图,学弟们会更愿意来听课的。”
何大佬准备了n张演示图论知识的二维形式的图片,对于第i张图片,宽度为ai,高度为bi,表示这张图片的像素为ai×bi,每个像素点用一个数字x表示,其中x表示一种特定的颜色,x值不同表示该像素点的颜色不同。何大佬希望你帮他判断这n张图片是否是有色图,这样他就有更多的时间可以备课。
输入格式
第一行,给出一个整数n(1≤n≤100),表示何大佬准备的图片数量。
随后的若干行包含n张图片的信息,对于第i张图片,在图片信息中的第一行包含两个整数ai,bi(1≤ai,bi≤100),表示该图片的宽度和高度。
接下来的ai行描述图片的像素点的具体颜色,每行包括bi个整数,其中第j行第k列的整数xjk(1≤j≤ai,1≤k≤bi,−1020<xjk<1020),表示该图片中第j行第k列的像素点颜色。
输出格式
共n行,每一行输出一个字符串为YES
或NO
,表示第i张图片是否为有色图。
输入样例
2
4 3
-3 -2 -1
5 4 3
101 12 0
0 -1 2
2 2
1 0
0 1
输出样例
YES
NO
大家在看到这一题的题目的第一反应是不是就是把得到的数据用数组给他存下来,然后再一下一下的去判断是不是有超过九种颜色,其实并不需要,这里就需要用到一个小技巧,因为他其实就是判断在一个矩阵中出现的数字颜色是不是超过九次,所以我们其实只需要再读入的时候就开始判断,我这里用了map<string,int>来判断出现的次数,当然用普通的数组也是可以实现的
map<string,int>color;
还有一点可以节省时间复杂度的,不知道这一题有没有卡这个我没有去试过,再读入二维数组的时候我们只需要用到一个循环,并不需要用到两个循环,因为我们并不需要真正的把这个二维数组储存起来
for(int j = 0;j<a*b;j++){
cin>>temp;
color[temp]++;
}
然后最后在判断这个map的大小有没有超过九次这题就轻松搞定啦!
整体代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
map<string,int>color;
int a,b;
string temp;
for(int i = 0;i<n;i++){
cin>>a>>b;
for(int j = 0;j<a*b;j++){
cin>>temp;
color[temp]++;
}
if(color.size()>9) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
color.clear();
}
}