ICPC網路賽 AC Challenge (狀壓)

2021-08-27 00:03:29 字數 1511 閱讀 3919

ac challenge

給出n個任務,每個任務花費乙個單位時間,現在求每個任務完成時,會獲得a[

i]∗t

+b[i

] a[i

]∗t+

b[i]

的價值,但是每個任務都有必須要在之前完成的任務,就是前置任務。

資料範圍:

n<20,

−109i],b

[i]<109

n

<20,

−10

9

i],b

[i

]<109

這題非常容易想歪,因為有前置條件,所以易想到網路流,然而,這個時間非常難弄,所以我們從另一點出發,就是20這個資料,一看就是狀壓的標準形態嘛,所以,我們選擇狀壓。

狀壓要開兩個主要的陣列,dp

[1<<20]

,cnt

[1<<20]

d p[

1<<20]

,cnt

[1

<<20]

.分別儲存的是當前狀態的最大值,當前狀態所能達到的時間。

讓後三個迴圈

for i:1->n //代表的是幾次

for j:0->n //代表的是第幾件物品

for k:0->(1

<1

//所有狀態

判斷能否到達,判斷是否達成前置條件,判斷是否計算過

進行dp選擇

#include 

using

namespace

std;

#define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)

#define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)

#define debug(x) cerr<<#x<<" = "<<(x)<#define mmm(a,b) memset(a,b,sizeof(a))

#define pb push_back

typedef

double db;

typedef

long

long ll;

const

int maxn = (int)40+7;

const

int inf = (int)0x3f3f3f3f;

int a[maxn];

int b[maxn];

int pre[1

<<21];

ll dp[1

<<21];

int cnt[1

<<21];

int main()

}ll res = 0;

rep(i,1,n) }}

}res = max_element(dp,dp+(1

<<20))-dp;

cout

<< dp[res] << endl;

}

ICPC 南京賽區網路賽 A

題目大意就是,給你乙個數n 然後給你乙個公式求s,讓你輸出s n 這個題目不用想,直接用用題目中的公式暴力寫肯定超時 可以先手算簡化一下公式 n 1 n 1 n n 1 n 1 n!n 1 所以可得 s 1 1!n 1 n 1 2!1!3!2!n!n 1 n 1 所以s n n 1 n n 是n的倍...

2018 icpc 南京網路賽

題目 鏈結 a.an olympian math problem 輸出n 1即可 女朋友猜的 includeusing namespace std define ll long long ll fac 103 int main for int i 1 i m i ll ans 0 for int i...

2019南京ICPC網路賽A題

二維偏序,利用二維字首和的思想,乙個矩陣 x1,y1,x2,y2 可以由 0,0,x2,y2 0,0,x1 1,x2 1 0,0,x1 1,y2 0,0,x2,y1 1 得出,所以按x軸排序,用樹狀陣列記錄y軸的 0,y 的值,然後就ok了。此題有乙個nc坑點,就是他讓你計算的乙個點的權值不是這個值...