程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU4655題意+分析

HDU4655題意+分析

編輯:C++入門知識

哎這題有點意思。。

一開始腫麼看都不理解題意,發現好多ACM題都這樣,好多英文意思不能完全理解,只得照樣例猜啦,猜不出來?? 那就靠神隊友解釋了,囧。

 

就是排列,塗色使結果最大化。

反正別人的博客把這題的題意解釋的很清楚了,我這只小牛就把自己的拙思路稍提一下。

 

也許做題多了馬上就能感覺出這題當 a1,an,a2,an-1這樣排列順序效果會最大化,囧。

關鍵是代碼實現的過程也很坎坷,自己一開始以為前面的減少的部分可能會與後面減少的部分有沖突,其實不然,還是自己沒深入分析,,,

那這樣就用總的情況減掉會有“沖突”的情況就行了。

除法取模,根本木有。。

要不就求逆元,可實際上不用,遞推一下就OK了。

還有又順便復習了一下取模過程中可能出現的溢出情況。。

 

#include <cstdio>   
#include <cstring>   
#include <algorithm>   
#include <vector>   
using namespace std;  
//除法取模顯然有錯誤啊,都可能出來0了。。。   
typedef __int64 LL;  
LL a[1000005];  
LL b[1000005];  
LL sum1[1000005];  
LL sum2[1000005];  
LL min(LL a,LL b)  
{  
    if(a>b) return b;  
    else return a;  
}  
const int maxn=1000000007;  
int main()  
{  
    int case_num;  
    scanf("%d",&case_num);  
    while(case_num--)  
    {  
        int n;  
        scanf("%d",&n);  
        for(int i=1;i<=n;i++)  
            scanf("%I64d",&a[i]);  
        sort(a+1,a+1+n);  
        int temp1=1,temp2=n;  
        for(int i=1;i<=n;i+=2)  
            b[i]=a[temp1++];  
        for(int i=2;i<=n;i+=2)  
            b[i]=a[temp2--];  
        sum1[0]=1;  
        sum1[1]=b[1];  
        sum2[n]=b[n];  
        sum2[n+1]=1;  
        for(int i=2;i<=n;i++)  
        {  
            sum1[i]=sum1[i-1]*b[i]%maxn;  
        }  
        for(int i=n-1;i>=1;i--)  
        {  
            sum2[i]=sum2[i+1]*b[i]%maxn;  
        }  
        long long ans=(sum1[n]%maxn)*(n%maxn)%maxn;  
        long long temp=0;  
        for(int i=2;i<=n;i++)  
        {  
            temp=(temp%maxn+(((min(b[i],b[i-1])*sum1[i-2])%maxn)*(sum2[i+1]%maxn))%maxn)%maxn;  
        }  
        ans=(ans-temp+maxn)%maxn;  
        printf("%lld\n",ans);  
    }  
    return 0;  
}  

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
//除法取模顯然有錯誤啊,都可能出來0了。。。
typedef __int64 LL;
LL a[1000005];
LL b[1000005];
LL sum1[1000005];
LL sum2[1000005];
LL min(LL a,LL b)
{
    if(a>b) return b;
    else return a;
}
const int maxn=1000000007;
int main()
{
    int case_num;
    scanf("%d",&case_num);
    while(case_num--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%I64d",&a[i]);
        sort(a+1,a+1+n);
        int temp1=1,temp2=n;
        for(int i=1;i<=n;i+=2)
            b[i]=a[temp1++];
        for(int i=2;i<=n;i+=2)
            b[i]=a[temp2--];
        sum1[0]=1;
        sum1[1]=b[1];
        sum2[n]=b[n];
        sum2[n+1]=1;
        for(int i=2;i<=n;i++)
        {
            sum1[i]=sum1[i-1]*b[i]%maxn;
        }
        for(int i=n-1;i>=1;i--)
        {
            sum2[i]=sum2[i+1]*b[i]%maxn;
        }
        long long ans=(sum1[n]%maxn)*(n%maxn)%maxn;
        long long temp=0;
        for(int i=2;i<=n;i++)
        {
            temp=(temp%maxn+(((min(b[i],b[i-1])*sum1[i-2])%maxn)*(sum2[i+1]%maxn))%maxn)%maxn;
        }
        ans=(ans-temp+maxn)%maxn;
        printf("%lld\n",ans);
    }
    return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved