6122
这个题思路很容易,就是一直走,走到路程和大于等于7时停止,回到上个加油站加油,加油次数+1,并将这个加油站记录到数组c中即可,将路程和置为这段路最后走的两个加油站之间的距离,直到走完就行。题目中说要求输出具体在哪几个加油站加油,但是最终给的输出实例只输出了加油次数,并没有输出在哪几个加油站加油,不过我还是加上了这段代码。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int d[k+1],c[k+1],num=0,ans=0;
for(int i=1;i<=k+1;i++)
{
cin>>d[i];
c[i]=0; //先将从数组c全部元素初始化为0
}
for(int i=1;i<=k+1;i++)
{
num+=d[i]; //一直走,走过一段路加上这段路的距离
if(num>=7) //当行驶了的路程大于或者等于7时
{
ans++; //加油次数+1
num=d[i]; //置为这段路程最后走的两个加油站之间的距离
c[i]=1; //1表示在第i个加油站加油
}
}
for(int i=1;i<=k+1;i++)
{
if(c[i]==1) //1表示在第i个加油站加油,输出加油站的序号
cout<<i<<" ";
}
cout<<endl<<ans<<endl;
return 0;
}
6121
这个题的思路就跟老师上课讲的活动安排是一样的,具体思路参考老师上课讲的吧。
代码如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int s[101],f[101];
for(int i=1;i<=n;i++)
{
cin>>s[i]>>f[i];
if(s[i]>f[i]) //输入的左端点大于右端点,交换值
swap(s[i],f[i]);
}
for (int i = 1; i <=n - 1; i++) //选择排序,按照右端点从小到大排序
{
for (int j = i + 1; j <=n; j++)
{
if (f[i] > f[j])
{
swap(s[i], s[j]);
swap(f[i], f[j]);
}
}
}
int ans=0;
int curTime=0;
for(int i=1;i<=n;i++)
{
if(curTime<s[i]) //找到区间左端点比上一个计数的区间右端点大的区间
{
ans++;
curTime=f[i]; //将当前找到的区间的右端点赋给curTime
}
}
cout<<ans<<endl;
return 0;
}
6120
这个题思路也比较容易,跟自己原来做过一个打水排队问题差不多,思路就是让服务时间少的顾客先被服务,这样总的等待时间是最少的。
代码如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n],sum=0,num=0;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //先快速排序
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
num+=a[j]; //计算每个顾客等待的时间
sum+=num; //计算总的等待时间
num=0;
}
printf("%.2lf",sum/(double)n);
}