2017-10-1 清北刷题冲刺班a.m
位运算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的更多相关文章
- 2017-10-4 清北刷题冲刺班p.m
P102zhx a [问题描述]你是能看到第一题的 friends 呢.——hja两种操作:1.加入一个数.2.询问有多少个数是?的倍数.[输入格式]第一行一个整数?,代表操作数量.接下来?行,每行两 ...
- 2017-10-4 清北刷题冲刺班a.m
P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...
- 2017-10-3 清北刷题冲刺班p.m
a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...
- 2017-10-3 清北刷题冲刺班a.m
P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...
- 2017-10-2 清北刷题冲刺班a.m
一道图论神题 (god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...
- 2017-10-2 清北刷题冲刺班p.m
最大值 (max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n ...
- 2017-10-1 清北刷题冲刺班p.m
一道图论好题 (graph) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...
- 2017-10-7 清北刷题冲刺班p.m
测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...
- 2017-10-7 清北刷题冲刺班a.m
测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...
随机推荐
- python 正则表达式(二)
下面列举了Python3的所有符号用法,别背,千万别背,用到时来查就行. 字符 含义 . 表示匹配除了换行符外的任何字符注:通过设置 re.DOTALL 标志可以使 . 匹配任何字符(包含换行符) | ...
- [BZOJ2780][SPOJ8093]Sevenk Love Oimaster
bzoj luogu 题面 给定n个模板串,以及m个查询串. 依次查询每一个查询串是多少个模板串的子串. sol 广义后缀自动机裸题? 先建出\(SAM\),然后记录一下每个节点分别在多少个模板串里出 ...
- bzoj 2118: 墨墨的等式 spfa
题目: 墨墨突然对等式很感兴趣,他正在研究\(a_1x_1+a_2y_2+ ... +a_nx_n=B\)存在非负整数解的条件,他要求你编写一个程序,给定\(N,\{a_n\}\)以及\(B\)的取值 ...
- bzoj 1043 下落的圆盘 —— 求圆心角、圆周长
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 求出每个圆没被覆盖的长度即可: 特判包含和相离的情况,注意判包含时 i 包含 j 和 ...
- Sublime 实践
1.下载开发版:http://www.sublimetext.com/dev 2.安装Package control: (1)按键ctrl+~ (2)在命令行中输入: import urllib2, ...
- Centos6.5 安装pip
1.下载 sudo wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 2.安装 python get-pip.py 参 ...
- HDU5438:Ponds(拓扑排序)
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Sub ...
- VIJOS:P1706(舞会)
描述 Arthur公司是一个等级森严的公司,它们有着严格的上司与下属的关系,公司以总裁为最高职位,他有若干个下属,他的下属又有若干个下属,他的下属的下属又有若干个下属……现接近年尾,公司组织团拜活动, ...
- ParentViewController中添加SubViewController(IOS学习)
我是用的是Container.addSubView的方法. 1. ParentViewController.m的@interface()中添加2个子vc的实例变量,代码如下 @property (no ...
- Java探索之旅(17)——多线程(1)
1.多线程 1.1线程 线程是程序运行的基本执行单元.指的是一段相对独立的代码,执行指定的计算或操作.多操作系统执行一个程序时会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被 ...