day19--报名签到--2.23
习题概述
题目描述
n 位同学(编号从 1 到 n)同时来到体育馆报名签到,领取准考证和参赛资料。为了有序报名,这 n 位同学需要按编号次序(编号为 1 的同学站在最前面)从前往后排成一条直线。然而每一位同学都不喜欢拥挤,对于第 i 位同学,如果有另外一位同学距离他/她的距离小于 ai,那么就会发生冲突。小可可想知道如果要不发生任何冲突的情况下,这 n 位同学排队的队列最短长度是多少。
输入格式
第一行一个整数 n ,表示报名签到的同学人数。
第二行有 n个整数,第 i 个整数 ai 表示第 i 个同学必须与其他同学保持的距离。
输出格式
输出一行,包括一个整数,表示这 n 位同学排队队列的最小长度。
注意:n 位同学要按 1 到 n 的次序从前往后排队。
代码部分
法一
#include<bits/stdc++.h>
using namespace std;
int a[100001];
int main()
{
//数据范围很大,一定要使用long long
long long n,dis=0;//初始化dis为0
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++)//这里循环到n-1,因为最后一个人后面已经没有人了,因此不用算
{
if(a[i]<=a[i+1])//比较大小
{
dis+=a[i+1];//总距离累计
}
else dis+=a[i];
}
cout<<dis;//输出
return 0;
}
法二
#include<bits/stdc++.h>//万能头文件
using namespace std;//命名空间
long long a[100001],n,ans;//定义用long long
int main()//主函数
{
cin>>n;//读入n
for(int i=1;i<=n;i++) cin>>a[i];//读入a[i],a的每一位
for(int i=2;i<=n;i++) ans+=max(a[i-1],a[i]);//循环从2开始,比较
cout<<ans;//输出答案
return 0;//程序结束,返回0
}
心得体会
注意活用数组!
day19--筹备资金--2.23
习题概述
在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。他将在 2018 年 12 月 31 日开始出发,在这之前需要一共筹集 n 元钱。他打算在每个星期一筹集 x 元,星期二筹集 x+k 元,……,星期日筹集 x+6k 元,并连续筹集 52 个星期。其中x,k 为正整数,并且满足1≤x≤100。
现在请你帮忙计算 x,k为多少时,能刚好筹集 n 元。
如果有多个答案,输出 x 尽可能大,k 尽可能小的。注意 k 必须大于 0。
代码表示
#include<bits/stdc++.h>
using namespace std;
long long n;
int main()
{
cin>>n;
n/=52;//每周的平均筹集金额
for(int k=1;k>0;k++)
{
for(int x=100;x>=1;x--)//1≤x≤100
{
if(x*7+k*21==n)
{
cout<<x<<endl<<k;
return 0;
}
}
}
}
心得体会
1.循环问题:
1)外层循环枚举k(k ∈ N+),因为k要尽可能小,所以k从1开始;
2)内层循环枚举x(x ∈ [1,100],且x ∈ N+),因为x要尽可能的大,所以x从100开始;
2.适当的进行数学运算让我们的代码更简单,复杂度更小!n/=52这样算每周的平均筹集金额就好即x*7+k*21==n;
3.注意n可能比较大所以用long long这个数据类型。