【NOIP】普及组2010 三国游戏

本文介绍了一个基于贪心算法的问题解决思路。通过选择每个点相邻的最大值,并从中挑选次大的连边点来找到全局最优解。文章包含完整的C++实现代码。

【算法】贪心

【题解】如果看重一对,先选择其中一个点,该点相邻最大的肯定被选走。所以答案就是最大的[所有点的次大连边点]啦。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<cstring>
using namespace std;
const int maxn=510;
int a[maxn][maxn],n,max1,max2,ans;
int main()
{
//    freopen("sanguo.in","r",stdin);
//    freopen("sanguo.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
     {
         for(int j=i+1;j<=n;j++)
          scanf("%d",&a[i][j]),a[j][i]=a[i][j];
     }
/*    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)printf("%d ",a[i][j]);
        printf("\n");
    }*/
    ans=0;
    for(int i=1;i<=n;i++)
     {
         max1=0;max2=0;
         for(int j=1;j<=n;j++)
         if(a[i][j]>max1)max2=max1,max1=a[i][j];
          else if(a[i][j]>max2)max2=a[i][j];
//        printf("i=%d max=%d max2=%d\n",i,max1,max2);
        if(max2>ans)ans=max2;
     }
    printf("1\n%d",ans);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/5766615.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值