CF Round #616 (A,B,C 字符串,贪心,DFS)

http://codeforces.com/problemset/problem/616/A

A题:比较两个长整数的大小(可能含有前导0), 数据位数高达10^6位;考虑用字符串
一开始想的是把前导0,去掉,然后从高位到低位逐位比较;TLE了
下面是TLE代码:

#include<cstdio>
#include<cstring>
using namespace std;
#define N 1000005
char s1[N],s2[N];
int main()
{
    while(scanf("%s%s",s1,s2))
    {
        int ii=0,jj=0,c1=0,c2=0;
        for(int i=0;i<strlen(s1);i++){
            if(s1[i]!='0'){
                ii=i;
                break;
            }
            else
                c1++;
        }
        if(c1==strlen(s1))
          ii=strlen(s1)-1;
        for(int j=0;j<strlen(s2);j++){
            if(s2[j]!='0'){
                jj=j;
                break;
            }
            else
                c2++;
        }
        if(c2==strlen(s2))
          jj=strlen(s2)-1;
        int t=strlen(s1)-ii,p=strlen(s2)-jj,num=0;
        if(t>p)
            printf(">\n");
        else if(t<p)
            printf("<\n");
        else{
            for(int k1=ii,k2=jj;k1<strlen(s1);k1++,k2++){
                if(s1[k1]>s2[k2])
                {
                    printf(">\n");
                    break;
                }
                else if(s1[k1]<s2[k2]){
                    printf("<\n");
                    break;
                }
                else
                    num++;
            }
            if(num==t)
                printf("=\n");
        }
    }
    return 0;
}

然后换了种想法,既然去掉前导0,行不通,可不可以补上前导0,用string模板类,一次A掉;

#include<string>
#include<iostream>
#include<cmath>
using namespace std;
int  main()
{
    string a,b;
    while(cin>>a>>b)
    {
        if(a.length()>b.length()){
            string s(a.length()-b.length(),'0');
            b=s+b;
        }
        else{
            string s(b.length()-a.length(),'0');
            a=s+a;
        }char c=(a>b)?'>':((a<b)?'<':'=');
        cout<<c<<endl;
    }
    return 0;
}

http://codeforces.com/problemset/problem/616/B
B题:贪心实现
题目大意是(我来编一下=_=):小明请她女朋友去吃饭,但是他很modest,小明总是想挑便宜的饭店,而她女朋友是个有品位的人,总是想进高档餐厅,她也知道小明的小九九,于是他们想到了这样一个解决方法,假设所有的饭店都分布在 n 行,m 列的街道上,小明总是选择最便宜的饭店所在的那一列,而她女朋友总是选最高档的饭店所在的那一行,问最后她们会花费的费用。

贪心的思想:我们只用把每一行的最小值求出来,最后再求所有最小值中的最大值。

#include<cstdio>
#include<cstring>
#define MAXN 100+2
#define OXFF 0xffffffffff //注意点,一开始定义的是0xfffffff,wa了
__int64 s[MAXN][MAXN];
__int64 miv[MAXN]; 

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
            miv[i]=OXFF;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
              scanf("%I64d",&s[i][j]);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(s[i][j]<miv[i])
                    miv[i]=s[i][j];
            }
        }
        __int64 x=-1;
        for(int i=1;i<=n;i++){
                if(miv[i]>x)
            x=miv[i];
        }
        printf("%I64d\n",x);
    }
    return 0;
}

C题:题目大意:给定n 行,m列矩阵,矩阵的行列定位的是字符‘*’或’.’;
独立分析每个‘*’,并把它看成‘.’,计算通过此点联通的‘.’的个数;

原题链接:
http://codeforces.com/problemset/problem/616/C

DFS实现,可是自己并没有A掉,一直TLE。。。。。。。。 =_=!!!

#include<cstdio>
#include<cstring>
#define N 1002
char matrix[N][N];
int num,n,m;
int a[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int vis[N][N];

void DFS(int i,int j)
{
    for(int k=0;k<4;k++ )
    {
        int x=a[k][0]+i;
        int y=a[k][1]+j;
        if(x<0 || x>=n || y<0 || y>=m || matrix[x][y]!='.')
            continue;
        if(!vis[x][y])
        {
            vis[x][y]=1;
            DFS(x,y);
            num++;
        }
    }
}
int main()
{
        scanf("%d%d",&n,&m);
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
            scanf("%s",matrix[i]);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(matrix[i][j]=='*')
                {
                    num=1;
                    vis[i][j]=1;
                    DFS(i,j);
                    matrix[i][j]=num%10+'0';
                }
                memset(vis,0,sizeof(vis));
                printf("%c",matrix[i][j]);
            }
            printf("\n");
        }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值