您的位置:首页 > 其它

2017北京国庆刷题Day1 morning

2017-10-01 16:48 239 查看
期望得分:100+100+100=300

实际得分:100+100+70=270

[b]T1位运算1(bit)[/b]

[b]Time Limit:1000ms Memory Limit:128MB[/b]

题目描述

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。

最后一个非零数-1

#include<cstdio>
#include<iostream>
#define N 100002
using namespace std;
int n,m;
int a
,suf
;
bool vis
,t=true;
void read(int &x)
{
x=0; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}
void pre()
{
int r=m; vis[a[m]]=1; suf[m]=m;
for(int i=m-1;i;i--)
{
if(!vis[a[i]]) suf[i]=r,vis[a[i]]=true;
else
{
while(r>i)
{
if(a[r]==a[i]) { r--;break; }
vis[a[r--]]=false;
}
suf[i]=r;
}
}
for(int i=1;i<=m&&t;i++)
if(suf[i]<m)  t=false;
}
bool check(int x)
{
int first=0;
if(x)
{
first=n-x;
if(suf[1]<first) return false;
}
int r=first;
for(int i=first+1;i<=m;i+=n)
{
r=min(m,r+n);
if(suf[i]<r) return false;
}
return true;
}
int main()
{
freopen("music.in","r",stdin);
freopen("music.out","w",stdout);
read(n); read(m);
for(int i=1;i<=m;i++) read(a[i]);
pre();
int ans=0;
for(int i=0;i<n;i++)
if(n-i>m) ans+=t;
else ans+=check(i);
printf("%d",ans);
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: