GCJ 2009 Round2 A 构造贪心策略



题意:

给你一个n?n的元素只为0或1的矩阵,要把该矩阵通过行交换变为上三角矩阵,且交换方式只能为相邻行交换。问最小的交换步数是多少?



思路

首先这个行的利用价值就是最右边的1位置是多少,直接把行抽象为最右边1的数字即可。注意:这里WA了一发,没有注意数字要初始化为0。无论多么简单,写完之后检查代码且保证逻辑没有一丝错误十分重要!

这个题主要的是构造贪心的法则:题中只需要满足第一行的数字小于1,第二行的数字小于2,…..,第n行的数字小于n。那么就从第一行开始,一行一行的来看,注意若当前行的数组小于等于行数就,到下一行,如果不满足,就需要在底下行中挑选距离该行最近,且满足条件的数字交换上来。仔细思考这个策略,会发现,它很好的做到了不会出现矛盾的交换,和每步最优思想。



Code:

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

int main(void) {
    //freopen("A-small-practice.in", "r", stdin);
    freopen("A-large-practice.in", "r", stdin);
    freopen("a.txt", "w", stdout);
    int t, n, a[50];
    scanf("%d", &t);
    for (int l = 1; l <= t; l++) {
        scanf("%d", &n);
        for (int i = 0; i < n ; i++) {
            a[i + 1] = 0;
            string s;
            cin >> s;
            for (int j = n - 1; j >= 0; j--) {
                if (s[j] != ‘0‘) {
                    a[i + 1] = j + 1;
                    break;
                }
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            if (a[i] <= i) continue;
            for (int j = i + 1; j <= n; j++) {
                if (a[j] <= i) {
                    for (int k = j; k > i; k--) {
                        swap(a[k], a[k - 1]);
                        ans++;
                    }
                    break;
                }
            }
        }
        printf("Case #%d: %d\n", l, ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 02:18:23

GCJ 2009 Round2 A 构造贪心策略的相关文章

到底什么叫贪心策略(内含几个经典贪心样例和三大图论算法)

昨天和前天写完了分治和dp,感觉收获真的挺大的,复习绝不是简单的重复记忆,而是将所学知识融会 贯通的过程,分析各种思想的异同,这些都是在平时学习和刷题的时候没有认真考虑的问题 好了,扯远了 今天分析一下到底什么叫贪心策略 怎么理解贪心:贪心在解决问题上是目光短浅的,仅仅根据当前的已知信息就做出选择,并且一旦做了选择,就不再更改 比如01背包问题,用贪心的话是不可解决的,因为贪心每次只顾眼前最优,即每次选择价值最大的,而忽 略了另外一个变量,物品的重量,如果还考虑物品的重量的话,那就是dp了 贪心

哈夫曼编码--贪心策略

哈夫曼编码还是在暑假时候看的,那时候并没有看懂因为比较菜(虽然现在也是很菜的),在<趣学算法>一书中这个问题讲解十分到位,我这篇博客真的是难以望其项背,只能对其进行一点借鉴和摘抄吧 哈夫曼编码是一棵树,权值越大的节点越靠近树根,越小的节点就越远离树根,从他的定义来看,首先想到的应该是贪心策略吧,没错就是贪心算法 虽然说是贪心算法,但是还要知道它 的实现方式啊,他的贪心策略是:每次从树的集合中取出没有双亲且权值最小的两棵树作为左右子树,并合并他们 步骤 : 1 :确定合适的数据结构(要知道他的左

【贪心策略】USACO 越野跑

问题 H: 越野跑[贪心策略] [题面] 为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练.贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:奶牛独自进山的时间不得超过M秒(1< =M< =10,000,000). 整条山路被贝茜划分成T个长度相同的小段(1< = T< = 100,000),并且,贝茜用S_i表示第i个小段的路况.S_i为u,f,d这3个字母之一,它们分别表示 第i个小段是上坡.平地,或是下坡. 贝茜要花U秒(1< =U&l

一类区间选择问题的贪心策略

有一类问题在区间上的选择问题有如下特征: 1. 每个选择之间不交叉 2. 区间元素可以在某个选择中,也可以不在任何选择中 3. 最大化选择的个数 对于这类问题,我们可以考虑采取贪心策略.具体来说,对于区间从左到右考虑,每次发现一个可行的组合就选择,保证右区间尽可能小. Codechef CHEFPRAD [给a,b数组,数组内部元素相对位置不变,但ab之间的元素可以同时位移一个距离.每个元素可以匹配和它距离小于y的对面的点,求最大匹配] [观察到最优匹配方案一定是落在b数组某个元素的上边界上(如

LeetCode--Best Time to Buy and Sell Stock (贪心策略 or 动态规划)

Best Time to Buy and Sell Stock Total Accepted: 14044 Total Submissions: 45572My Submissions Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, b

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

CF10E Greedy Change 判断硬币系统是否能用贪心策略

Billy investigates the question of applying greedy algorithm to different spheres of life. At the moment he is studying the application of greedy algorithm to the problem about change. There is an amount of n coins of different face values, and the c

The - Modcrab——使用贪心策略

一.题目信息 The - Modcrab 简单翻译一下:Vova有生命值h1,每次攻击值为a1,每瓶药水恢复生命值c1;Modcrab有生命值h2,每次攻击值为a2.在每个关卡开始,Vova有两种选择,要么攻击怪兽Modcrab,要么喝一瓶药水(Modcrab的生命值允许超过h2),然后,如果战斗没有结束,Modcrab会攻击Vova.战斗结束的标志是Vova(或Modcrab)的生命值降至0,或者更低. 注:1.选择喝药水,Modcrab也会攻击Vova.2.攻击是有先后顺序的 二.算法描述

浅谈贪心策略——相邻交换

浅谈贪心策略——相邻交换 题解主要写贪心的考虑方法:相邻交换法. 我们在平时的贪心题几乎都可以正确的贪心方法. 主要思想 设交换前对答案的贡献为x,交换后对答案的贡献为y l  若x>y则不交换 l  若x<y则需交换 l  若x==y则不交换(交换反而增加时间复杂度) 作为题目,需要建立数学模型设置未知数表示x和y得到不等式从而得出排序的关键字. 例题:皇后游戏(Luogu OJ P2123) 网址: https://www.luogu.org/problemnew/show/P2123 题