2017 百度之星 程式設計大賽 資格賽

2021-08-07 07:46:14 字數 3175 閱讀 2760

思路:比賽的時候也一直以為是計算幾何問題,所以就沒想,賽後看了看大佬們的部落格發現思路還是挺簡單的,就是對度度熊夥伴進行建圖,有邊的條件是所有所有村莊位於這天邊的一側,然後對這個圖跑乙個最小環

之前一直不理解叉積,做了幾道題之後好多了

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

#define pb push_back

#define mk make_pair

#define mst(a, b) memset(a, b, sizeof a)

#define rep(i, x, n) for(int i = x; i <= n; ++i)

const int mod = 1e9 + 7;

const int qq = 500 + 10;

const int inf = 1e9 + 10;

struct point

point(int _x, int _y): x(_x), y(_y){}

point operator - (const point &w) const

int operator ^ (const point &w) const

}a[qq], b[qq];

int n, m;

int xproduct(point p, point a, point b)

int dis[qq][qq];

int main()

scanf("%d", &m);

for(int i = 1; i <= m; ++i)

for(int i = 1; i <= m; ++i)

}if(ok) dis[i][j] = 1;

}} for(int k = 1; k <= m; ++k) }}

} int ans = inf;

for(int i = 1; i <= m; ++i)

if(ans == inf) else

} return 0;

}

思路:觀察發現a[i], b[i]以及m的範圍較小考慮對a[i], b[i]做揹包,dp[i][j]表示血量為i防禦力為j的怪物最少需要幾次可以殺掉

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll __int64

#define pb push_back

#define mk make_pair

#define mst(a, b) memset(a, b, sizeof a)

#define rep(i, x, n) for(int i = x; i <= n; ++i)

const int mod = 1e9 + 7;

const int qq = 1e5 + 10;

const ll inf = 1e18;

ll a[100005], b[100005];

ll k[1005], p[1005];

ll dp[1005][11];

int n, m;

void init()

}}int main()

for(int i = 1; i <= m; ++i)

for(int i = 0; i < 11; ++i)

for(int i = 1; i <= maxblood; ++i) else

}// printf("%lld\n", dp[i][j]);}}

bool f = true;

ll ans = 0;

for(int i = 1; i <= n; ++i)

if(!f) else

}return 0;

}

參考了這位聚聚:black_cat

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

#define pb push_back

#define mk make_pair

#define mst(a, b) memset(a, b, sizeof a)

#define rep(i, x, n) for(int i = x; i <= n; ++i)

const int mod = 1e9 + 7;

const int qq = 1e3 + 10;

const int inf = 1e9 + 10;

int a[qq], b[qq];

int dp[105][qq], sum[105][qq];

vectorvt;

int main()

for(int i = 0; i < 105; ++i)

for(int i = n; i >= 1; --i)

for(int i = 1; i <= n; ++i) else if(dp[i][j] == dp[i - 1][j - a[i]] + b[i]) }}

printf("case #%d:\n", ++cas);

if(dp[b] == 0)

int v = b, tot = 0;

for(int i = n; i >= 1; --i)

}printf("%d %d\n", dp[n][b], tot);

for(int i = 0; i < (int)vt.size(); ++i)

}return 0;

}

2017 百度之星 程式設計大賽 資格賽

度度熊為了拯救可愛的公主,於是與 大魔王戰鬥起來。大魔王的麾下有n個怪獸,每個怪獸有a i 的生命值,以及b i 的防禦力。度度熊一共擁有m種攻擊方式,第i種攻擊方式,需要消耗k i 的晶石,造成p i 點傷害。當然,如果度度熊使用第i個技能打在第j個怪獸上面的話,會使得第j個怪獸的生命值減少p i...

2023年百度之星程式設計大賽 資格賽

主要是卡了一下 接下來2題還在做 都有思路 考慮全然即可了 include include using namespace std int main if k 1 m v m v k m int sum 0 while m n m 0 if m 0 m n sum 1 printf d n sum ...

百度之星資格賽

1001 給你1 n這n個數字,公升序排列,接下來按照陣列a進行位置變換,a i 代表第i個數字會變到a i 位置上,a中的數字也是從1 n。現在問有多少個不同的陣列能滿足做一次變換和做三次變換結果相同。我們可以這樣分析,x y是唯一的到y的途徑,假設x y為第一次變換,因此在第三次變換的時候任然為...