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!