CSP--四道签到题(面向CSPT1\T2)

CSP——面向T1/T2签到题

知识简介

由于CSP的题目设置,T1/T2两道签到题成为了冲击高分的基础,即使大模拟和后续题目求解受挫,也能保证一定的下限分数。本篇带来四个不同类型的签到题,希望能够给你带来收获。

题目一

蒜头君从现在开始工作,年薪 N 万。他希望在蒜厂附近买一套 6060 平米的房子,现在价格是 200200 万。假设房子价格以每年百分之 K增长,并且蒜头君未来年薪不变,且不吃不喝,不用交税,每年所得 N 万全都积攒起来,问第几年能够买下这套房子?
(第一年年薪 N 万,房价 200 万)

输入输出

输入格式:一行,包含两个正整数 N(10 <= N <= 50)N(10≤N≤50),K(1 <= K <= 20)K(1≤K≤20),中间用单个空格隔开。
输出格式:如果在第 2020 年或者之前就能买下这套房子,则输出一个整数 M,表示最早需要在第 M 年能买下;否则输出"Impossible"。
输入样例:

50 10

输出样例:

8

题目一解题思路

根据题目可以发现在房价的增长过程中,一直是按照一定的速率,可能出现小数,使用double存放即可。由于题目要求的是如果二十年能买下输出时间,如果大于二十年就输出"Impossible",直接暴力遍历到20年即可。
拓展:如果这个题目的"Impossible"条件变为不可能买到房子。则在逐层求解使要注意,一旦房价*增长率>=工资,则说明后续每年的增长价格>工资,再也无法买到房子。

题目一源代码(C++)

#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
    
    
    int price_y=0;
    int increase_p=0;
    scanf("%d %d",&price_y,&increase_p);
    double value=200;
    int cnt=1;
    while(price_y*cnt<value && cnt<=20)
    {
    
    
        cnt++;
        value+=value*increase_p*0.01;
    } 
    if(price_y*cnt>=value)
    {
    
    
        printf("%d",cnt);
    }
    else 
    printf("Impossible");
    return 0;
}

题目二

头君的班级里有 n^2个同学,现在全班同学已经排列成一个 n * n 的方阵,但是老师却临时给出了一组新的列队方案为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁
这里我们用 00 表示男生,用 11 表示女生
现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的
他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵
不需要旋转则输出 00
顺时针旋转 90° 则输出 11
顺时针旋转 180° 则输出 22
顺时针旋转 270° 则输出 33
若不满足以上四种情况则输出 -1−1
若满足多种情况,则输出较小的数字
对于 100%100% 的数据中,1<=n<=20
输出时每行末尾的多余空格,不影响答案正确性

题目二及输入输出

输入:
第一行为一个整数 nn
接下来的 nn 行同学们已经列好的 01方阵;
再接下来的 nn 行表示老师希望的的 01 方阵。
输出:
输出仅有一行,该行只有一个整数,如题所示。
输入样例:

4
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0

输出样例:

1

题目二解题思路

一道关于矩阵的签到题,注意到横纵坐标上限为20,可以直接暴力比较即可。
在进行顺时针旋转时,找到规律进行调整即可。
如果题目提高横纵坐标的上限,可以考虑使用结构体数组存放1的位置,在进行旋转时只需要对结构体数组中的横纵坐标进行相应的转换即可。

题目二源代码(C++)

#include<iostream>
#include<stdio.h>
using namespace std;

const int M=25;
int a[M][M];
int b[M][M];
int c[M][M];
int n=0;

bool check_equal()
{
    
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            {
    
    
                if(a[i][j]!=b[i][j])
                return false;
            }
    return true;
}

void turn_angle()
{
    
    
    for(int i=1;i<=n;i++)
    {
    
    
        int flag=1;
        for(int j=1;j<=n;j++)
        {
    
    
            c[flag++][n-i+1]=a[i][j];
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=c[i][j];
}

int main()
{
    
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&b[i][j]);
    if(check_equal()==true)
    printf("0\n");
    else
    {
    
    
        turn_angle();
        if(check_equal()==true)
        printf("1\n");
        else
        {
    
    
            turn_angle();
            if(check_equal()==true)
            printf("2\n");
            else
            {
    
    
                turn_angle();
                if(check_equal()==true)
                printf("3\n");
                else
                printf("-1\n");
            }
        }
    }
    return 0;
}


题目三

Julius Caesar 曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后 5 位对应的字符来代替,这样就得到了密文。比如字符’A’用’F’来代替。如下是密文和明文中字符的对应关系。
密文A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
明文V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
你的任务是对给定的密文进行解密得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

题目三及输入输出

输入:
一行,给出密文,密文不为空,而且其中的字符数不超过 200。
输出:
输出一行,即密文对应的明文。
输出时每行末尾的多余空格,不影响答案正确性
输入样例:

NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

题目三解题思路

对题意进行分析,从F到Z的直接使用5位前的字符替代即可,A到E则使用V到Z代替即可。为了统一这种差异,可以采取先+26再-5,这种算法计算后,得到的码数都是>0的数,对26取余数即可求得。

题目三源代码(C++)

#include<iostream>
#include<stdio.h>
using namespace std;

const int M=25;
int a[M][M];
int b[M][M];
int c[M][M];
int n=0;

bool check_equal()
{
    
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            {
    
    
                if(a[i][j]!=b[i][j])
                return false;
            }
    return true;
}

void turn_angle()
{
    
    
    for(int i=1;i<=n;i++)
    {
    
    
        int flag=1;
        for(int j=1;j<=n;j++)
        {
    
    
            c[flag++][n-i+1]=a[i][j];
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=c[i][j];
}

int main()
{
    
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&b[i][j]);
    if(check_equal()==true)
    printf("0\n");
    else
    {
    
    
        turn_angle();
        if(check_equal()==true)
        printf("1\n");
        else
        {
    
    
            turn_angle();
            if(check_equal()==true)
            printf("2\n");
            else
            {
    
    
                turn_angle();
                if(check_equal()==true)
                printf("3\n");
                else
                printf("-1\n");
            }
        }
    }
    return 0;
}


题目四

东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃
东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。

题目四及输入输出

输入:
第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
输出:
输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司)
输入样例:

9
2 2 1 1 1 2 2 2 2
6

题目四解题思路

对可能出现的情况进行分析,我们可以发现考察某个元素时可能出现的情况有如下几种:
1、该元素和前面的元素序列是同一个元素,则这个元素可以归到前面的序列中
2、该元素和前面的元素不是同一个元素,则可能要判断共同序列的长度是否更新
在更新的操作时,使用的操作时是尺取法,使用两个指针来标记1段的长度和2段的长度,从而完成更新,具体操作可见源代码。

题目四源代码(C++)

#include<iostream>
#include<stdio.h>
using namespace std;

int value[5];

int main()
{
    
    
    int flag=-1;
    int cin_num=0;
    int each_num=0;
    int last_num=0;
    int maxlength=0;
    scanf("%d",&cin_num);
    for(int i=0;i<cin_num;i++)
    {
    
    
    	scanf("%d",&each_num);
    	if(each_num!=last_num) flag++;
    	if(flag==2)//需要重置状态
		{
    
    
			flag=1;
			value[each_num]=0;
		} 
		value[each_num]++;
		maxlength=max(maxlength,min(value[1],value[2]));
		last_num=each_num;
	}
    printf("%d",2*maxlength);
}

猜你喜欢

转载自blog.csdn.net/qq_43942251/article/details/105878905
T2