九度OJ 1371(排序) 1372(DP) 1373(统计) 1374(统计) 1375(统计)

2024-04-02 01:58

本文主要是介绍九度OJ 1371(排序) 1372(DP) 1373(统计) 1374(统计) 1375(统计),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1371:最小的K个数

http://ac.jobdu.com/problem.php?pid=1371

题意

输入n个整数,找出其中最小的K个数。

思路

排序然后输出。

代码

#include<stdio.h>
#include<algorithm>
#define N 200005
using namespace std;
int main()
{
        int n,k;
        int i;
        int a[N];
        while(scanf("%d%d",&n,&k)!=EOF)
        {
                for(i=0;i<n;i++)
                {
                        scanf("%d",&a[i]);
                }
                sort(a,a+n);
                for(i=0;i<k-1;i++)
                {
                        printf("%d ",a[i]);
                }
                printf("%d\n",a[k-1]);
        }
        return 0;
}
/**************************************************************
    Problem: 1371
    User: liangrx06
    Language: C++
    Result: Accepted
    Time:860 ms
    Memory:1728 kb
****************************************************************/

1372:最大子向量和

http://ac.jobdu.com/problem.php?pid=1372

题意

求向量中连续子向量的最大和,同时求出该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素下标最小的那个。

思路

基本DP题。我的代码是学DP之前写的,复杂度与DP都是O(N)。

代码

#include <stdio.h>int main(void)
{int n;long long a[1000000];int i;long long best, bestTmp;long long bestL, bestR, bestTmpL, bestTmpR;while (scanf("%d", &n) != EOF){if (n == 0)break;for (i=0; i<n; i++)scanf("%lld", &a[i]);best = a[0];bestL = bestR = 0;bestTmp = a[0];bestTmpL = bestTmpR = 0;for (i=1; i<n; i++){if (bestTmp < 0){bestTmp = a[i];bestTmpL = bestTmpR = i;}else{bestTmp += a[i];bestTmpR = i;}if (bestTmp > best){best = bestTmp;bestL = bestTmpL;bestR = bestTmpR;}}printf("%lld %lld %lld\n", best, bestL, bestR);}return 0;
}
/**************************************************************Problem: 1372User: liangrx06Language: CResult: AcceptedTime:470 msMemory:8652 kb
****************************************************************/

1373:整数中1出现的次数

http://ac.jobdu.com/problem.php?pid=1373

题意

输出a和b之间数字1出现的次数。

思路

分别求1-(a-1)和1-b之间1出现的次数,两者想减。

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int count(char *s, int a)
{int n = strlen(s);int i;int res = 0;int pow10i = 1;int si;for (i=0; i<n; i++){res += a/(pow10i*10)*pow10i;si = n-1-i;if (s[si] > '1')res += pow10i;if (s[si] == '1')res += a%pow10i + 1;//printf("i=%d, a=%d, pow10i=%d, res=%d\n", i, a, pow10i, res);pow10i *= 10;}return res;
}int main()
{int i;char sa[11], sb[11];int a, b;while(scanf("%s%s", sa, sb) != EOF){a = atoi(sa);b = atoi(sb);if (a > b){int tmp = a;a = b;b = tmp;char stmp[11];strcpy(stmp, sa);strcpy(sa, sb);strcpy(sb, stmp);}int counta = 0;int tmpa = a;for (i=0; i<strlen(sa); i++){if (tmpa%10 == 1)counta ++;tmpa /= 10;}int count0toa = count(sa, a);int count0tob = count(sb, b);printf("%d\n", count0tob - count0toa + counta);}return 0;
}
/**************************************************************Problem: 1373User: liangrx06Language: CResult: AcceptedTime:0 msMemory:912 kb
****************************************************************/

1374:所有员工年龄排序

http://ac.jobdu.com/problem.php?pid=1374

题意

公司内员工年龄排序。

思路

此题特点是age取值范围为(1<=age<=99),可用设置一数组统计每个age出现次数。算法复杂度O(N)。
快排估计会超时。

代码

#include <stdio.h>
#include <string.h>#define N 1000000int main()
{
    int i, j, n;
    int a[N];
    int count[100];
    while(scanf("%d", &n) != EOF)
    {
        memset(count, 0, sizeof(count));
        for (i=0; i<n; i++)
        {
            scanf("%d", &a[i]);
            count[a[i]] ++;
        }
        for (i=1; i<100; i++)
        {
            for (j=0; j<count[i]; j++)
                printf("%d ", i);
        }
        printf("\n");
    }
    return 0;
}
/**************************************************************
    Problem: 1374
    User: liangrx06
    Language: C
    Result: Accepted
    Time:790 ms
    Memory:4748 kb
****************************************************************/

1375:陈博的完美主义

http://ac.jobdu.com/problem.php?pid=1375

题意

对于一个整数序列d1, d2, d3 … dn,你是否能够算出至少改变其中的几个数,才能把他们变成从1到N的一个排列?

思路

统计1-N中数未出现得个数就是答案。

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define N 100000
#define M 100int main()
{int i, n;int a[N], b[N+1];char s[M+1];while(scanf("%d", &n) != EOF){memset(b, 0, sizeof(b));for (i=0; i<n; i++){scanf("%s", s);if (strlen(s) > 9)a[i] = 0;elsea[i] = atoi(s);if (a[i] <= n && a[i] >= 1)b[a[i]]++;}int count = 0;for (i=1; i<=n; i++){if (b[i] > 0)count ++;}printf("%d\n", n-count);}return 0;
}
/**************************************************************Problem: 1375User: liangrx06Language: CResult: AcceptedTime:170 msMemory:1232 kb
****************************************************************/

这篇关于九度OJ 1371(排序) 1372(DP) 1373(统计) 1374(统计) 1375(统计)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868688

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

uva 10154 DP 叠乌龟

题意: 给你几只乌龟,每只乌龟有自身的重量和力量。 每只乌龟的力量可以承受自身体重和在其上的几只乌龟的体重和内。 问最多能叠放几只乌龟。 解析: 先将乌龟按力量从小到大排列。 然后dp的时候从前往后叠,状态转移方程: dp[i][j] = dp[i - 1][j];if (dp[i - 1][j - 1] != inf && dp[i - 1][j - 1] <= t[i]

uva 10118 dP

题意: 给4列篮子,每次从某一列开始无放回拿蜡烛放入篮子里,并且篮子最多只能放5支蜡烛,数字代表蜡烛的颜色。 当拿出当前颜色的蜡烛在篮子里存在时,猪脚可以把蜡烛带回家。 问最多拿多少只蜡烛。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cs