這次應該算是去年放假以後第一次寫**吧,感覺腦子還是有點秀逗的,這次的題目感覺確實都是水題,居然有一題還沒寫出來,好像第四題做的時候沒看到剩下來的70%的資料,以為是對語言70%的資料,再次表示讀題很重要!!!(想起去年的ec真是心痛)。
第一題,暴力模擬,只需要把所有滿足情況的
9 宮格表示出來就好了,然後暴力判斷給出的圖案和幾個滿足條件的
9宮格一樣。
第二題,暴力,使用乙個資料結構(我用的是priority_queue)來模擬整個過程就好了,二分答案,搞定。
第三題,暴力每一層的情況,發現直接就轉化成了乙個完全揹包問題,轉移方程:dp
[v]=
min(
dp[v
],dp
[v−b
[i]]
+a[i
]),複雜度為o(
nmk)
。第四題,(兩個陣列的)正序(乘積和)>亂序》逆序。這樣如果確定了那些位置放對空,哪些位置放對艦,就只有一種排列了。這個時候就可以暴力
16 個位置放了什麼。一共個就是21
6 種可能,然後每一種情況進行判斷就好了。複雜度是o(
nm∗2
nm) 只貼一下第四題的**,感覺第四題被我寫得很爛,寫了兩遍一樣的**。寫完以後想想完全沒有必要的,看來還是要多想想再寫。
#include
using namespace std;
typedef pair pii;
#define for(i,x,y) for(int i = x;i < y;++ i)
#define ifor(i,x,y) for(int i = x;i > y;-- i)
#define mp make_pair
#define fi first
#define se second
const int maxn = 1000;
int n,m,t,s;
int a[4][4],p[maxn],q[maxn],lep,leq;
bool cmp(int a,int b)
bool cmp_pii(pii a,pii b)
void work()
sort(b,b+leb,cmp_pii); sort(c,c+lec,cmp_pii);
int lebp = min(leb,lep),sump = 0;
for(j,0,lebp) sump += b[j].fi*p[j];
if(sump < s) continue;
int lecq = min(lec,leq),sumq = 0;
for(j,0,lecq) sumq += c[j].fi*q[j];
ans = max(ans,sumq);
}if(ans == -1)
if(ans == 0)
printf("%d\n",ans);
bool flag = false;
for(i,0,maxp)
sort(b,b+leb,cmp_pii); sort(c,c+lec,cmp_pii);
int lebp = min(leb,lep),sump = 0;
for(j,0,lebp) sump += b[j].fi*p[j];
if(sump < s) continue;
int lecq = min(lec,leq),sumq = 0;
for(j,0,lecq) sumq += c[j].fi*q[j];
if(ans == sumq)
if(f) }}
if(flag) printf("yes\n");
else
printf("no\n");
return;
}int main()
}
Offer收割 程式設計練習賽1
做了三題,題目都比較暴力。a題 題意 給你乙個三階的幻方,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。現在準備將乙個三階幻方中的一些陣列抹掉 0代替 交給你來進行還原,並且希望她能夠判斷出究竟是不是只有一組解。如果只有一組解,輸出該三階幻方...
Offer收割 程式設計練習賽7
比較容易想到是o n 2 的解決方案,遍歷n種刪除可能,每次遍歷o n 時間求總高度。前者優化比較困難,因而想辦法優化每次遍歷求高度的時間。由前往後遍歷,當刪除第i個時,先前的排版是連續的,從而通過計數器等累加方法可以求得已完整行的總高度presum,以及當前未完整行的w,h。include def...
Offer收割 程式設計練習賽26
題解 按照條件求解出最大的三角形和最小的三角形,然後求重心即可。這裡求解面積有兩種方法 海 式 p p a p b p c 將三角形的每一條邊求解出來,然後進行處理 用有向向量進行計算,如果設a x0,y 0 b x1,y 1 c x2,y 2 三點為三角形三個頂點,a 為有向面積,那麼2a x0 ...