18.8.19 考试总结

Gift
【问题描述】
人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心意,他决定送她礼物。

可是她喜爱的东西特别多,然而他的钱数有限,因此他想知道当他花一定钱数后剩余钱数无法再购买任何一件剩余物品

(每种物品他最多买一个)时有多少种方案,两种方案不同,当且仅当两种方案中至少有一件品不

同,可是由于他忙着准备泡下一个妹纸(chi),因此麻烦聪明的你帮帮忙。

【输入格式】

输入第一行 n 和m,n 表示妹纸喜欢的礼物数目,m 表示现有的钱数,第二行n

个数,表示n 个物品的价格。

【输出格式】

输出一行一个数表示方案数目,答案对 1000000007 取模。

emmm这道题就是一个dp...然而蒟蒻本人并没有调出来 想到了枚举第一个不选的 然饿自作多情的写了一个类似消失的物品的垃圾dp

朴素的方法就是纯暴力 枚举每一种情况 判断剩余的钱数够不够买剩余最小的物品 如果买不起就是合法的

那么dp状态就很好定义了 dp[ i ][ j ]表示花费了i的重量不选物品中最小的是第j个的合法方案

那么要怎么轻松地get到j不选呢 排一个序 如果不选中最小的为j号 那么1 - j - 1都是选了的

所以对剩下的物品 剩余容量(m - sum)跑一个朴素背包就行了 sum就是1 - j - 1的前缀重量和

答案就是对于每一次的背包都加上 $\sum_{m - sum - w[i] + 1}^{m}f[i]$就可以了

但是这样做复杂度是n3的 那么怎么优化呢 每次我们再搞的时候都重新跑了一次背包 但是这样子就重复很多次

所以我们就倒着做 每次新加入一个物品 跑一边O(n)背包就可以了

然而我这个是一个垃圾n3的 将就看看

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1000 + 5;
const int mod = 1e9 + 7;
int dp[N],n,m,w[N],ans,f[N],sum;
bool vis[N];

int main( ) {

    freopen("gift.in","r",stdin);
    freopen("gift.out","w",stdout);
    scanf("%d%d",& n,& m);
    for(int i = 1;i <= n;i ++) {
        scanf("%d",& w[i]);
        sum += w[i];
    }
    if(sum <= m) {
        printf("1"); return 0;
    }
    sort(w + 1,w + n + 1);
    sum = 0;
    for(int t = 1;t <= n;t ++) {
        int mm = m - sum;
        memset(f,0,sizeof(f));
        if(mm < 0) break;
        f[0] = 1;
        for(int i = t + 1;i <= n;i ++)
          for(int j = mm;j >= w[i];j --)
             ] = (f[j - w[i]] + f[j]) % mod;
        for(int i = mm;i > mm - w[t];i --)
           if(i == -1) break;
           else ans = (ans + f[i]) % mod;
        sum += w[t];
    }
    printf("%d",ans);
}

Fseq
【问题描述】
一个长度为N+M 的数列,里面有N 个+1,M 个-1,如果一个这样的数列被称作F 序列(Fadeness) ,

当且仅当它的任意前缀和均非负。

for example :

1,-1,1,1,-1 is a Fadeness

1,-1,-1,1,1 is not because S(3) <0

求一个数列是Fadensee 的概率。

【输入格式】

第一行,Test , 表示测试数据的组数。

每个数据 有两个数N,M

【输出格式】

对于每组数据,输出一个实数(保留到小数点后6位)

这就是一道卡特兰数的题 把1当做向右走 把-1当做向上走

然后答案就是$C_{n +m}^{n} - C_{n + m}^{n + 1}$

化简得$\frac{n - m + 1}{n + 1}$

代码

#include <bits/stdc++.h>
using namespace std;

int T;
double n,m;

