【模拟】贾老二的工件 jia.pas/c/cpp

贾老二的工件
jia.pas/c/cpp

 

【题目描述】

Mr.L很多工件,最常见的工件都是长条形的,但其顶端是凹凸不平的,即不同位置的高度不同。现在Mr.L有两个最常见的工件,他想将它们完全放入另一种罕见的可容纳高度不超过k的工件中,问该罕见的工件的最小长度。

 

【输入格式】

输入来自文件jia.in,包括三行。第一行包含一个不超过20的正整数k;接下来每行有一个长度不超过100的正整数串,其中的每个数都在1到9之间,表示该常见工件对应位置的高度。

 

【输出格式】

输出到文件jia.out,包括一个数字即罕见的工件的最小长度。如果无解则输出“Impossible”。

 

【样例输入1】

4

2213

231223

 

【样例输出1】

7

 

【样例输入2】

1

2112

122111

 

【样例输出2】

Impossible

 

 

这一题模拟一次即可

至于扫描可以按如下图所示,固定第二个工件不动,把第一个工件从左到右移动

,这种可以用指针维护

当然,我用了一种简单的方法处理他们,把它们读成字符串a,b,在b前面加入a.length()那么多个'0',在b后面加上a.length()那么多个'0',在a后面加上b.length()个'0',下面拿样例1来说明

 2213                   --->         2213000000
 231223               --->         00002312230000

那么每一次从区间[l,r]扫描一次,a[i]-'0'+b[i]-'0' 就是工件当前位置的高,一次扫描完了后,要移动上面的位置,只需要把上面那个前面加上一个'0'即可  即a='0'+a,如下图所示

 

如果把上面都能弄对了,那就能的50分了

?没AC?还差一种情况,工件是可以翻转的!

那么只需要把 a 翻转一下(与翻转b是等同的),在重复上面的过程(Ctrl+C  Ctrl+V或者写成模块)

完了就AC了

 

C++ Code

/*
C++ Code
http://oijzh.cnblogs.com
*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define INF 0x7fffffff

int k;
string a,b;
int lena,lenb;
bool flag=false;
int best=INF;

void wrong() { printf("Impossible");exit(0); }

int calc(int l,int r)
{
    int sum;
    //printf("l=%d   r=%d\n",l,r);
    for(int i=l;i<=r;i++)
    {
        sum=(a[i]-'0')+(b[i]-'0');
        //printf("%d+%d=%d\n",(a[i]-'0'),(b[i]-'0'),sum);
        if(sum>k)return -1;
    }
    return r-l+1;
}

void work()
{
    int cc;
    for(int i=0;i<lena+lenb;i++)
    {
        //cout<<a<<endl<<b<<endl;
        cc=calc(min(i,lena),max(i+lena-1,lena+lenb-1));
        if(cc!=-1)flag=true;
        if(cc>0)best=min(best,cc);
        a='0'+a;
        //printf("\n");
    }
}

int main()
{
    freopen("jia.in","r",stdin);
    freopen("jia.out","w",stdout);
    scanf("%d",&k);
    getline(cin,a);//跳行
    getline(cin,a);
    string s=a;
    for(int i=0;i<a.length();i++)
        if(a[i]>k+'0') wrong();
    getline(cin,b);
    for(int i=0;i<b.length();i++)
        if(b[i]>k+'0') wrong();
        
    lena=a.length();lenb=b.length();
    for(int i=1;i<=lena;i++) b='0'+b;
    for(int i=1;i<=lena;i++) b=b+'0';
    for(int i=1;i<=lenb;i++) a=a+'0';

    work();
    
    a="";
    for(int i=0;i<s.length();i++)a=s[i]+a;
    for(int i=0;i<a.length();i++)
        if(a[i]>k+'0') wrong();
    work();
    
    if(flag)printf("%d",best);
    else wrong();
    return 0;
}

  

 

转载于:https://www.cnblogs.com/oijzh/archive/2012/10/23/2735623.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值