中大程序设计比赛

昨晚三个人在创业吧做中大的程序设计比赛做的死去活来,今天打算把当时超时的题目揪出来好好的看看题解

Triangle:斐波那契证明

这道题鸿哥纠结了很久,连getchar都出来了,事实证明还是没有用,超时就是超时。
我们刚开始的想法是,三个循环,一个最小,一个次小,一i个最大,看最大的-最小的是否小于次小,还是超时。

  • 首先要排序
  • 当且仅当ai+ai+1>ai+2时可以输出YES,但复杂的为O(nlogn)
  • 分情况处理,对于n<100就可以按照上面的做法,n>100直接输出YES:


    题解//看不懂ing

权哥证明

结论

给定一个非空的正整数集合A,若A中任意三个元素都不能构成三角形,则A中的最大元素max A>= F|A|,其中|A|为集合A的元素个数,F|A|斐波那契数列的第n个元素(下标从1开始)。

引理铺垫

构成三角形的充要条件:
任意两边之和大于第三边 (1)
备注: 结论(1)与“任意两边之差小于第三边”是等价的

假如已知三边,且a<b<c。则(1)结论简化为:a+b>c (2)
因为较小的两条边相加都大于最长那一条边,那么其他任意两边相加肯定大于第三边。

所以不能构成三角形的充要条件为: a+b<=c
即如果a,b已知,则第三边c最小只能为a+b

在证明开头的结论之前再看一个例子

现有长为144cm的铁丝,要截成n小段(n>2),每段的长度>=1cm,如果其中任意三小段都不能拼成三角形,则n的最大值为多少?
因为上述题目要求n尽量大,则我们每截一段都要在满足题意(任意三段都不能构成三角形)下尽可能的小!
因为每一段最小为1,所以一开始我们截取两段都为1,作为基底。要使不能构成三角形,根据结论可知第三段最小只能截取2。
现在截取的长度序列{a}如下:
1 1 2 ...
为了使a2、a3和a4不构成三角形,则a4最小为a2+a3=3。a4由a2、a3确定,只要a2、a3和a4不构成三角形,a1、a2、a4就肯定不能构成三角形。
因为这是个非递减序列,a1<=a2<=a3<=a4,
又a2+a3<=a4 => a2,a3,a4不能构成三角形
所以a1+a2<=a4显然成立 => a1,a2,a4不能构成三角形

同理往下填数,可以发现这是个斐波那契数列F:
1 1 2 3 5 8...
数列F中任意三个数不能构成三角形,且Fi是满足前提(任意三个数不能构成三角形)的最小的数。

现在给定一个升序的有n个正整数的数列b,且这个数列任意三个数也不能构成三角形,则对于相同的i,有bi>=Fi。(因为之前已经证明Fi是满足前提(任意三个数不能构成三角形)的最小的数)。

设max为数列b中最大的数(因为升序排列,即为bn)
bi>=Fi => bn>=Fn => max >= Fn

Monitor: 二维前缀和

  • 题意:在一个面积不超过n*m的矩形上,有p个矩形A,问之后的q个矩形B能否被之前的A全部覆盖(每个B的点都在至少一个A中)
  • 由于nm,p,q的范围过大,于是考虑O(nm+p+q)的做法。
    对于A类矩形(x1,y1,x2,y2),我们只需要在(x1,y1),(x2+1,y2+1)处+1,在(x1,y2+1)(x2+1,y1)处-1
  • 之后对整个面积求一个前缀和。则大于0的地方就是被A类矩形覆盖的点。这里什么意思
  • 把值大于0的地方变成1,再一次求一次前缀和,处理好后即可在O(1)的时间算出一个矩形内被覆盖的点的数量。
  • 虽然题解还是没看懂,但参考了一下大佬的博客,写了前缀和的相关文章,还是有点不清楚他是如何和前缀和联系在一起的,想一想叭~

先呈现出代码具体解释看前例和例题

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
using namespace std;

int a[1001][1001];
void qian(int x,int y){
    for(int i=1;i<=x;i++)
        for(int j=1;j<=y;j++){
            a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
        }
}    
int main()
{
    freopen("data","r",stdin);
    int n,m,N,M,x1,x2,y1,y2;
        scanf("%d%d",&n,&m);
        cin>>N;
        memset(a,0,sizeof(a));
        for(int i=0;i<N;i++){
            cin>>x1>>y1>>x2>>y2;
            a[x1][y1]+=1,a[x2+1][y2+1]+=1,a[x2+1][y1]-=1,a[x1][y2+1]-=1;
        }
        qian(n,m);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                if(a[i][j]>0)
                    a[i][j]=1;
        qian(n,m);
        //接下来才是真正的求面积
        cin>>M;
        for(int i=0;i<M;i++){
            cin>>x1>>y1>>x2>>y2;
            int sum1=(y2-y1+1)*(x2-x1+1);
            int sum2=a[x2][y2]-a[x1-1][y2]-a[x2][y1-1]+a[x1-1][y1-1];
            if(sum1==sum2)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    return 0;
}

Clumsy Keke:直接模拟

一直以为这道题有捷径的我醉了。
在输入的时候要注意一下,有个坑,接着就直接x,y,z进行模拟。

#include<iostream>
#include<cstdio>
using namespace std;

int a[105][105],b[105][105],c[105][105];

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

推荐阅读更多精彩内容