int main( ) {

    freopen("fseq.in","r",stdin);
    freopen("fseq.out","w",stdout);
    scanf("%d",& T);
    while(T --) {
        scanf("%lf%lf",& n,& m);
        if(m > n) {
            printf("0.000000\n"); continue;
        }
        printf("%.6lf\n",(n - m + 1)/(n + 1));
    }
}

Lucky
【问题描述】
DY 搞到了很多奥运会的门票,每张门票上都标了一个正整数,而DY 弄到的票刚好是从A.........B.

DY 定义一个数字是Lucky 的,当且仅当 第I 位<>第N-I+1 位 for I<>N-I+1( N 为这个数字的位数)

for example :

1234567 is lucky

1234561 is not lucky

DY 想知道他的票有多少是Lucky 的.

因此他为了考验你的智商,因此把这个问题交给了你.

【输入格式】

两个正整数,A,B

【输出格式】

A..B 中有多少数是Lucky 的

一道数位dp的题 只不过是从两头向中间搞 这样子做比较有普遍性

有人方法是直接搞 刚开始还以为是错的 结果发现每一个状态他都能对应一个的状态

所以dp是对的 但是还是两头搞比较好

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll l,r,dp[12][2][2];
int tot,dig[30];
bool vis[12][2][2];

ll dfs(int dep,bool lf_up,bool rg_up) {

    if(vis[dep][lf_up][rg_up]) return dp[dep][lf_up][rg_up];
    if(dep == tot - dep + 1) {
        if(lf_up && rg_up) return dig[dep];
        else if(! lf_up) return 10;
        else if(lf_up) return dig[dep] + 1;
    }
    if(dep > tot - dep + 1) {
        if(lf_up && rg_up) return 0;
        return 1;
    }
    vis[dep][lf_up][rg_up] = true;
    int up = lf_up ? dig[tot - dep + 1] : 9;
    ll res = 0;
    for(int i = 0;i <= up;i ++)
      for(int j = 0;j <= 9;j ++) {
          if(i == j) continue;
          if(dep == 1 && i == 0) continue;
          bool upup;
          if(j > dig[dep]) upup = true;
          else if(j < dig[dep]) upup = false;
          else upup = rg_up;
          res += dfs(dep + 1,lf_up && (i == dig[tot - dep + 1]),upup);
      }
    return dp[dep][lf_up][rg_up] = res;
}

ll solve(ll s) {

    memset(vis,0,sizeof(vis));
    ll ss = s,ans = 0;
    tot = 0;
    while(s) {
        dig[++ tot] = s % 10;
        s /= 10;
    }
    ans += dfs(1,1,0);
    for(int i = 1;i <= tot;i ++) dig[i] = 9;
    for(tot = tot - 1;tot >= 1;tot --) {
        memset(vis,0,sizeof(vis));
        ans += dfs(1,1,0);
    }
    return ans;
}

int main( ) {

    freopen("lucky.in","r",stdin);
    freopen("lucky.out","w",stdout);
    scanf("%I64d%I64d",& l,& r);
    ll ans1 = solve(l - 1);
    ll ans2 = solve(r);
    printf("%I64d",ans2 - ans1);
}

感觉做题又开始没状态了 难受

原文地址:https://www.cnblogs.com/Rubenisveryhandsome/p/9501444.html

时间: 2024-11-04 14:30:50

18.8.19 考试总结的相关文章

2019.3.18考试&amp;2019.3.19考试

2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 T2 正反都做一遍DP T3 观察到顺序不影响答案,分块打标记 2019.3.19 肥肠爆芡,因为沙茶博主昨天在学校的煞笔食堂吃坏了肚子,所以这场考试咕咕了 我佛了 一定补这两场.jpg 原文地址:https://www.cnblogs.com/ydnhaha/p/10558495.html

2017年1月18、19日活动记录

