炸彈bombpasccpp time1s memory256m
戰爭warpasccpp time1s memory256m總結
突然就考試,做完1,2題就開始浪了。於是就第三題打了個暴力…
用emacs之後**縮排似乎就呵呵了…
高老大有乙個n∗
n 的廣場,被均分成n∗
n 個格仔。其中某些格仔種上了樹。
為了維護世界的和平,為了貫徹和平與發展的原則,老大不得不開始操練部下了。部下們必須站在廣場中某沒種上樹個格仔中,而且乙個格仔內不允許有兩個人站著。同時,為了顯得整齊劃一,部下們要維護乙個方陣的陣型,也就是n*n的廣場內的乙個x∗
y 的矩形(該矩形的長和寬必須與廣場的長和寬平行),每個格仔上都必須有乙個部下。現在老大想知道,一次最多操練多少個部下?
輸入檔名為training.in。
輸入第一行兩個正整數n和m,代表廣場的長和寬。
下接乙個n行m列的字元矩陣,若第i行第j列為『0』則代表該格仔上有一顆樹。
輸出檔名為training.out。
輸出一次最多能夠操練的部下個數。
training.in
2 11
11 training.out
4對於80%的資料,n≤
250 ;
對於100%的資料,n≤
1000
。 這道題目就是極大化子矩形的乙個模板吧,所以還好做吧。
這個題目的母題是usaco中的rectbarn,裡面講的很詳細。
解釋一下我這裡f[
i][j
] 表示的是這個點前面1的個數,那麼你應該就看的懂了吧。。。
#include
#include
#include
using
namespace
std;
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
const
int size = 1000+10;
int n,ans;
int f[size][size];
char ch[size][size];
int minn,cnt;
inline
int read()
int main() */
for(int i=n;i>=1;i--)
for(int j=1;j<=n;j++)
}printf("%d\n",ans);
return
0;}
高老大又在鼓搗炸彈了,這不,啟動了乙個了。英明英勇的老大又在跟他的部下們表演空手光速拆炸彈了。
炸彈上是乙個圓盤,圓盤上順時針寫著n個數。其實這個炸彈就是要求從中選擇若干個連續的數(注意每個數最多只能選一次)加起來,使得這些數字的和最大,然後輸入這個
最大的和,計時就會停止。現在你被老大要求上台表演,時間是1s,任務就交給你了。
輸入檔名為bomb.in。
輸入第一行包含乙個正整數n,表示數字的個數。
第二行包含n個整數,為所給的數字。
輸出檔名為bomb.out。
輸出包含乙個整數,為最大的可以得到的和。
bomb.in
8 2 -4 6 -1 -4 8 -1 3
bomb.out
14對於30%的資料 1≤
n≤200 ;
對於70%的資料 1≤
n≤10000
; 對於100%的資料 1≤
n≤100000
, 答案在longint範圍內。
這個題目可以很明顯的發現就是求最大連續子串行的題目
然後我們可以一般輕鬆的求出在非環上的最大連續子串行,o(
n)出界
然後就是處理此時在環上的情況了。。。
我們將乙個方案分成兩部分,一部分從 1 開始遞增,一部分從 n 開始遞減。
然後用dp就可以求出末端不超過 i 且從 1 或 n 出發的最大連續子串行。
然後就沒有然後了…
#include
#include
#include
#include
using
namespace
std;
typedef
int ll;
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
const
int size = 200000+10;
ll n,ans;
ll a[size],f[size];
inline ll read()
inline ll erfen(ll l,ll r)
int main()
printf("%d\n",ans);
return
0;}
高老大要打團戰了。他要召集n(n是奇數)個人去組織一場戰爭。現在高老大的手下有t個人,每個人都有乙個戰鬥力值和影響力值。當這n個人的影響力值之和超過m的時候,必然會引起巨大的社會動盪。為了愛與和平,老大明智地決定,不引起巨大的社會動盪。同時,英明的老大發現,乙個團隊整體能力等於這n個人的戰鬥力的中位數,中位數越高則戰鬥力越強。現在老大想知道,這n個人的團隊整體能力最大為多少。
輸入檔名為war.in。
輸入第一行為三個正整數n,t,m,意義如上述。
後接t行,每行兩個正整數wi和vi,代表每個人的戰鬥力值和影響力值。
輸出檔名為war.out。
輸出一行乙個整數,代表這n個人的團隊最大的整體能力。無解輸出-1。
war.in
3 5 70
30 25
50 21
20 20
5 18
35 30
war.out
35 選第2、4、5個人,影響力21+18+30=69<=70,同時該團隊的整體能力為最高的35。
對於30%的資料,保證t≤
200 。
對於100%的資料,保證t≤
100000
,n≤20000
每個人的影響力值
≤100000
,m≤2
31−1 .
我當時一看這個題目,然後就開始準備打暴力,不怎麼想去想,然後打完暴力30分,再然後就…沒有然後了…
考後據說就是把每個人按照戰鬥力值進行排序,那麼列舉中位數,對於第 i 個人,我們只需要求出 1→
i−1 中影響力值最小的 n2
個人之和,i+
1→n 中影響力值最大的 n2
個人之和。
若它們之和再加上當前人的影響力值小於等於 m,就可以更新最大值。
在這之後就得要求區間前k大的數的和了。
只要建乙個大根堆,每次比較當前數字與堆頂元素的大小關係,若比堆頂元素大,則不管;若比堆頂元素小,則取出堆頂元素,放入當前數字,然後更新和。
時間複雜度 o(
nlog
n)先紀念我的30分暴力**
#include
#include
#include
using
namespace
std;
const
int maxx = 200+10;
int n,t,m,ans=0;
bool yes;
int a[maxx],b[maxx],num[maxx];
struct people ren[maxx];
bool cmp(const people &x,const people &y)
else
dfs(k+1,sum+ren[i].w);
a[k]=0;b[k]=0;
}}int main()
return
0;}
然後這是ac**
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
inline
int read()
const
int size = 100000+10;
struct node
}node[size];
inline
bool cmp(const node &a,const node &b)
for(int i=1;i<=k;i++)
for(int i=t-k;i>k;i--)
sum1+=top.c;
use[top.num]=true;
q1.pop();
}else use[i]=true;
if(sum1+sum2+node[i].c<=m)
top=q3.top();q3.pop();
sum2-=top.c;q2.push(top);
q2.push(node[i]);
top=q2.top();q2.pop();
sum2+=top.c;q3.push(top);
}puts("-1");
return
0;}
還得繼續想,dp水平才上的去啊,暴力少打點,多想些吧
最後%%%yzy大神%%%即將ak
動態規劃測試test20170518
題意 乙個長度為n的序列 每個元素是 a i,bi 這樣的數對 連續地分成若干組。每組左右邊界是 l 1,r1 l 2,r2 l p,rp 滿足li ri 1 1 li ri l1 1,rp n 分組必須滿足兩個條件 前面組的元素的b值比後面組元素的a值大 令mi 為第i個組內最大的a,所有mi 的...
動態規劃(3)
robberies include include include includeusing namespace std 這題是參考的 自己的能力還是不可以。不過做了這題,再和0 1揹包問題想一想,覺得收穫還是不錯。說將逃跑率當成物品價值 小弟還是要繼續消化這條題的思想。double f 10020...
3動態規劃
此次專題主要講解動態規劃,題目大致分為兩類 一種是遞迴來解決,一種是0 1揹包問題。動態規劃就是把乙個問題分成多個階段來解決,並且每個階段都相互有所聯絡。其遵循最優性原理。1,不論初始狀態和第一步決策是什麼,餘下的決策相對於前一次決策所產生的新狀態,構成乙個最優決策序列。2,最優決策序列的子串行,一...