很顯然,這是乙個最大欄位和問題,但是要注意的是在算每個小朋友的分數的時候是會爆longlong的,我們注意到小朋友的特徵值和分數是遞增的,手動進行模擬特徵值和分數可以得出:
如果要求的小朋友的分數的上乙個小朋友的特徵值是大於等於零的,那麼往後的時候每乙個小朋友的分數都為他上乙個小朋友的分數加上特徵值。否則的話,這個小朋友的分數為第乙個小朋友的分數加上特徵值。
所以答案要麼是第乙個小朋友的分數,要麼是最後乙個小朋友的分數,我們最後只要對比第乙個小朋友的分數和最後乙個小朋友的分數就行,但是問題來了,因為分數的大小有可能會爆longlong,所以我們在計算的時候會一邊取模一邊計算,如此這般的話就無法比較取模之前的分數和第乙個分數的大小了, 但是我們注意到第乙個分數的大小是不會超過1e9的,所以每當第i個小朋友的分數大於1e9的時候就說明答案是最後乙個的分數。
**:
#include #include #include #include using namespace std;
const int inf=1e6+7;
typedef long long ll;
ll arr[inf];
ll special[inf];
ll score[inf];
ll max(ll a,ll b) //先嘗試不用取餘函式。
int main()
else
themax=max(themax,sum);
special[i]=themax; //特徵值。還不至於爆longlong,
if(special[i-1]>=0) //就是這裡。重點重點!!!!!!!!!
ll temptemp=score[i-1]+special[i-1];
if(flag==0)
else
score[i]=temptemp;
}} if(flag==0||lastflag==0)
printf("%lld\n",score[0]%q);
}else
printf("%lld\n",score[n-1]%q);
}return 0;
}
小朋友的數字(NOIP2013 普及組第三題)
有 n 個小朋友排成一列。每個小朋友手上都有乙個數字,這個數字可正可負。規定每個小朋友的特徵值等於排在他前面 包括他本人 的小朋友中連續若干個 最少有乙個 小朋友手上的數字之和的最大值。作為這些小朋友的老師,你需要給每個小朋友乙個分數,分數是這樣規定的 第乙個小朋友的分數是他的特徵值,其它小朋友的分...
noip2013 小朋友的數字(dp 規律)
我是超連結 無dp暴力 60pts 不行啊這個n 2,我還是用dp吧,f i 表示前i個手上的數 必選i 的最大值 80pts emmm看來是爆longlong了。確實有乙個比longlong更大的,但是我們還是用科學的方法吧 很容易發現特徵值是不降的,那麼也可以發現分數是不降的 如果上一位的特徵值...
NOIP2011複賽普級組 瑞士輪
解題思路 先讀入資料,用快排對所有選手按照實力值排序,然後模擬,每打一場比賽就把贏的和輸的分為兩個有序陣列,再進行歸併,最後按要求輸出即可。程式 const maxn 100000 vara array 0.2 maxn,1.3 of longint b,c array 0.maxn,1.3 of ...