位运算1(bit)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK拥有一个十进制的数N。它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值。例如数字123拥有6的价值,数字999拥有27的价值。

假设数字N的价值是K,LYK想找到一个价值是K-1的数字,当然这个答案实在太多了,LYK想使得这个价值为K-1的数字尽可能大。

输入格式(bit.in)

一个数N。

输出格式(bit.out)

一个数表示答案。你需要输出一个非负整数,且这个数不包含前导0。

输入样例1

199

输出样例1

198

输入样例2

1000

输出样例2

0

对于20%的数据n<=10

对于40%的数据n<=100

对于60%的数据n<=1000

对于100%的数据1<=n<=100000。

通过观察,我们可以发现一个性质,当n的最后一位为大于等于1的数的时候我们可以直接将这个数减1以后就是答案、

但是如果最后一位为0的时候我们肯定不能这样再减了,为什么?你减去以后出来的数为9,不论怎么加都比当前数的价值大。这样的话我们我更高位上找,遇到一个不为0得数以后在减1,如果这个不为零的数在最高位上,且为1,这样我们就直接输出0

zz一样的没有考虑,n<10的这种情况,白丢掉了10分、、(呜呜)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int n,s,sum;
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int main()
{
    freopen("bit.in","r",stdin);
    freopen("bit.out","w",stdout);
    n=read();
    while(n)
    {
        sum=n%,n/=;
        )
        {
            sum--;
            if(n) printf("%d%d",n,sum);
            ;}
            ;i<=s;i++) printf(");
            break;
        }
        else s++;
    }
    ;
}

AC代码

火柴棒 (stick)

Time Limit:1000ms   Memory Limit:128MB

题目描述

众所周知的是,火柴棒可以拼成各种各样的数字。具体可以看下图:

通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推。

现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用完,并且想知道能拼出的最小和最大的数分别是多少。

输入格式(stick.in)

一个数k。

输出格式(stick.out)

两个数,表示最小的数和最大的数。注意这两个数字不能有前导0。

输入样例

15

输出样例

108 7111111

数据范围

对于30%的数据k<=10。

对于60%的数据k<=20。

对于100%的数据1<k<=100。

对于最大的那个数我们可以发现一个小规律,我们知道位数最多的数一定最大对吧,那么我们就让我们凑出来的这个数位数最多,那么我们就尽量选那个耗用火柴数最少的那个,我们先用2个的,然后如果他是一个奇数的话,那么最后一定会剩下一个1,那么我们就判断如果他是奇数的话,我们就用一个耗3个火柴的,其余的又还是用2,如果是偶数,那么没有商量,直接用2.

然后我们再来考虑那个最小的数,同理我们需要把把我们拼出的数位数尽可能小,那么我们就要选用耗火柴数最多的数字,我们又可以发现0

耗用6个火柴,8耗用7个火柴,这两种可能在选用的时候拼出的数字位数一样多,在这个时候我们就只能选0,不选8了(这不废话吗、、),然后我们还可以发现我们如果讲能凑成8或6的都用来凑的话,可能不是最优的,例如15,我们完全可以拼出2个0但是这样的话我们剩下的就是3,这样的话我们拼出的数就是700了,这样显然不是最小的。这样我们就用其他的两个数来代替他们,我们在上面如果选用1个0的话,那么剩下的数为9,我们用随意两个数在组成这个9,看看最小可以是几。然后用一个数组记录一下,我们要输出最小值,那么在前面的数一定要最小,但是同时也不能等于0.再就是我们在用6个火柴的时候可以不选择0,可以选择6,我们知道68一定比80小

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
]={,,,,,,};
]={,,,,,,,};
];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int work1(int n)
{
    int m=0x7fffffff;
    ) printf("%d",b[n]);
    else
    {
        ==n/)
        {
            s=n/-,n=n%+;
            ;i<=;i++)
            {
                n1=b[i],n2=b[n-i];
                  ||!n1) swap(n1,n2);
                  +n2>m) continue;
                m=n1*+n2;
                ans[]=n1,ans[]=n2;
                )
                {
                    n2=;
                    ||!n1) swap(n1,n2);
                      +n2>m) continue;
                    m=n1*+n2;
                    ans[]=n1,ans[]=n2;
                }
            }
            ;i<=s+;i++) ans[i]=b[];
            sort(ans+,ans+s+);
            ])
             ;i<=s+;i++)
              ],ans[]=ans[i],ans[i]=m; break;}
            ;i<=s+;i++)
             printf("%d",ans[i]);
        }
        else
        {
            s=n/-,n=n%+;
            ;i<=;i++)
            {
                n1=b[i],n2=b[n-i];
                  ||!n1) swap(n1,n2);
                  +n2>m) continue;
                m=n1*+n2;
                ans[]=n1,ans[]=n2;
                )
                {
                    n2=;
                    ||!n1) swap(n1,n2);
                      +n2>m) continue;
                    m=n1*+n2;
                    ans[]=n1,ans[]=n2;
                }
            }
            ;i<=s+;i++) ans[i]=b[];
            sort(ans+,ans+s+);
            ])
             ;i<=s+;i++)
              ],ans[]=ans[i],ans[i]=m; break;}
            ;i<=s+;i++)
             printf("%d",ans[i]);
        }
    }
    printf(" ");
}
int work2(int n)
{
    )
     printf(;
    ;i<=n/;i++)
      printf(");
}
int main()
{
    freopen("stick.in","r",stdin);
    freopen("stick.out","w",stdout);
    n=read();
    work1(n),work2(n);
    ;
}

