博主只做了前四题啊哈
给大家良心翻译一下:
1、题意:读入n,k输出 是n的倍数 且 末位至少有k个0 的最小正整数
题解:你最大乘10就会有一个0,作为偶数和尾数为5的数字来说,可以分别通过乘5和乘偶数获得尾数的10,而并不需要每次都乘10,但奇数且尾数不是5的数字就很无奈了,还是乖乖乘10吧。既然前一类那么特殊,就dfs搜索呗,为了一次找到最优解&&缩时间,可以乘越来越小的数字(反正早晚都要乘,早晚都一样)
代码:
#include <cstdio>
#define LL long long
using namespace std;
LL n,mb;bool fff=0;int k;
void work(int t,LL n,int he)
{
if (fff) return;
if (n%mb==0)
{
printf("%lld",n);
fff=true;
return;
}
for (int i=1;i<=he;i++)
if (!fff) work(t+1,n*i,i);
}
int main()
{
scanf("%lld%d",&n,&k);
mb=1;
for (int i=1;i<=k;i++) mb=mb*10;
if (k==0){printf("%d",n); return 0;}
if (n%2==0 || n%10==5)work(1,n,10);
else printf("%lld",mb*n);
}
2、题意:flat就当是电梯吧。。。不然很凌乱
每层楼电梯数目相等,不幸的是,Po不记得每层楼有多少电梯了,但是他记得电梯标号从1开始从低层到高层,也就是说,前几个电梯一楼,下几个电梯二层。Po不记得电梯的总数,假设建筑物无穷高。Po记得几个编号电梯的位置。这些信息不自相矛盾,这意味着存在一个与Po记忆吻合的建筑每层电梯数都相等
给这些信息,能否确定x电梯在第几层楼?
题解:枚举每一层有多少电梯。注意如果不能确定每一层的电梯数目,但是这些数目使x电梯在一层楼上,也要输出在“第几层楼”
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int minn[120],maxx[120],fl=0,fd=0,x[120],y[120],n,m;
bool check(int f)
{
for (int i=1;i<=m;i++)
if ((x[i]-1)/f+1!=y[i]) return false;
return true;
}
int main()
{
int i,j,ans=0;
memset(minn,0x7f,sizeof(minn));
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d%d",&x[i],&y[i]);
minn[y[i]]=min(minn[y[i]],x[i]);
maxx[y[i]]=max(maxx[y[i]],x[i]);
fd=max(fd,maxx[y[i]]-minn[y[i]]);
}
int hh=0;
if (fd==0) fd++;
for (i=fd;i<=100;i++)
if (check(i))
{
ans=(n-1)/i+1;
if (hh==0) hh=ans;
if (ans!=hh){printf("-1");return 0;}
}
printf("%d",hh);
}
3、题意:读入小写英文字母(即26字母从a到z)找茬行动开始。有错时,三个或更多的辅音连续的一行字。例外是,如果块的所有辅音字母相同,那么这一块(即使其长度大于三)并不被认为是一个错误。
即一个单词有错误:有至少三个辅音字母连续而且块内有至少两个不同的字母
例如:下面的话有错别字:“hellno”、“hackcerrs”和“backtothefutttture”
下面的话没有错别字:“helllllooooo”、“生存还是死亡”和“oooooo”。
当发现一个错字,就用‘ ’分割开,求最后的字符串
把下列字母看作是唯一的元音:a,e,i,o,u 其他所有的字母都在这个问题中的辅音。
题解:模拟。注意如果这个词被空格隔到了下一个便是下一个的开始,要辅音字母++
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char st[3005],ans[3005],he[3005];
int main()
{
int fu=0,i,len=0,num=0;
gets(st);
int l=strlen(st);
for (i=0;i<l;i++)
{
if (st[i]!='a' && st[i]!='e' && st[i]!='i' && st[i]!='o' && st[i]!='u') fu++,he[++len]=st[i];
else fu=0,len=0;
while (len>1 && he[len]==he[len-1]) len--;
if(fu>=3 && len!=1)
ans[++num]=' ',fu=1,he[1]=st[i],len=1;
ans[++num]=st[i];
}
for (i=1;i<=num;i++)
printf("%c",ans[i]);
}
4、题意:每一个号码九位整数,第一位不是0,每一个号码都不一样,对于每个串,求出最短的识别此串的字符串
栗子:Polycarp's contacts: 123456789, 100000000 and 100123456, then:
if he enters 00 two numbers will show up: 100000000 and 100123456,
if he enters 123 two numbers will show up 123456789 and 100123456,
if he enters 01 there will be only one number 100123456.
题解:字符串的处理,这里是一个伪AC自动机,详情都见注释咯
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#define INF 1e9
using namespace std;
char st[70005][10];
int num[4000005],ch[4000005][10],cnt;
int main()
{
int now,i,j,l,ans,n,id;
scanf("%d",&n);
for (i=1;i<=n;i++)//AC自动机处理方式 ,给每一个子串建立AC自动机,找找哪个点不是自己的
{
scanf("%s",st[i]);
for (l=0;l<9;l++)//枚举长度
{
now=0;
for (j=l;j<9;j++)
{
if (!ch[now][st[i][j]-'0']) ch[now][st[i][j]-'0']=++cnt;
now=ch[now][st[i][j]-'0'];
if (!num[now]) num[now]=i;
else if (num[now]!=i) num[now]=-1;
}
}
}
for (i=1;i<=n;i++)//看看哪个串只是自己的,找出最短的那个
{
ans=INF;
for (l=0;l<9;l++)//枚举初始位置,搜索最短
{
now=0;
for (j=l;j<9;j++)
{
now=ch[now][st[i][j]-'0'];
if (num[now]==i)
if (j-l+1<ans) ans=j-l+1,id=l;//判断开始的位置和最短的长度
}
}
for (j=id;j<=id+ans-1;j++) printf("%c",st[i][j]);
printf("\n");
}
}