2015安徽省赛 I.梯田

http://xcacm.hfut.edu.cn/problem.php?id=1213

set + 搜索

姐姐是用搜索+二分做的,效率要高很多

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
int x[]={ 0, 0,-1, 1};
int y[]={ 1,-1, 0, 0};
int lable[105][105],d[105][105];
int T,m,n,p,q,deepth=0,cake=0;
void dfs(int a,int b)
{
    if(d[a][b]>deepth||a<0||a>=m||b<0||b>=n||lable[a][b]==1){return;}
    lable[a][b]=1;
    cake++;
    for(int i=0;i<4;i++)
    {
        if(a+x[i]<0||a+x[i]>=m||b+y[i]<0||b+y[i]>=n){continue;}
        dfs(a+x[i],b+y[i]);
    }
    return;
}
void solve()
{
    int i,j;
    for(i=0; i<m; i++)
    {
        if(lable[i][0]==1)
        {
            continue;
        }
        dfs(i,0);
    }
    for(i=0; i<m; i++)
    {
        if(lable[i][n-1]==1)
        {
            continue;
        }
        dfs(i,n-1);
    }
    for(j=0; j<n; j++)
    {
        if(lable[0][j]==1)
        {
            continue;
        }
        dfs(0,j);
    }
    for(j=0; j<n; j++)
    {
        if(lable[m-1][j]==1)
        {
            continue;
        }
        dfs(m-1,j);
    }
}

int main()
{
    int i,j;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d",&m,&n,&p,&q);
        set<int>donser;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&d[i][j]);
                donser.insert(d[i][j]);
            }
        }
        while(1)
        {
            deepth=*donser.begin();
            solve();
            donser.erase(deepth);
            if(cake>=p&&cake<=q)
            {
                cout<<deepth<<endl;
                cake=0;
                memset(lable,0,sizeof(lable));
                memset(d,0,sizeof(d));
                break;
            }
            if(donser.size()==0||cake>q)
            {
                cout<<"-1"<<endl;
                cake=0;
                memset(lable,0,sizeof(lable));
                memset(d,0,sizeof(d));
                break;
            }
            cake=0;
            memset(lable,0,sizeof(lable));
        }
    }
    return 0;
}
时间: 2024-12-30 21:09:25

2015安徽省赛 I.梯田的相关文章

2015安徽省赛 H.数7

http://xcacm.hfut.edu.cn/problem.php?id=1212 模拟大发 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; bool judge_prime(int k) { int i; int u=int(sqrt(k*1.0)); for(i=2;i<=u;i++) { if(k%i==0)

2015安徽省赛 G.你来擒孟获

http://xcacm.hfut.edu.cn/problem.php?id=1211 SPFA模板题目 最短路变种,从起点终点各找一次最短路相加 #include<iostream> #include<vector> #include<deque> #include<cstdio> #include<cstring> using namespace std; struct Edge { int to,length; }; bool spfa(

2015安徽省赛 C.LU的困惑

题目描述 Master LU 非常喜欢数学,现在有个问题:在二维空间上一共有n个点,LU每连接两个点,就会确定一条直线,对应有一个斜率.现在LU把平面内所有点中任意两点连线,得到的斜率放入一个集合中(若斜率不存在则不计入集合),他想知道这个集合中有多少个元素. 输入 第一行是一个整数T,代表T组测试数据 每组数据第一行是一个整数n,代表点的数量.2<n<1000 接下来n行,每行两个整数,0<x<10000,0<y<10000,代表点的坐标 输出 输出斜率集合中有多少个

2015安徽省赛 F.多重部分和问题

题目描述 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. 输入 首先是一个正整数T(1<=T<=100) 接下来是T组数据 每组数据第一行是一个正整数n(1<=n<=100),表示有n种不同大小的数字 第二行是n个不同大小的正整数ai(1<=ai<=100000) 第三行是n个正整数mi(1<=mi<=100000),表示每种数字有mi个 第四行是一个正整数K(1<=K<=100000) 输出 对于每组数据

2015安徽省赛 B.求和

题目描述 对于正整数n,k,我们定义这样一个函数f,它满足如下规律 现在给出n和k,你的任务就是要计算f(n,k)的值. 输入 首先是一个整数T,表示有T组数据 接下来每组数据是n和k(1<=n,k<=108) 输出 打印出f(n,k)的值,每个输出单独占一行 样例输入 3 1 1 2 1 3 1 样例输出 -1 1 -2 找到规律即可. 1 #include <iostream> 2 #include <stdio.h> 3 int main() 4 { 5 usin

2015安徽省赛 A.First Blood

题目描述 盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题: 老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大.盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗? 输入 首先是一个正整数T,表示有T组测试数据 每组测试数据是一个正整数n(1<=n<=10^6) 输出 对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行 样例输入 2 9 7 样例输出 504 210 第一次写的版本相

2015省赛总结

2015省赛总结 AC-team  周凯——————2015年5月15日----23:35 2015年的省赛已经过去一个星期,今天我就做一下总结. 上周五,我们接到消息,可以作为旅游对去参加今年的省赛,其实听到这个消息我很高兴,因为终于可以出去见识一下什么是真正的ACM竞赛. 就在周四,舍友突发阑尾炎,我和另一基友几乎一晚没睡,舍友更不用说,整整疼了一天一夜.第二天(星期五)中午打的回来时,居然在出租车上睡着了.回来之后,下午接到消息,我们队可以以旅游队的名义去参加省赛,队友得知消息后,都很高兴

NOI 2015 滞后赛解题报告

报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n; int father[200001]; struct hp{ i

GG的匹配串 ______(广东工业大学2015校赛初赛)

Description 2015年广东工业大学ACM校赛要来~\(≧▽≦)/~辣辣辣,作为校赛的出题人之一,GG想出了一道水题来考考大家.相信小伙伴们都学过字符串匹配,于是字符串匹配的水题就诞生辣!GG给出了一段长度为N的大写字母序列,现在他要你修改这一段字母序列,使得这段字母序列上最前面的K个字母组成的序列与最后面的K个字母组成的序列一一匹配. 例如对于序列"ATUUUUAC"和K = 2,可以通过将第二个字母修改为"C",使得最前面的两个字母与最后面的两个字母都