AC代码

听音乐(music)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK喜欢听音乐,总共有n首音乐,有m个时刻,每个时刻LYK会听其中一首音乐,第i个时刻会听第ai首音乐。它给自己定了一个规定,就是从听音乐开始,听的每连续n首音乐都是互不相同的。例如当n=3时,从听歌开始,123321就是一个合法的顺序(此时LYK听了两轮歌,分别是123和321,每一轮的歌都是互不相同的),而121323就是一个不合法的顺序(LYK也听了两轮歌,第一轮中121存在听了两次相同的歌)。我们现在只截取其中一个片段,也就是说并不知道LYK之前已经听了什么歌。因此121323也仍然可以是一个合法的顺序,因为LYK之前可能听过3,然后再听121323,此时LYK听了三轮歌,分别是312,132和3。

现在LYK将告诉你这m个时刻它听的是哪首歌。你需要求出LYK在听这m首歌之前可能听过的歌的不同方案总数(我们认为方案不同当且仅当之前听过的歌的数量不同)。LYK向你保证它之前听过的歌的数量是在0~n-1之间的。因此你输出的答案也应当是0~n中的某个整数(答案是0表示LYK记错了,没有一个合法的方案)。

输入格式(music.in)

第一行两个数n,m。

第二行m个数表示ai。

输出格式(music.out)

一个数表示答案。

输入样例1

4 10

3 4 4 1 3 2 1 2 3 4

输出样例1

1

样例解释1:LYK之前一定只听过2首歌(12或者21),这样可以分成3部分分别是34,4132,1234,每一部分都没有出现相同的歌。对于其它情况均不满足条件。

输入样例2

6 6

6 5 4 3 2 1

输出样例2

6

样例解释2:LYK之前听过0~5首歌的任意几首都是有可能满足条件的。

数据范围

对于50%的数据n,m<=1000。

对于100%的数据1<=n,m<=100000,1<=ai<=n。

其中均匀分布着n<m以及n>=m的情况。

提示:

LYK知道这个题目很长,但为了便于理解已经加了很多注释了……建议没看懂的同学们再重新看一遍……

暴力做法:如果要以前听过歌,那么听过歌的情况一定是第一轮听的歌的个数在n以内。这样我们先确定第一轮的长度,看看当前这一轮是否合乎条件,如果满足条件的话,我们在判断在这种划分的前提下其他的划分出的轮数是否满足条件,如果均满足条件,那么这种情况就是合法的,我们在这个地方统计一个前缀和,用于判断一段区间是否满足条件,如果满足条件那么ans++。

