CCF 2-1
问题描述
试题编号: | 201409-1 |
---|---|
试题名称: | 相邻数对 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。输入格式 输入的第一行包含一个整数n,表示给定整数的个数。 第二行包含所给定的n个整数。输出格式 输出一个整数,表示值正好相差1的数对的个数。样例输入6 10 2 6 3 7 8样例输出3样例说明 值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。评测用例规模与约定 1<=n<=1000,给定的整数为不超过10000的非负整数。 |
算法分析
先排序,看下一个数和当前数的差是否为1,如果是,则num++
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[1010];
int main(){
cin>>n;
for(int i = 0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int num = 0;
for(int i = 0;i<n-1;i++){
if((a[i+1]-a[i])==1){
num++;
}
}
cout<<num;
return 0;
}
CCF 2-2
问题描述
试题编号: | 201409-2 |
---|---|
试题名称: | 画图 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。 下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mo06anNJ-1637291592696)(images/%E7%AE%97%E6%B3%95%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/RequireFile-16372839166971.do)] 给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。输入格式 输入的第一行包含一个整数n,表示要画的矩形的个数。 接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。输出格式 输出一个整数,表示有多少个单位的面积被涂上颜色。样例输入2 1 1 4 4 2 3 6 5样例输出15评测用例规模与约定 1<=n<=100,0<=横坐标、纵坐标<=100。 |
算法分析
首先想到写一个struct,记录每个矩形的坐标,然后用矩形数组存储所有的矩形
接着,解题:
思路一
考虑,每次遇到一个矩形,就加上矩形的面积,然后和之前所有的矩形比较,计算重复的面积,再减去这个面积,但是有个问题,如果有个矩形,和之前的两个矩形重复了相同的位置,那么这块区域会被减去两次,但是其实应该只能减去一次。所以下面这个解题错误。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct reg{
int x1,x2,y1,y2;
}reg[1010];
int n;
int chongfu(int i,int j){
int num = 0;
if(reg[i].x1>reg[j].x2 || reg[i].x2<reg[j].x1 || reg[i].y1>reg[j].y2 || reg[i].y2<reg[j].y1){
return 0;
}
// x2在中间,y2在中间
else if(reg[i].x1<reg[j].x2 && reg[i].x2>reg[j].x2 && reg[i].y1<reg[j].y2 && reg[i].y2>reg[j].y2){
return (reg[j].x2 - reg[i].x1)*(reg[j].y2 - reg[i].y1);
}
// X1在中间,y2在中间
else if(reg[i].x1<reg[j].x1 && reg[i].x2>reg[j].x1 && reg[i].y1<reg[j].y2 && reg[i].y2>reg[j].y2){
return (reg[i].x2 - reg[j].x1)*(reg[j].y2 - reg[i].y1);
}
// x2在中间,y1在中间
else if(reg[i].x1<reg[j].x2 && reg[i].x2>reg[j].x2 && reg[i].y1<reg[j].y1 && reg[i].y2>reg[j].y1){
return (reg[j].x2 - reg[i].x1)*(reg[i].y2 - reg[j].y1);
}
else {
return (reg[j].x2 - reg[i].x1)*(reg[j].y2 - reg[i].y1);
}
}
int main(){
cin>>n;
for(int i = 0;i<n;i++){
cin>>reg[i].x1>>reg[i].y1>>reg[i].x2>>reg[i].y2;
}
int res = 0;
for(int i = 0;i<n;i++){
res += (reg[i].x2 - reg[i].x1)*(reg[i].y2 - reg[i].y1);
for(int j = 0;j<i;j++){
res -=chongfu(i,j);
}
}
cout<<res<<endl;
system("pause");
return 0;
}
思路二
直接采用暴力解法,对于每个小方块,遍历查找它是否在某个矩形内,是就结束遍历,否则继续判断。成功
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct reg{
int x1,x2,y1,y2;
}reg[1010];
int n;
bool yes(int k,int i,int j){
if(i>=reg[k].x1 && i<reg[k].x2 && j>=reg[k].y1 && j<reg[k].y2){
return true;
}
else
return false;
}
int main(){
cin>>n;
for(int i = 0;i<n;i++){
cin>>reg[i].x1>>reg[i].y1>>reg[i].x2>>reg[i].y2;
}
int res = 0;
for(int i = 0 ;i<=100;i++){
for(int j = 0;j<=100;j++){
for(int k = 0;k<n;k++){
if(yes(k,i,j)){
res++;
break;
}
}
}
}
cout<<res<<endl;
system("pause");
return 0;
}
CCF 2-3
问题描述
试题编号: | 201409-3 |
---|---|
试题名称: | 字符串匹配 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。输入格式 输入的第一行包含一个字符串S,由大小写英文字母组成。 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。 第三行包含一个整数n,表示给出的文字的行数。 接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。输出格式 输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。样例输入Hello 1 5 HelloWorld HiHiHelloHiHi GrepIsAGreatTool HELLO HELLOisNOTHello样例输出HelloWorld HiHiHelloHiHi HELLOisNOTHello样例说明 在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。评测用例规模与约定 1<=n<=100,每个字符串的长度不超过100。 |
算法分析
暴力查找字符串在所有字符串中的位置——写一个函数find,返回是否存在
涉及大小写敏感——写一个函数lower,用于大小写转换
注意:
- 在不敏感的情况下,输出的结果仍然是存在大小写的,不能将字符串修改为小写,然后输出时全是小写。所有,我们采用比较的时候,用小写的比较,原字符串不变。
- 字符串有个函数find,longstr.find(shortstr) 返回出现的位置,如果返回-1则不存在。这题可以直接用这个函数,不用自己写
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string str;
int mingan;
int n;
string obj[110];
string lower(string str){
string res;
for(int j = 0;j<str.length();j++){
res += tolower(str[j]);
}
return res;
}
bool find(string str,string obj){
for(int j = 0;j<obj.length()-str.length()+1;j++){
int k;
for(k = 0;k<str.length();k++){
if(obj[j+k]!=str[k]){
break;
}
}
if(k ==str.length()){
return true;
}
}
return false;
}
int main(){
// 输入
cin>>str;
cin>>mingan;
cin>>n;
for(int i = 0;i<n;i++){
cin>>obj[i];
}
// 计算
if(mingan){
for(int i = 0;i<n;i++){
if(find(str,obj[i])){
cout<<obj[i]<<endl;
}
}
}
else{
for(int i = 0;i<n;i++){
if(find(lower(str),lower(obj[i]))){
cout<<obj[i]<<endl;
}
}
}
return 0;
}