0100 蓝桥杯真题03
创始人
2024-02-03 19:48:18
0

 

 

 

 

 

 

import java.util.Scanner;

/*
 * 题目描述
 * 如下图所示,3 x 3 的格子中填写了一些整数。

        +--*--+--+
        |10* 1|52|
        +--****--+
        |20|30* 1|
        *******--+
        | 1| 2| 3|
        +--+--+--+
        
 *我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。
 *本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
 *如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
 *如果无法分割,则输出 0。
 *
 *输入解释
 *程序先读入两个整数 m n 用空格分割 (m,n<10)。
 *表示表格的宽度和高度。
 *接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。
 *
 *输出解释
 *输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。

    样例输入1
    3 3
    10 1 52
    20 30 1
    1 2 3
    
    样例输出1
    3
    
    样例输入2
    4 3
    1 1 1 1
    1 30 80 2
    1 1 1 100
    
    样例输出2
    10

 * 思路
 * 深搜-->回溯-->剪枝
 */
public class _09剪格子 {
    static int[][] g;//二维数组
    static int[][] vis;//标记已访问
    private static int n;
    private static int m;
    private static int total;//总数
    private static int ans = Integer.MAX_VALUE;//取最小,可以设置成最大
    
    
    //i,j表示坐标,steps表示步数,sum表示总和
    static void dfs(int i,int j,int steps,int sum) {
        
        if(i < 0 || i == n || j < 0 || j == m || vis[i][j] == 1) {//出口:走出边界或已访问
            return;
        }
        if (sum == total / 2) {//出口:等于总数/2
            ans = Math.min(ans, steps);
            return;
        }
        if(sum > total / 2) {//出口:大于总数/2
            return;
        }
        
        vis[i][j] = 1;//标记已访问
        
        dfs(i-1, j, steps+1, sum+g[i][j]);//往上
        dfs(i+1, j, steps+1, sum+g[i][j]);//往下
        dfs(i, j-1, steps+1, sum+g[i][j]);//往左
        dfs(i, j+1, steps+1, sum+g[i][j]);//往右
        
        vis[i][j] = 0;//重置状态
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();//行
        n = sc.nextInt();//列
        g = new int[n][m];//初始化
        vis = new int[n][m];//初始化
        for(int i = 0;i < n;i++) {
            for(int j = 0;j < m;j++) {
                g[i][j] = sc.nextInt();//输入数据存入二维数组g
                total += g[i][j];//总数
            }
        }
        dfs(0, 0, 0, 0);
        System.out.println(ans);
    }
}

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/*
 * 问题描写叙述
 * 非常久曾经,T王国空前繁荣。为了更好地管理国家,王国修建了大量的高速路,用于连接首都和王国内的各大城市。
 * 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得不论什么一个大城市都能从首都直接或者通过其它大城市间接到达。
 * 同一时候,假设不反复经过大城市。从首都到达每一个大城市的方案都是唯一的。
 * J是T国重要大臣,他巡查于各大城市之间,体察民情。
 * 所以,从一个城市马不停蹄地到还有一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。
 * 聪明的J发现,假设不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,
 * 在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。
 * 也就是说走1千米花费11,走2千米要花费23。
 * J大臣想知道:他从某一个城市出发。中间不歇息,到达还有一个城市。全部可能花费的路费中最多是多少呢?
 * 
 * 输入格式
 * 输入的第一行包括一个整数n,表示包括首都在内的T王国的城市数
 * 城市从1開始依次编号。1号城市为首都。
 * 接下来n-1行,描写叙述T国的快速路(T国的快速路一定是n-1条)
 * 每行三个整数Pi, Qi, Di。表示城市Pi和城市Qi之间有一条快速路,长度为Di千米。
 * 
 * 输出格式
 * 输出一个整数,表示大臣J最多花费的路费是多少。

    例子输入1
    5
    1 2 2
    1 3 1
    2 4 5
    2 5 4
    例子输出1
    135
    
 * 思路
 * 走1千米花费11,走2千米要花费23
 * 11+12+13+14+.....==>等差求和 a1*n+n*(n-1)/2
 * 
 * 树的直径:树上任意两节点之间最长的简单路径
 * 任意找一个点为根,dfs整棵树找到距离他最远的点xx,再以这个点xx为根求出距离它最远的点yy,(x,y)即为直径
 *    
 */
public class _10大臣的旅费 {
    private static int n;
    private static List[] g;//邻接表
    private static int max = -1;
    private static int point = -1;
    
    static int disMoney(int dis) {
        return    11*dis + dis*(dis-1)/2;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        g = new List[n+1];
        for(int i = 1;i <= n;i++) {
            g[i] = new ArrayList();
        }
        
        for(int i = 0;i < n-1;i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            
            g[a].add(new Node(b,c));
            g[b].add(new Node(a,c));
        }
        //以1为根,找出距离它最远的点
        dfs(1,1,0);//找到point
        dfs(point,point,0);
        System.out.println(disMoney(max));
    }
    