我们这个地方还需要分类讨论,因为n可能比m大,这样的话我们在划分轮数的时候就只能划分为两轮,一轮为最前面的那一轮,另一轮为从i到m这一轮,我们判断这两轮是否都满足条件

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1010
using namespace std;
bool flag;
int n,m,x,s,ans,a[N][N],maxn[N];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int main()
{
    freopen("music.in","r",stdin);
    freopen("music.out","w",stdout);
    n=read(),m=read();
    ;i<=m;i++)
    {
        x=read();
        ;k<=n;k++)
         ]+;
         ];
        maxn[i]=max(maxn[i],a[x][i]);
    }
    if(n<m)
    {
        ;i<=n;i++)
        {
            flag=false;
            ) {flag=true;break;}
            if(flag) break;
            for(int j=min(i+n,m);j<=m;j+=n)
            {
                if(i+n>m) s=i;
                else s=j-n;
                ;k<=n;k++)
                   ) {flag=true;break;}
                  if(flag) break;
             }
            if(!flag) ans++;
        }
    }
    else
    {
        ;i<=m;i++)
        {
            flag=false;
            ) {flag=true;break;}
            if(flag) break;
            ;k<=n;k++)
              ) {flag=true;break;}
            if(!flag) ans++;
        }
    }
    printf("%d",ans);
    ;
}

50分暴力

我们统计一个前缀和,用来记录从每个点出发向右最远能扩展到的位置,然后我们枚举第一轮的右端点,然后判断在当前这种划分下是否合格,怎么判断是否合格呢,我们可以判断一段区间左端点是否可以扩展到右端点以外,如果可以则说明这种情况是合法的,ans++。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
using namespace std;
bool flag,vis[N];
int n,m,a[N],sum[N],ans;
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int work()
{//预处理,x佬说在预处理一个点往右能扩展到的区间要倒这枚举
    int r=m;sum[m]=m,vis[a[m]]=true;//最后一个点能扩展到的最远的位置就是他自己
    ;i;i--)
    {
        if(!vis[a[i]]) sum[i]=r,vis[a[i]]=true;//如果这个点在之前(这里的之前是指原序列的当前点的后面,因为我们是倒着枚举的)没有出现过,说明到现在这段区间是合法的
        else//这个点如果在之前出现过,那么要使包含这个点的这个区间合法,我们就要找到那个之前出现过他的位置,从这个点到那个位置这段区间才是合法的(合法的定义为一段不包含同一种音乐的区间)
        {
            while(i<r)
            {
                if(a[i]==a[r]) {r--; break;}//找他之前出现过的位置,这个位置往前一个位置就是这段合法区间的右端点
                vis[a[r--]]=false;
            }
            sum[i]=r;
        }
    }
}
int main()
{
    freopen("music.in","r",stdin);
    freopen("music.out","w",stdout);
    n=read(),m=read();int j,s;
    ;i<=m;i++) a[i]=read();
    work();//我们预处理出从每一个点向右最多能扩展到的位置,即为以这个点为左端点的情况下,哪一段区间是合法的,最大能扩展到的位置就是保证能够合法的区间
    if(n<m)//我们分两种情况讨论,一种是n<m,一种是n>m,在第一种情况下我们一定可以分出>=2轮,在第二种情况下即为小于两轮
    {
        ;i<=n;i++)//这个地方我们枚举的是第一轮的右端点,左端点固定为1.
        {
            ]<i) break;flag=false;//如果第一轮就不合法,直接break,因为往后的长度中一定要包含这个区间,这个区间都不合法,往后的一定都不合法
            ;j<=m;j+=n)//判断分成的每一段是否都合法,我们知道一段的长度为n
            {
                //对于除第一轮以外的轮数,我们还是有两种情况,第一种为完整的n个,另一种是不完整的,只有在最后一轮的时候才有可能是不完整的,这样最后一轮的右节点一定是m
                >m&&j<=m) s=m; ;//n为每一轮的长度,若左节点为i,那么右节点为i+n-1
                if(sum[j]<s) {flag=true; break;}//不可行的情况
            }
            if(!flag) ans++;
        }
    }
    else//这种情况我们就不需要枚举了,直接判断我们划分成的这两轮/一轮是否合法就行了
    {
        ;i<n;i++)//这个地方不能单纯枚举到m,因为一轮的长度为n所以在这之前我们听过的歌有n种可能
        {
            if(i<m)//这个地方我们要分类讨论了,在这种情况下有可能有两种情况,一种是将整段分为两轮,一种是就只有一轮
              {]>=i&&sum[i+]==m) ans++;}//分别判断这两轮是否都满足条件
            ]==m) ans++;//只有一轮的时候,我们就只需要判断这一轮是否满足条件就好了
         }
    }
    printf("%d",ans);
    ;
}

