2017"百度之星"程序设计大赛

来源:互联网 发布:电话软件哪个好 编辑:程序博客网 时间:2024/06/05 23:00

1001

思路:比赛的时候也一直以为是计算几何问题,所以就没想,赛后看了看大佬们的博客发现思路还是挺简单的,就是对度度熊伙伴进行建图,有边的条件是所有所有村庄位于这天边的一侧,然后对这个图跑一个最小环

之前一直不理解叉积,做了几道题之后好多了

#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <ctime>#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <utility>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 {int x, y;Point(){}Point(int _x, int _y): x(_x), y(_y){}Point operator - (const Point &w) const {return Point(x - w.x, y - w.y);}int operator ^ (const Point &w) const {return x * w.y - y * w.x;}}a[qq], b[qq];int n, m;int Xproduct(Point p, Point a, Point b) {return (a - p) ^ (b - p);}int dis[qq][qq];int main(){while(scanf("%d", &n) != EOF) {for(int i = 1; i <= n; ++i) {scanf("%d%d", &b[i].x, &b[i].y);}scanf("%d", &m);for(int i = 1; i <= m; ++i) {scanf("%d%d", &a[i].x, &a[i].y);}for(int i = 1; i <= m; ++i) {for(int j = 1; j <= m; ++j) {dis[i][j] = -1;if(i == j)continue;bool ok = true;for(int k = 1; k <= n; ++k) {if(Xproduct(a[i], b[k], a[j]) > 0) {ok = false;break;}}if(ok)dis[i][j] = 1;}}for(int k = 1; k <= m; ++k) {for(int i = 1; i <= m; ++i) {if(dis[i][k] == -1)continue;for(int j = 1; j <= m; ++j) {if(dis[k][j] == -1)continue;if(dis[i][j] == -1 || dis[i][k] + dis[k][j] < dis[i][j]) {dis[i][j] = dis[i][k] + dis[k][j]; }}}}int ans = INF;for(int i = 1; i <= m; ++i) {if(dis[i][i] == -1)continue;ans = min(ans, dis[i][i]);}if(ans == INF) {puts("ToT");} else {printf("%d\n", m - ans);}}return 0;}



1003

思路:观察发现a[i], b[i]以及m的范围较小考虑对a[i], b[i]做背包,dp[i][j]表示血量为i防御力为j的怪物最少需要几次可以杀掉

#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <ctime>#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <utility>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() {    for(int i = 0; i <= 1004; ++i) {        for(int j = 0; j < 11; ++j) {            dp[i][j] = INF;        }    }}int main(){    while(scanf("%d%d", &n, &m) != EOF) {        Init();        LL maxBlood = 0;        for(int i = 1; i <= n; ++i) {            scanf("%I64d%I64d", a + i, b + i);            maxBlood = max(maxBlood, a[i]);        }        for(int i = 1; i <= m; ++i) {            scanf("%I64d%I64d", k + i, p + i);        }        for(int i = 0; i < 11; ++i) {            dp[0][i] = 0;        }        for(int i = 1; i <= maxBlood; ++i) {            for(int j = 0; j < 11; ++j) {                for(int z = 1; z <= m; ++z) {                    int hurt = p[z] - j;                    if(hurt <= 0)    continue;                    if(i - hurt < 0) {                        dp[i][j] = min(dp[i][j], dp[0][j] + k[z]);                    } else {                        dp[i][j] = min(dp[i][j], dp[i - hurt][j] + k[z]);                    }                }//                printf("%lld\n", dp[i][j]);            }        }        bool f = true;        LL ans = 0;        for(int i = 1; i <= n; ++i) {            if(dp[a[i]][b[i]] == INF)    f = false;            else    ans += dp[a[i]][b[i]];        }        if(!f) {            puts("-1");        } else {            printf("%I64d\n", ans);        }    }    return 0;}



1004

参考了这位聚聚:black_cat

#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <ctime>#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <utility>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];vector<int> vt;int main(){    int t;    scanf("%d", &t);    int Cas = 0;    while(t--) {        int B, n;    scanf("%d%d", &B, &n);        mst(sum, 0x3f3f3f3f);        mst(dp, 0);        vt.clear();        for(int i = 0; i < qq; ++i) {            sum[0][i] = 0;        }        for(int i = 0; i < 105; ++i) {            sum[i][0] = 0;        }        for(int i = n; i >= 1; --i) {            scanf("%d%d", b + i, a + i);        }         for(int i = 1; i <= n; ++i) {//            scanf("%d%d", b + i, a + i);            for(int j = B; j >= 0; --j) {                dp[i][j] = dp[i - 1][j];                sum[i][j] = sum[i - 1][j];                if(j - a[i] < 0)    continue;                if(dp[i][j] < dp[i - 1][j - a[i]] + b[i]) {                    dp[i][j] = dp[i - 1][j - a[i]] + b[i];                    sum[i][j] = sum[i - 1][j - a[i]] + n + 1 - i;                } else if(dp[i][j] == dp[i - 1][j - a[i]] + b[i]) {                    sum[i][j] = min(sum[i][j], sum[i - 1][j - a[i]] + n + 1 - i);                }            }        }        printf("Case #%d:\n", ++Cas);        if(dp[B] == 0) {            puts("0 0");            continue;        }        int V = B, tot = 0;        for(int i = n; i >= 1; --i) {            if(dp[i][V] == dp[i - 1][V - a[i]] + b[i] && sum[i][V] == sum[i - 1][V - a[i]] + n + 1 - i) {                tot += a[i];                vt.pb(n + 1 - i);                V -= a[i];            }        }        printf("%d %d\n", dp[n][B], tot);        for(int i = 0; i < (int)vt.size(); ++i) {            printf("%d%c", vt[i], i == (int)vt.size() - 1 ? '\n' : ' ');        }    }    return 0;}


原创粉丝点击