返回顶部

AtCoder Beginner Contest 173 D - Chat in a Circle (贪心)

  • 题意:有一个空环和\(n\)个点,每次可以选择一个点放在空环上,并且获得周围两个点中最小的那个的权值,问能获得的最大的权值是多少?

  • 题解:我们每次都优先放最大的进去,注意每次放的时候都要将这个点放在当前能去得到的最大权值的周围,这样的话,每个最大值我们都能取两次,所以我们只要加一个最大的权值,然后剩下的权值两次两次的加即可.

  • 代码:

    int n;
    ll a[N];
     
    bool cmp(ll a,ll b){
    	return a>b;
    }
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
      	cin>>n;
      	 for(int i=1;i<=n;++i){
      	 	cin>>a[i];
      	 }
    
      	 sort(a+1,a+1+n,cmp);
    
      	 ll ans=a[1];
      	 int cnt=1;
      	 for(int i=2;i<=n;i++){
      	 	cnt+=2;
      	 	if(cnt<=n-1){
      	 		ans+=2*a[i];
      	 	}
      	 	else{
      	 		if(cnt==n){
      	 			ans+=a[i];
      	 		}
      	 		break;
      	 	}
      	 }
    
      	 cout<<ans<<endl;
    
        return 0;
    }
    
posted @ 2020-07-07 12:13  _Kolibri  阅读(253)  评论(0)    收藏  举报