日程: 2017.1.18 1.运用多种方法制作水仙花数: (1)运用一重循环法制作水仙花数(do while) (2)运用三重循环法制作水仙花数(do while) (3)运用直到循环法制作水仙花数 2.直到循环1到100的和: (1)亿图软件制作流程图(2)利用VB制作直到循环1到100的和 3.十进制.二进制.十六进制之间的相互转化及其意义,列出了十进制.二进制.十六进制之间基数的转换表 4.利用亿图软件制作十进制转二进制流程图 5.利用辅助软件熟悉VB语句,并尝试了beep语句 6.利用

第十七节课:第18,19,23章,mariadb数据库、PXE无人值守安装系统和openldap目录服务。

第23章 (借鉴请改动) openldap数据的特点:1.短小.2.读取次数较多 上述说明: openLDAP服务端配置:     1.yum install -y openldap openldap-clients openldap-servers migrationtools  Loaded plugins: langpacks, product-id, subscription-manager //安装相关软件     2.生成秘钥文件并在/etc/hosts写入解析地址 slappass

18、19年渡一教育web前端高级工程师就业班视频教程下载

下载地址   百度网盘 [课程目录]├──第01节 课件及相关资料  |   ├──课件  |   |   ├──css3  |   |   |   ├──3d翻转.zip  97.77kb|   |   |   ├──css3 .pptx  2.51M|   |   |   ├──css3-Bootstrap.pptx  1.39M|   |   |   ├──css3-动画.pptx  3.36M|   |   |   ├──css3-媒体查询.pptx  806.76kb|   |   |

6.19 考试修改+总结

QAQ 又是一套水题集合 然后忧伤的故事是老师把时间调到了四个小时半 我又因为想要出道题花了半个小时写了一些其他的东西 然后最后没有写完题!QAQ 不然第三题可能多拿点分 上午的时候把所有题目的正解都想了出来 唯一美中不足的是自己想的第三题是O(n^4*300)的是时间复杂度 实际上离散化区间之后只会有n个区间,时间复杂度就是O(n^5)了QAQ 先说题解把 第一题 决战圆锥曲线 显然给定你的那个函数a*x+b*y+c*x*y对于x,y是相对等价的 又因为题目的输入具有随机性,显然可以通过维护线

18.1.1考试

今天考的题目都是DP,本来以为会有什么图论...根据今天题目比较水的原因,我直接放解题报告,大家应该可以看得懂.. T1 Source #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> using namespace std; const int maxn=10000+10,maxm=10010; #define file(a) freopen(a".i

18.5.19 自测

1.魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何 2 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 n 根柱子上最多能放多少个球.例如,在 4 根柱子上最多可放 11 个球. 对于给定的 n,计算在 n 根柱子上最多能放多少个球. 输入描述 第 1 行有 1 个正整数 n,表示柱子数. 输出描述 一行表示可以

18.8.13 考试总结

1.1 问题描述请构造一颗n 个节点的树,使得其价值最大.f(d) 表示树上,度数为d 的一个点能够获取的价值.这棵树的价值为Σni=1 f(di)di 表示第i 个点的度数1.2 输入第一行一个整数T,接下来T 组数据,每组数据输入两行.第一行输入整数n.第二行输入n ?? 1 个整数f(i) 代表f(1) f(n ?? 1).1.3 输出对于每组数据输出一行,为能够构造的树的最大价值. 一开始我以为是一道树形dp... 考完了才知道原来这个是一道背包问题 n个节点 总共有2n - 2个度数

18.8.26 考试总结

我真的服了 我考试的时候这道题题都是读错了的 交了个挖挖机结果还狗了20分.. 这道题是一道找规律的题 看完题很显然能够发现我们可以将相同颜色的连通块缩点 因为同一个联通块的可以一次操作全部变成另外一种颜色 所以就缩点就好了.. 对于缩点后的一条链 每次我们可以将一个点变色 那么和他相邻的点就和他颜色一样 然后就再次缩点 所以每次链的长度都可以 -2 所以说最后缩点的次数就是  点的个数 / 2  (下取整) 但是这是对于一条链 那么对于一棵树而言呢? 其实是一样的 因为每次搞这个操作 我们都可