    //from:来自哪个点,num:当前点,dis:累计距离
    private static void dfs(int from,int num,int dis) {
        
        boolean isLeaf = true;
        
        List neighbors = g[num];
        for(int i = 0;i < neighbors.size();i++) {
            Node neighbor = neighbors.get(i);
            if(neighbor.num == from) {
                continue;
            }
            isLeaf = false;
            dfs(num,neighbor.num,dis+neighbor.dis);
        }
        
        if(isLeaf && dis > max) {//是叶子节点
            max = dis;
            point = num;
        }
    }
    
    static class Node{
        int num;//编号
        int dis;//距离
        
        public Node(int num, int dis) {
            this.num = num;
            this.dis = dis;
        }
    }
}

 

 

相关内容

热门资讯

五年级绿豆糖水作文(精彩6篇... 五年级绿豆糖水作文 篇一绿豆糖水的制作过程绿豆糖水是一道非常受欢迎的甜品,制作起来也非常简单。下面我...
五年级孩子以观察晚霞为体裁的... 五年级孩子以观察晚霞为体裁的作文 篇一美丽的晚霞今天傍晚,我看到了一幅美丽的晚霞。晚霞的颜色非常丰富...
小学五年级母爱的作文500字... 小学五年级母爱的作文500字 篇一母爱是世界上最伟大的力量。在我们的成长过程中,母亲的爱无处不在,时...
五年级暑假写去女儿国玩作文(... 五年级暑假写去女儿国玩作文 篇一女儿国是我梦寐以求的地方。暑假的一天,我终于有机会去女儿国玩了!我和...
蚂蚁帝国五年级作文(实用3篇... 蚂蚁帝国五年级作文 篇一:探索蚂蚁帝国的奇妙世界蚂蚁帝国是一个神奇的世界,它隐藏在我们看不见的地方,...
一幅画作文五年级200字(推... 一幅画作文五年级200字 篇一《夏日的乐园》我在学校的美术课上画了一幅画,它是我想象中的夏日乐园。画...
开学第一天五年级作作文69篇... 开学第一天五年级作作文69篇 篇一我的开学第一天 今天是我五年级的第一天,我非常兴奋。早上,我...
阳光总在风雨后五年级作文(最... 阳光总在风雨后五年级作文 篇一五年级作文:阳光总在风雨后在生活中,我们常常会遇到各种各样的挫折和困难...
学溜冰作文500字五年级(精... 学溜冰作文500字五年级 篇一学溜冰冬天来了,大街上银装素裹,冰雪世界,真是美不胜收。在这样的季节里...
开到荼縻五年级作文(精简3篇... 开到荼縻五年级作文 篇一:我的暑假计划暑假就要到了,同学们都纷纷计划着怎么度过这个美好的假期。而我作...
暑假趣事作文五年级优(最新6... 暑假趣事作文五年级优 篇一夏日炎炎,放学了,我迫不及待地踏上了漫长的暑假旅程。这个暑假,我有许多有趣...
关于小学生五年级作文300字... 关于小学生五年级作文300字左右的作文 篇一我的暑假计划暑假即将来临,我早早地做好了我的暑假计划。接...
牛郎织女缩写五年级【精简3篇... 牛郎织女缩写五年级 篇一牛郎织女是中国古代的一个著名爱情传说,也是中国传统节日七夕的由来。在中国民间...
说明文五年级作文【经典6篇】 说明文五年级作文 篇一如何养一只健康的宠物狗养宠物狗是一项非常有趣和有责任的事情。如果你想养一只健康...
五年级作文题目是20年后回家... 五年级作文题目是20年后回家乡 篇一第一篇内容我回到了家乡,这是我离开家乡20年后的第一次回归。当我...
五年级作文小时候我可真顽皮(... 五年级作文小时候我可真顽皮 篇一小时候我可真顽皮小时候的我可真是个顽皮的小孩子,总是让爸爸妈妈头疼不...
上五年级的感受200字作文大... 上五年级的感受200字作文大全 篇一五年级是我人生中的一个重要阶段,我在这一年级学到了很多东西,也体...
五年级小学生感恩教师的作文3... 五年级小学生感恩教师的作文300字 篇一感恩教师每天我都会在学校遇到很多老师,他们是我们的知识传授者...
小学五年级书的作文400字【... 小学五年级书的作文400字 篇一《小学五年级的趣事》最近,我在小学五年级的课堂上发生了一件有趣的事情...
秋叶五年级作文【精简6篇】 秋叶五年级作文 篇一:秋天的美丽景色秋天是一年中最美丽的季节之一。当夏天渐渐离去,秋天悄悄地走进我们...