位运算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. Python—numpy.bincount()

    1.它大致说bin的数量比x中的最大值大1,每个bin给出了它的索引值在x中出现的次数.下面,我举个例子让大家更好的理解一下: # 我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为 ...

  2. hibernate 一级缓存、二级缓存

    一级缓存:——session一旦关掉就没有了.使用 load和get加载对象的时候,会自动加载到缓存,读取的也会读缓存. public void huancun(){ Session session= ...

  3. 前端多媒体(7)—— 在浏览器中实现rtmp推流

    示例:https://young-cowboy.github.io/gallery/rtmp_client/index.html 在国内的直播场景中通常使用,rtmp协议作为推流协议.RTMP是Rea ...

  4. Arc077_E Guruguru

    传送门 题目大意 有$m$个点编号从小到大按照顺时针编成了一个环,有一枚棋子,每次移动可以选择顺时针移动到下一个或者直接移动到编号为$x$的点,现在有$n-1$次数操作,第$i$次要把棋子从第$A_i ...

  5. URAL1517Freedom of Choice(后缀数组)

    Background Before Albanian people could bear with the freedom of speech (this story is fully describ ...

  6. Poj 3903 Stock Exchange(LIS)

    一.Description The world financial crisis is quite a subject. Some people are more relaxed while othe ...

  7. Hdu 4762 网络赛 高精度大数模板+概率

    注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...

  8. char与wchar_t数据类型

    转自:http://blog.itpub.net/27634692/viewspace-752200/ 有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,有必要把来龙去脉搞清楚. ...

  9. C语言学习笔记--单引号和双引号

    (1)C 语言中单引号用来表示字符字面量(是个数值)被编译为对应的 ASCII 码 (2)C 语言中双引号用来表示字符串字面量(是个指针)被编译为对应的内存地址 例如:'a'表示字符字面量(97),在 ...

  10. BluetoothSetServiceState 函数

    DWORD BluetoothSetServiceState( HANDLE hRadio, BLUETOOTH_DEVICE_INFO* pbtdi, GUID* pGuidService, DWO ...