【codefoces#434】div 2

比赛题目

博主只做了前四题啊哈

给大家良心翻译一下:

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");
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值