CCF-CSP2 201409

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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值