ACM-week6-贪心算法

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值