题目整理1

hihocoder offers8的3道题,都非常有意思。
做了2道,有一道有思路没时间补了。

  • A题

** tag**: 数论
题目链接:http://hihocoder.com/contest/offers8/problem/1
解法

  1. 等价于要满足关系式 (D*i) mod L <= L-F, i为任意自然数,
  2. 就是要找(D*i) mod L 中最大的那个数。
  3. 若f(y)为 max({x|0<=x<y, gcd(x,y)==1}), 最大的那个数就为
    gcd(D,L)*f(L/gcd(D,L));
  4. 求f(y) 可以从大到小枚举

代码:

#include<cstdio>
int gcd(int a, int b) {
    return b?gcd(b,a%b):a;
}
bool check(int l, int f, int d) {
    if(f>l) return false;
    if(d==0) return false;
    int gd = gcd(l, d);
    l/=gd;
    int i;
    for(i=l-1; i>=0; --i) {
        if(gcd(i,l)==1) break;
    }
    if(gd*i+f>gd*l) return false;
    return true;
}
int main() {
    int t; scanf("%d", &t);
    while(t--) {
        int l, f, d;
        scanf("%d%d%d", &l, &f, &d);
        if(check(l,f,d)) puts("YES");
        else puts("NO");
    }
    return 0;
}
  • B题

** tag**: 并查集, 连通块
题目链接:http://hihocoder.com/contest/offers8/problem/2
解法

  1. 求连通块可以用并查集
  2. 由于列数为第一关键字,行数为第二关键字,标号要从要从左到有,再从上到下标,合并时设集合中标号最小的为代表元
  3. 统计的时候可以用map,因为map为平衡二叉树,遍历的时候自然有序
    4,输出矩阵的时候,不在当前连通块,但在当前矩阵的不能输出
    5 注意left, right, up, down, 中存在不能做变量名的,不然会WA.

代码

#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN = 1<<10;
int dbg = 0;
int id[MAXN][MAXN];
bool mat[MAXN][MAXN];
int fa[MAXN*MAXN];
int n, m;
int getfa(int x) {
    if(x==fa[x]) return x;
    return fa[x]=getfa(fa[x]);
}
struct  Node{
    int u, d, l, r, key;
    Node() {
        u = n;
        d = 1;
        l = m;
        r = 1;
    }
    void print() {
            printf("%d %d\n", d-u+1, r-l+1);
            for(int i=u; i<=d; ++i) {
                for(int j=l; j<=r; ++j) {
                    if(getfa(id[i][j])==key) putchar('1');
                        else putchar('0');
                }
                puts("");
            }
    }
};
map<int,Node> mp;
int step[][2] = {{-1,0},{0,-1}};

void merge(int u, int v) {
    u=getfa(u);
    v=getfa(v);
    fa[u] = fa[v]=min(u,v);
}
int main() {
    scanf("%d%d", &n, &m);
    char s[MAXN];
    for(int i=1; i<=n; ++i) {
        scanf("%s", s+1);
        for(int j=1; j<=m; ++j)
            mat[i][j] = (s[j]=='1');
    }
    int sz=0;
    for(int j=1; j<=m; ++j)
        for(int i=1; i<=n; ++i) {
            id[i][j] = ++sz;
            fa[sz] = sz;
        }
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            if(mat[i][j])
            {
                for(int k=0; k<2; ++k) {
                    int x =i+step[k][0];
                    int y =j+step[k][1];
                    if(mat[x][y]) merge(id[i][j], id[x][y]);
                }
            }
    mp.clear();
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            if(mat[i][j]) {
                int key=getfa(id[i][j]);
                Node& now = mp[key];
                now.key=key;
                now.u = min(now.u, i);
                now.d = max(now.d, i);
                now.l = min(now.l, j);
                now.r = max(now.r, j);
            }
    map<int,Node>::iterator it=mp.begin();
    for(;it!=mp.end(); ++it)
        (it->second).print();
    return 0;
}
  • C题

tag: dp, 可以不用树状数组
题目链接:http://hihocoder.com/contest/offers8/problem/3
解法

  1. n*n的方法很简单,现在针对它进行该进。
  2. 假设dp[i]代表前i个数的方法数
  3. 其实几乎前面所有的方法都可以选,但前缀和等于sum[i]的不能所以,统计前缀和为sum[i]的方法个数,设为cnt[sum[i]]
  4. sum[i]可能为负,可以离散化
  5. dp方程
    total = cnt[sum[0]] = 1;
    for(int i=1; i<=n; ++i) {
        dp[i] = (total-cnt[sum[i]])%MOD;
        cnt[sum[i]] = (cnt[sum[i]]+dp[i])%MOD;
        total = (total+dp[i])%MOD;
    }
  1. 用树状数组求total非常不好。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,252评论 0 18
  • 作曲 : 蔡健雅, 舞鞋 穿了洞 裂了缝 预备迎接一个梦,OK绷 遮住痛 要把苍白都填充,勇气惶恐 我要用哪一种,...
    颖仔心随阅读 611评论 0 0
  • Window Python安装 1、Python官网下载安装包并安装 Python官网地址:https://www...
    极客小寨阅读 377评论 0 1
  • 与其说今天是值得快乐的圣诞节,不如说明天是最后一搏的考研的日子。此时此刻的我坐在宽敞明亮的自习教室,看着朋友们晒礼...
    神盾局副局长阅读 351评论 0 0