1.三国游戏
评析:首先我们需要知道计算机是不可能赢我们的,所以可以直接排除我们输出0的情况
#include<bits/stdc++.h>
using namespace std;
long int n,ans,a[505][505];
int main()
{
cin>>n;
for (int i=1;i<n;i++)
{
for (int j=i+1;j<=n;j++)
{
cin>>a[i][j];
a[j][i]=a[i][j];
}
}//按照题目所给出的提示建表,由于是对称的,所以只需a[j][i]=a[i][j];
for (int i=1;i<=n;i++)
{
sort(a[i]+1,a[i]+n+1);//将每一行排序
ans=max(ans,a[i][n-1]);//选出次大数
}
cout<<"1"<<endl;
cout<<ans;
return 0;
}
2.独木桥
评析:关键点是我们需要认识到两个人碰面后各自掉头走其实是等价于两个人碰头后不掉头继续向前走的
#include<bits/stdc++.h>
using namespace std;
int l,n,a[5005],ans1,ans2;
int main()
{
cin>>l;
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
for (int i=1;i<=n;i++)
{
ans1=max(ans1,min(a[i],l+1-a[i]));//最短时间为最小值的最大值
ans2=max(ans2,max(a[i],l+1-a[i]));//最长时间为最大值的最大值
}
cout<<ans1<<" "<<ans2;
}
3.排队接水
评析:这一题思路很简单,问题在于怎么处理编号随着大小一起排序,我的解决方法就是结构体排序
#include<bits/stdc++.h>
using namespace std;
struct paidui
{
int id;//序号
int time;//大小
}a[1005];//建立结构体
long int n,sum;
double avg;
bool cmp(paidui x,paidui y)
{
return x.time<y.time;//这边的大于小于可以决定是从小到大还是从大到小
}//结构体排序中的外加参数
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>a[i].time;
a[i].id=i;//标号
}
sort(a+1,a+n+1,cmp);//结构体按照等待时间长短从小到待排序
for (int i=1;i<n;i++)
{
sum+=i*a[n-i].time;//累加总的等待时间
}
avg=sum*1.0/n;//求平均等待时间
for (int i=1;i<=n;i++)
{
if (i!=n) cout<<a[i].id<<" ";
else cout<<a[i].id<<endl;
}//输出排序后的编号
printf("%.2f",avg);
}
4.合并果子
评析:这一题在知道要用优先队列后就简单了
#include<bits/stdc++.h>
using namespace std;
int n,amount,sum;
priority_queue<int,vector<int>,greater<int> >q;//创立一个优先队列,每次取极小值
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>amount,q.push(amount);//向队列中读入我们果子的数目
while(q.size()>=2)//如果队列中堆数大于等于2,我们就执行这项操作
{
int a=q.top();//把队列中的最小数赋值给a
q.pop();//删掉
int b=q.top(); //把现在队列中的最小数赋值给b
q.pop();//删掉
sum+=a+b;
q.push(a+b);//把a+b重新读入队列中
}
cout<<sum<<endl;
return 0;
}