位运算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。

#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 10
int n,bit[maxn],len;
int main(){
freopen("bit.in","r",stdin);freopen("bit.out","w",stdout);
scanf("%d",&n);
while(n){
bit[++len]=n%;
n/=;
}
int now=;
while(bit[now]==)now++;
bit[now]--;
while(bit[len]==&&len>=)len--;
if(len==)printf("");
else
for(int j=len;j>=;j--)printf("%d",bit[j]);
fclose(stdin);fclose(stdout);
return ;
}

100分

火柴棒

(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。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int now,anslen=0x7fffffff,ans[],sum[];
bool anspre;
struct node{
int num,cost,cnt;
}q[];
void dfs(int len,int res){
if(len>anslen)return;
if(res==){
bool flag=;
if(anslen>len)flag=;
if(q[].cnt==len)return;
anslen=len;
int lennow=,ansnow[];
for(int i=;i<=;i++)sum[i]=q[i].cnt;
//for(int i=1;i<=7;i++)cout<<sum[i]<<" ";
for(int i=;i<=;i++){
if(sum[i]){
lennow=lennow+;
ansnow[lennow]=q[i].num,sum[i]--;
break;
}
}
for(int i=;i<=;i++)
while(sum[i]){
lennow=lennow+;
ansnow[lennow]=q[i].num,sum[i]--;
}
for(int i=;i<=lennow;i++){
if(ans[i]>ansnow[i]){
flag=;break;
}
}
if(!anspre)flag=;
//cout<<anslen<<' ';cout<<endl;
if(flag==){
for(int i=;i<=anslen;i++)ans[i]=ansnow[i];
anspre=;
}
//for(int i=1;i<=anslen;i++)cout<<ansnow[i];cout<<endl;
return;
}
for(int i=;i<=;i++){
if(res-q[i].cost>=){
q[i].cnt++;
dfs(len+,res-q[i].cost);
q[i].cnt--;
}
}
}
bool cmp(node x,node y){
return x.num<y.num;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("stick.in","r",stdin);freopen("stick.out","w",stdout);
q[].num=,q[].cost=;
q[].num=,q[].cost=;
q[].num=,q[].cost=;
q[].num=,q[].cost=;
q[].num=,q[].cost=;
q[].num=,q[].cost=;
q[].num=,q[].cost=;
scanf("%d",&now);
dfs(,now);
for(int i=;i<=anslen;i++)printf("%d",ans[i]);
printf(" ");
if(now%==){
int num=(now-)/;
printf("");
for(int i=;i<=num;i++)printf("");
}
else {
int num=now/;
for(int i=;i<=num;i++)printf("");
}
fclose(stdin);fclose(stdout);
return ;
}

40分 暴力

/*
最大值直接特判一下,最小值用dp解决
dp[i]表示i根火柴能拼出的最小的数字,枚举该数字末尾的一位是几
*/
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <vector>
#include <set>
using namespace std;
long long dp[];
int f[],n;
int main()
{
freopen("stick.in","r",stdin);
freopen("stick.out","w",stdout);
f[]=; f[]=; f[]=; f[]=; f[]=;
f[]=; f[]=; f[]=; f[]=; f[]=;
dp[]=; dp[]=; dp[]=; dp[]=; dp[]=;dp[]=;
for (int i=; i<=; i++)
{
dp[i]=dp[i-f[]]*;
for (int j=; j<=; j++)
if (dp[i-f[j]]!=)
dp[i]=min(dp[i],dp[i-f[j]]*+j);
}
cin>>n;
cout<<dp[n]<<' ';
if (n%==) {cout<<; n-=;}
while (n){cout<<; n-=;}
return ;
}

100分 动态规划

听音乐

(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知道这个题目很长,但为了便于理解已经加了很多注释了……建议没看懂的同学们再重新看一遍……

#include<iostream>
#include<cstdio>
#define maxn 100010
using namespace std;
int n,m,a[maxn],ans;
bool vis[maxn];
int main(){
//freopen("Cola.txt","r",stdin);
freopen("music.in","r",stdin);freopen("music.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d",&a[i]);
for(int i=;i<n;i++){//枚举之前听过的歌的数量
bool flag=;
for(int j=;j<=n-i;j++){
if(vis[a[j]]){
flag=;
break;
}
vis[a[j]]=;
}
for(int j=;j<=n-i;j++)vis[a[j]]=;
if(flag)continue;
for(int j=n-i+;j<=m;j+=n){//区间起点
for(int k=j,l=;k<=m&&l<=n;k++,l++){
if(vis[a[k]]){
flag=;
break;
}
vis[a[k]]=;
}
for(int k=j,l=;k<=m,l<=n;k++,l++)vis[a[k]]=;
if(flag)break;
}
if(!flag)ans++;
}
printf("%d",ans);
fclose(stdin);fclose(stdout);
return ;
}

50分 暴力

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 100010
using namespace std;
int t[maxn],v1[maxn],v2[maxn],a[maxn];
int n,m,sum,ans;
bool OK(int x){
int i;
for(i=x-n+;i>=;i-=n)
if(!v2[i])return false;
i+=n;
if(i->&&!v1[i-])return false;
return true;
}
int main(){
freopen("music.in","r",stdin);freopen("music.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)t[i]=;sum=;
for(int i=;i<=min(n,m);i++){
t[a[i]]++;
if(t[a[i]]==)sum++;
if(!sum)v1[i]=;
else v1[i]=;
}
if(!sum)v2[]=;else v2[]=;
for(int i=n+;i<=m;i++){
t[a[i]]++;
if(t[a[i]]==)sum++;
t[a[i-n]]--;
if(t[a[i-n]]==)sum--;
if(!sum)v2[i-n+]=;
else v2[i-n+]=;
}
for(int j=;j<=n;j++)t[j]=;sum=;
int j;
for(j=m;j>=;j--){
t[a[j]]++;
if(t[a[j]]>=)break;
}
for(int i=m;i>max(,m-n);i--){
if(j<=i)
if(OK(i))ans++;
}
if(ans)printf("%d\n",((n>=m&&ans==m)?n:ans));
else printf("");
return ;
}

100分

2017-10-1 清北刷题冲刺班a.m的更多相关文章

  1. 2017-10-4 清北刷题冲刺班p.m

    P102zhx a [问题描述]你是能看到第一题的 friends 呢.——hja两种操作:1.加入一个数.2.询问有多少个数是?的倍数.[输入格式]第一行一个整数?,代表操作数量.接下来?行,每行两 ...

  2. 2017-10-4 清北刷题冲刺班a.m

    P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...

  3. 2017-10-3 清北刷题冲刺班p.m

    a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...

  4. 2017-10-3 清北刷题冲刺班a.m

    P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...

  5. 2017-10-2 清北刷题冲刺班a.m

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

  6. 2017-10-2 清北刷题冲刺班p.m

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

  7. 2017-10-1 清北刷题冲刺班p.m

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

  8. 2017-10-7 清北刷题冲刺班p.m

    测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...

  9. 2017-10-7 清北刷题冲刺班a.m

    测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...

随机推荐

  1. png8 png24 png32

    解释 PNG8 : 8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持不透明.索引透明.alpha透明. PNG24 : 支持2的24次方种颜色,表现为不透明.PS导出PNG24是会根据 ...

  2. COM组件的集合与包容

    集合与包容,实质就是组件之间的互相调用.即一个组件使用另一个组件的功能,达到代码复用的作用.只是这种复用是构建在二进制数据上的(因为被复用的组件常常以dll的格式存在),而不是像c++代码复用是以源文 ...

  3. BZOJ1345:[Baltic2007]序列问题

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  4. BZOJ5443:[CEOI2018]Lottery

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:https://www.lydsy.com/JudgeOnline/probl ...

  5. android开发之Bitmap 、byte[] 、 Drawable之间的相互转换

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  6. Erlang generic standard behaviours -- summary

    gen_server 相关的片段分析得也差不多了, 这篇作为一个简要的总结.这一系列相关的分析暂且告一段落(之后如有必要,还会回来的 ^^ ),下一个系列主要是以pool 相关, 包括但不仅限于开源项 ...

  7. HDOJ1213(并查集)

    set容器中的值互异,非常好用. 水题,直接贴代码了 #include<iostream> #include<cstdio> #include<set> using ...

  8. TS学习之接口

    TypeScript的核心原则之一是对值所具有的结构进行类型检查.接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. interface testType { name: string; ...

  9. project online get approvals task data 获取审批待办任务接口

    调用接口地址:重要 http://xxxx/sites/pwa/_vti_bin/PSI/ProjectServer.svc Header 三个必要参数: 其中SOAPAction写死就行,如果是on ...

  10. Java探索之旅(5)——数组

    1.声明数组变量:        double[] array=new double[10];         double array[]=new double[10];       double[ ...