Wannafly Union #5(c.dp,d.dijkstra)

原题链接:https://vjudge.net/contest/148523#overview

B - Cow Multiplication

题目

Paste_Image.png

分析

新定义一种乘法规则,然后给你两个数让你算。用字符串读入然后直接模拟过程就好。

ac代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
using namespace std;
string a, b;
int main(){
    cin >> a >> b;
    int ans = 0;
    for(int i = 0; i < a.size(); ++i){
        for(int j = 0; j < b.size(); ++j){
            ans += ((a[i] - '0') * (b[j] - '0'));
        }
    }
    cout << ans << endl;
    return 0;
} 

C - Treats for the Cows

题目

Paste_Image.png
Paste_Image.png

分析

给你一组数,只能从两边取,每次取得到的钱为数的value * (第几次的次数),然后让你求最大能得到多少钱。一开始想贪心,但并没有想到好的贪法,只能老老实实的动态规划做喽。
开一个(long long)n*n的数组记录dp状态。
dp[i][j] = max(dp[i][j], dp[i - 1][j] + (n - (j - i + 1)) * a[i - 1]);
dp[i][j] = max(dp[i][j], dp[i][j + 1] + (n - (j - i + 1)) * a[j + 1]);

ac代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#define inf 1e17
typedef long long ull; 
using namespace std;
const int maxn = 2e3 + 5;
int a[maxn], n;
ull dp[maxn][maxn];
void init(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
        scanf("%d", a + i);
    }
}
void solve(){
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i < n; ++i){
        for(int j = n - 1; j >= i; --j){
            if(i > 0){
                dp[i][j] = max(dp[i][j], dp[i - 1][j] + (n - (j - i + 1)) * a[i - 1]);
            }
            if(j < n - 1){
                dp[i][j] = max(dp[i][j], dp[i][j + 1] + (n - (j - i + 1)) * a[j + 1]);
            }
        }
    }
    ull ans = 0;
    /*for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j){
            printf("%lld ", dp[i][j]);
        }
        cout << endl;
    }*/
    for(int i = 0; i < n; ++i){
        ans = max(ans, dp[i][i] + a[i] * n);
    }
    printf("%lld", ans);
}
int main(){
    init();
    solve();
    return 0;
}

D - Silver Cow Party

题目

Paste_Image.png
Paste_Image.png

分析

给一个有向图,指定一个点,让求所有点到该点的最短路再回去的最短路花费的和的最大值。
一开始我直接floyd-warshall跑t了,改成两边dijkstra就好了,一边正的,一边反的,然后遍历求解。
这个题写的时候有点急,代码写的好丑。

ac代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
typedef long long ull; 
using namespace std;
const int inf = 1e9 + 7;
const int maxn = 1e3 + 5;
const int maxm = 1e5 + 5;
int road[maxn][maxn], n, m, x;
int d1[maxn], d2[maxn];
bool used[maxn];
void solve(){
    scanf("%d%d%d", &n, &m, &x);
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= n; ++j){
            road[i][j] = inf;
            if(i == j) road[i][j] = 0;
        }
    }
    for(int i = 0; i < m; ++i){
        int t1, t2, t3;
        scanf("%d%d%d", &t1, &t2, &t3);
        road[t1][t2] = t3;
    }
/*  for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= n; ++j){
            printf("%11d", road[i][j]);
        }
        printf("\n");
    }*/
    fill(d1 + 1, d1 + n + 1, inf);
    fill(d2 + 1, d2 + n + 1, inf);
    memset(used, 0, sizeof(used));
    d1[x] = 0;
    while(1){
        int v = -1;
        for(int u = 1; u <= n; ++u){
            if(!used[u] && (v == -1 || d1[u] < d1[v])) v = u;
        } 
        if(v == -1) break;
        used[v] = 1;
        for(int u = 1; u <= n; ++u){
            //printf("%d: %d\n", u, d1[u]);
            d1[u] = min(d1[u], d1[v] + road[v][u]);
            //printf("%d: %d\n", u, d1[u]);
        }
    }
    memset(used, 0, sizeof(used));
    d2[x] = 0;
    while(1){
        int v = -1;
        for(int u = 1; u <= n; ++u){
            if(!used[u] && (v == -1 || d2[u] < d2[v])) v = u;
        } 
        if(v == -1) break;
        used[v] = 1;
        for(int u = 1; u <= n; ++u){
            d2[u] = min(d2[u], d2[v] + road[u][v]);
        }
    }
    
/*  for(int i = 1; i <= n; ++i){
        printf("%d %d\n", d1[i], d2[i]);
    }*/
    
    
    
    int ans = 0;
    for(int i = 1; i <= n; ++i){
        ans = max(ans, d1[i] + d2[i]);
    }
    cout << ans << endl;
}
int main(){
    solve();
    return 0; 
}

E - The Moronic Cowmpouter

题目

Paste_Image.png

分析

把一个树转换成-2进制,刚看到题一脸懵逼,后来找找就发现可以找规律,用一个num[]数组去记录位数,
1 = 1
2 = -2 + 4
4 = 4
...
-1 = 1 - 2
-2 = -2
-4 = 4 - 8
...
然后num数组并不一定是个都是1和0的数组,需要进位,进位的标准是
if(num[i] > 1)
则num[i] -= 2; ++num[i+1]; ++num[i+2];
完美ac。

ac代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
typedef long long ull; 
using namespace std;
int n;
int num[60];
void print_ans(){
    //cout << " 1" << endl;
    for(int i = 0; i < 60; ++i){
        while(num[i] > 1){
            num[i] -= 2;
            ++num[i + 1];
            ++num[i + 2];
        }
    }
    int text = 1;
    for(int i = 60 - 1; i >= 0; --i){
        if(!text){
            printf("%d", num[i]);
        }
        else{
            if(num[i] != 0){
                text = 0;
                printf("%d", num[i]);
            }
        }
    }
}
int main(){
    cin >> n;
    if(n == 0){
        printf("0");
    }
    else if(n >= 0){
        memset(num, 0, sizeof(num));
        int i = 0;
        while(n != 0){
            if(n % 2 != 0){
                if(i % 2 == 0){
                    ++num[i];
                }
                else {
                    ++num[i];
                    ++num[i + 1];
                }
            }
            n /= 2;
            ++i;
        }
        print_ans();
    }
    else{
        memset(num, 0, sizeof(num));
        int i = 0;
        while(n != 0){
            if(n % 2 != 0){
                if(i % 2 != 0){
                    ++num[i];
                }
                else {
                    ++num[i];
                    ++num[i + 1];
                }
            }
            n /= 2;
            ++i;
        }
        print_ans();
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,747评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,654评论 18 399
  • C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的 算法 题目:...
    Poison_19ce阅读 1,144评论 0 0
  • (欢迎转载,但请注明出处并附带链接)算法好久没复习了,今天看见一妹子在办公室刷Leetcode,顿时我也来了兴趣,...
    Nick_Zuo阅读 665评论 0 3
  • 台北:初见倾心 D1 其实严格意义上讲,这不算是第一天。傍晚六点从宝安机场登机,两个多小时后到达台北桃园机场。尽管...
    Emma1962阅读 658评论 0 0