【好题】好题分享

1001-四舍五入_牛客竞赛语法入门班数组模拟、枚举、贪心习题 (nowcoder.com)

题目描述

四舍五入是个好东西。比如你只考了45分,四舍五入后你是50分再四舍五入你就是满分啦!qdgg刚考完拓扑。成绩十分不理想。但老师觉得他每天都很认真的听课很不容易。于是决定给他一个提高成绩的机会:让他的成绩可以在小数点后的任意位置四舍五入(也可以四舍五入为最接近的整数)。
但是这是有限制的。qdgg只能四舍五入t次。请帮助qdgg找到他在不超过t次四舍五入可获得的最高成绩。请注意,他可以选择不使用全部t次机会。此外,他甚至可以选择完全不对成绩进行四舍五入。
在这个问题中,使用经典的舍入规则:将数字四舍五入到第n个数字时,必须先看一下数字n + 1,如果小于5,则第n个数字将保持不变,而所有后续数字替换为0。否则,如果n + 1位数大于或等于5,则位置n处的位数将增加1(如果此位数等于9,这也可能会更改其他一些位数),并且随后的所有位数数字将替换为0。最后,所有尾随的零将被丢弃。
例如,如果将数字1.14舍入到小数点后第一位,则结果为1.1,而如果将1.5舍入到最接近的整数,则结果为2。四舍五入到小数点后第五位的数字1.299996121将得出数字1.3。

输入描述:

输入的第一行包含两个整数n和t表示小数(含小数点)的长度以及四舍五入的次数。

第二行为一个字符串表示qdgg的初始分数。

输出描述:

一行表示qdgg能得到的最高分数(请勿输出尾零)

1012-方块与收纳盒_牛客竞赛语法入门班数组模拟、枚举、贪心习题 (nowcoder.com)

 现在有一个大小n*1的收纳盒,我们手里有无数个大小为1*1和2*1的小方块,我们需要用这些方块填满收纳盒,请问我们有多少种不同的方法填满这个收纳盒

输入描述:

第一行是样例数T
第2到2+T-1行每行有一个整数n(n<=80),描述每个样例中的n。

输出描述:

对于每个样例输出对应的方法数
#include <iostream>
using namespace std;

long long a[90];

int main()
{
    a[0] = 1;
    a[1] = 1;
    int n;
    cin >> n;
    for(int i = 2;i <= 80;i ++)
    {
        a[i] = a[i-1] + a[i-2];
    }
    while(n --)
    {
        int x;
        cin >> x;
        cout << a[x] << endl;
    }
}

时间(time) (nowcoder.com)

题目描述

         Apojacsleam是一个喜欢特殊时刻的人。

        他定义了一个时刻,若电子表显示ab:ba(24小时制),则该时刻为“回文时刻”(可以有前导零)。例如00:00就是回文时刻。

        给定一个时刻,求此时刻的上一个和下一个回文时刻。

J题附加:00:00就是24:00,没有24:00这一时刻

J题附加:输入可能有前导0,输出不含前导0,例如10:1的意思是10:01,而10:10的输出为10:10 

输入描述:

两个正整数,用“:”隔开,表示小时和分钟,保证输入时间合法。

输出描述:

两行,两个时刻(不含前导0),用“:”隔开,表示上一个时刻和下一个时刻
#include <cstdio>

using namespace std;

int main() {
    int a, b, A, B;
    scanf("%d:%d", &a, &b);
    A = a, B = b;
    while (true) {
        b--;       //找之前的时间
        if (b < 0) //回到上个小时
            a--;
        b = (b + 60) % 60; //防止负数
        a = (a + 24) % 24;
        if (a % 10 == b / 10 && b % 10 == a / 10) {//回文
            printf("%d:%d\n", a, b);
            break;
        }
    }
    while (true) {
        B++;         //找之后的时间
        if (B == 60) //去到下个小时
            A++;
        B = (B + 60) % 60;
        A = (A + 24) % 24;
        if (A % 10 == B / 10 && B % 10 == A / 10) {
            printf("%d:%d\n", A, B);
            break;
        }
    }
    return 0;
}

 「水」滔天巨浪 (nowcoder.com)

这个题没有要求输出前导0,如果要输出前导0,可以用%02d(宽度为2,左端补0) 

题目描述

帕秋莉掌握了一种水属性魔法

在此之前,她已经忍了雾之湖上的妖精们很久了

现在,她决定反击!

雾之湖上有n只妖精排成一列,每只妖精的飞行高度严格单调递增,且高度1≤x≤1000

帕秋莉能清除掉列里面一个连续子区间的妖精,当且仅当它们被清理之后,帕秋莉仍然能还原出这个子区间的所有妖精的飞行高度

如,若妖精们飞行高度为1,3,4,5,6,8,那么可以清理飞行高度为4,5的两只妖精,因为清理之后,这两个空位之间的数据是唯一确定的

帕秋莉一次最多选择清除一个连续子区间,请问帕秋莉一次最多能清除多少妖精呢?

输入描述:

第一行一个整数n,表示有n只妖精下一行n个数ai,表示每只妖精飞行高度

输出描述:

输出一行,一个整数表示答案
#include<iostream>
using namespace std;
const int N=1010;
int a[N];
int main()
{
    int n,max1=0,b=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    a[n+1]=1001;
    for(int i=1;i<=n;i++)
    {
        int j=0;
        while(a[i]+1==a[i+1]&&a[i]-a[i-1]==1)//双指针算法  
        {                                    //这里要用while 而不是if
            j++;
            i++;
        }
        max1=max(max1,j);//取最大值
    }
    printf("%d",max1);
    return 0;
}

Problem - 1777A - Codeforces

cf的题就是妙,有的不能按它的字面意思来写

如果这样写,会爆掉 

因为a[i+1]*=a[i]不合适

#include<iostream>
using namespace std;
const long long N=100010;
long long a[N];
int main()

{
	long long t;
	cin>>t;
	while(t--){
		long long n,num=0;
		cin>>n;
		for(long long i=0;i<n;i++)
		{
			cin>>a[i];
		}
		for(long long i=0;i<n-1;i++)
		{
			if(a[i]%2==0&&a[i+1]%2==0||a[i]%2==1&&a[i+1]%2==1)
			{
				num++;
				a[i+1]*=a[i];
			}
		}
		cout<<num<<endl;
	}
}


 正确解法

#include<iostream>
using namespace std;
const long long N=100010;
long long a[N];
int main()

{
	long long t;
	cin>>t;
	while(t--){
		long long n,num=0;
		cin>>n;
		for(long long i=0;i<n;i++)
		{
			cin>>a[i];
		}
		for(long long i=0;i<n-1;i++)
		{
			if(a[i]%2==0&&a[i+1]%2==0||a[i]%2==1&&a[i+1]%2==1)
			{
				num++;
				//a[i+1]*=a[i];
			}
		}
		cout<<num<<endl;
	}
}

Code over!

猜你喜欢

转载自blog.csdn.net/m0_72853403/article/details/129007242