p1007
怎么说呢,这道题其实有点误导人,就是碰头转面的问题,其实只有碰面的人不说,继续走他们自己的谁也不会发现,毕竟速度是一样的,所以这题的思路就很简单了。
最大值与最小值遍历迭代就行了,(当然特殊情况0可要考虑)下面附上代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,l;
cin>>l>>n;
vector<int> arr(n);
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
sort(arr.begin(),arr.end());
int mins;
int maxs=0;
if(n==0)
{
cout<<"0 0";
}
else
{
for(int i=0;i<n;i++)
{
maxs=max(max(abs(arr[i]-l-1),arr[i]),maxs);
}
mins=min(abs(arr[0]-l-1),arr[0]);
for(int i=1;i<n;i++)
{
mins=max(min(abs(arr[i]-l-1),arr[i]),mins);
}
cout<<mins<<" "<<maxs;
}
return 0;
}
p1223
这,,结构体排个序,求等待时间除最后一项的和,然后除总人数就行了,再输出换行,没啥含金量。
#include<bits/stdc++.h>
using namespace std;
class person
{
public:
int number;
int time;
double waitingtime=0;
};
bool cmp(person a,person b)
{
return a.time<b.time;
}
int main()
{
int n;
cin>>n;
vector<person> arr(n);
for(int i=0;i<n;i++)
{
arr[i].number=i;
cin>>arr[i].time;
}
sort(arr.begin(),arr.end(),cmp);
double sum=0;
for(int i=0;i<n;i++)
{
cout<<arr[i].number+1<<" ";
if(i>0)
{
for(int k=0;k<i;k++)
{
arr[i].waitingtime+=arr[k].time;
}
}
sum+=arr[i].waitingtime;
}
cout<<endl;
printf("%.2f",sum/n);
return 0;
}
p1803
这是贪心最经典的例题捏,找结束时间最少的,然后对比开头时间是不是前一个的结束时间就行了捏。
#include<bits/stdc++.h>
using namespace std;
class times
{
public:
int mbegin;
int mend;
};
bool cmp(times a,times b)
{
return a.mend<b.mend;
}
int main()
{
int n;
cin>>n;
vector<times> arr(n);
for(int i=0;i<n;i++)
{
cin>>arr[i].mbegin>>arr[i].mend;
}
sort(arr.begin(),arr.end(),cmp);
int now=0;
int num=0;//计数
for(int i=0;i<n;i++)
{
if(arr[i].mbegin>=now)
{
now=arr[i].mend;
num++;
}
}
cout<<num;
return 0;
}
p1031
这题,,其实从左到右直接拿牌,然后特判倒数第二项就行了
#include<bits/stdc++.h>
#include<numeric>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> arr(n);
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
int sum=accumulate(arr.begin(),arr.end(),0);
int average=sum/n;
for(int i=0;i<n;i++)
{
arr[i]-=average;
}
int num=0;
for(int i=0;i<n-1;i++)
{
if(arr[i]!=0)
{
int a=arr[i];
arr[i+1]+=arr[i];
arr[i]=0;
num++;
}
else
{
continue;
}
}
if(arr[n-2]==0)
{
cout<<num;
}
else
{
cout<<num+1;
}
return 0;
}
下面是选做题捏
p1094
这道题也很简单捏,直接定义两个下标一头一尾,
和大于给定值,尾减一,计数,单独一组
和小于等于给定值,首位各减一,计数,成为一组
#include<bits/stdc++.h>
using namespace std;
int main()
{
int maxs,n;
cin>>maxs>>n;
vector<int> arr(n);
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
sort(arr.begin(),arr.end());
int begin =0,end=n-1;
int num=0;
while(begin<=end)
{
if(begin==end)
{
num++;
end--;
}
else
{
if(arr[begin]+arr[end]>maxs)
{
num++;
end--;
}
else
{
num++;
begin++;
end--;
}
}
}
cout<<num;
return 0;
}