AC代码

             

                      距 NOIp2017 还剩 30 天

                               你可以做的事情还有很多,即使到最后一秒也不要放弃,因为不到结束的那一刻谁也不知道结果会怎样。

10.1综合强化刷题 Day1 morning的更多相关文章

  1. 10.1综合强化刷题 Day1 afternoon

    一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图, ...

  2. 10.1综合强化刷题 Day1

    a[问题描述]你是能看到第一题的 friends 呢.——hja何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为字符串定义了新的权值计算方法.一个字符串由小写字母组成,字符串的权 ...

  3. 10.1综合强化刷题 Day3 morning

    竞赛时间:????年??月??日??:??-??:?? 题目名称 a b c 名称 a b c 输入 a.in b.in c.in 输出 a.out b.out c.out 每个测试点时限 1s 1s ...

  4. 10.1综合强化刷题 Day3 afternoon

    竞赛时间:????年??月??日??:??-??:?? 题目名称 a b c 名称 a b c 输入 a.in b.in c.in 输出 a.out b.out c.out 每个测试点时限 1s 1s ...

  5. 10.1综合强化刷题 Day2 morning

    一道图论神题(god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有 ...

  6. 10.1综合强化刷题 Day2 afternoon

    最大值(max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的 ...

  7. 10.1综合强化刷题 Day7

                                                                                       noip提高组模拟赛       ...

  8. 10.1综合强化刷题 Day6

    T1 排序 题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. ...

  9. 10.1综合强化刷题 Day5

    T1 拼不出的数 lost.in/.out/.cpp[问题描述]3 个元素的集合{5; 1; 2}的所有子集的和分别是0; 1; 2; 3; 5; 6; 7; 8.发现最小的不能由该集合子集拼出的数字 ...

随机推荐

  1. HashTable, HashMap,TreeMap区别

    java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类.Map是将键映射到值的对象,一个映射不能包含重复的键:每个键最多 ...

  2. HDU 4919 Exclusive or 数学

    题意: 定义 \[f(n)=\sum\limits_{i=1}^{n-1}(i\oplus (n-i))\] 求\(f(n),n \leq 10^{500}\) 分析: 这个数列对应OEIS的A006 ...

  3. Java开发经验

    两个类要传递参数: 1.构造方法 2.方法的参数 3.静态的变量

  4. 03014_EL技术

    1.EL表达式概述 EL(Express Language)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 2.EL从域中取出数据(EL最重要的作 ...

  5. 云计算之路-阿里云上:在SLB上部署https遇到的问题及解决方法

    一.问题场景 这个问题只会出现在云服务器操作系统使用Windows Server 2012的场景,如果使用的是Windows Server 2008 R2则不存在这个问题. 二.https部署场景 1 ...

  6. Wordpress 自定义文章类型添加 Categoried、Tags

    默认情况下 ,自定义文章类型没有分类和标签属性,需要通过 register_taxonomy_for_object_type 手动注册文章分类和标签,可以通过在 functions.php 或插件中添 ...

  7. 实战小项目之IMX6 VPU使用

    项目简介 基于官方的demo进行修改,限于能力问题,并没有将功能代码完全从官方的demo中分离出来,还是基于原来的框架进行修改,做了一些简单的封装,我做的工作如下: 使用自己的采集程序 定义6中工作模 ...

  8. 使用jsp读取TXT格式文件

    <%@page import="java.io.BufferedReader"%> <%@page import="java.io.FileReader ...

  9. 计算两个日期之间的天数差C++/java

    1--Java 分析:调用java中Calendar类 int days(Date date1,Date date2){ Calendar cal = new Calendar.getInstance ...

  10. nginx访问控制allow、deny(ngx_http_access_module)

    单看nginx模块名ngx_http_access_module,很多人一定很陌生,但是deny和allow相比没一个人不知道的,实际上deny和allow指令属于ngx_http_access_mo ...