zoukankan      html  css  js  c++  java
  • 日常水题

      

    输出 :2

    这道题是道水题,当时卡学长了好长时间 所以写个题解发一下。

    首先仔细看题 每次可更改左上角的矩阵中的数字,然后就可以简单的水过了,考虑一下搜索,爆搜嗯只有20分(还不是数据太水!加一个小贪心吧,左下角如果有1的话肯定会更改前面更改过得值,所以这时可以直接从右下角开始搜索可以直接找到最优解。

    #include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<iomanip>
    #include<ctime>
    #include<queue>
    #include<map>
    #include<vector>
    #include<stack>
    #include<algorithm>
    using namespace std;
    
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    
    const int maxn=100;
    int n,ans=100;//不易太大或太小毕竟是搜索
    char a[maxn][maxn];
    int b[maxn][maxn];
    
    int check()
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(b[i][j]==1)return 0; 
            }
        }
        return 1;
    }
    
    void alter(int x,int y)//vt 改变 更改 修改
    {
        for(int i=1;i<=x;i++)
            for(int j=1;j<=y;j++)
                b[i][j]^=1;
        return;
    }
    
    void restore(int x,int y)//restore vt 恢复 使复原
    {
        for(int i=1;i<=x;i++)
            for(int j=1;j<=y;j++)
                b[i][j]^=1;
        return;
    }
    
    void dfs(int num)
    {
        if(num>=ans)return;
        if(check()==1)if(ans>num){ans=num;return;}
        for(int i=n;i>=1;i--)
        {
            for(int j=n;j>=1;j--)
            {
                if(b[i][j]==1)
                {
                    alter(i,j);
                    dfs(num+1);
                }
            }
        }
        return;
    }
    
    int main()
    {
        //freopen("1.in","r",stdin);
        n=read();
        for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                b[i][j]=a[i][j]-48;
        dfs(0);
        printf("%d
    ",ans);//根本不可能有不能复原的情况
        return 0;
    }
    月考考崩祭~

     

    心情不好的时候总会刷几道水题,慢慢往上爬,可是真心难受,坚持不下去了,那不还得坚持,改变那些人的看法!

    这道题是一道对于栈的理解应用十分简单,5~10min就可以码完,高兴收工,栈:先进后出。还有一些技巧什么的,但细节不多.

    #include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<iomanip>
    #include<ctime>
    #include<queue>
    #include<map>
    #include<vector>
    #include<stack>
    #include<algorithm>
    using namespace std;
    
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    
    int n;
    char a[500];//输入
    char b[500],t=0,flag=0;//记录符号
    int q[500],h=0;//记录数字
    map<string,char>c;//add,min,max转换成字符
    string s="";//记录字符串
    
    int main()
    {
        freopen("1.in","r",stdin);
        n=read();c["add"]='+';
        c["min"]='<';c["max"]='>';
        while(n--)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            memset(q,0,sizeof(q));
            t=0,h=0;
            scanf("%s",a+1);
            int len=strlen(a+1);
            for(int i=1;i<=len;i++)
            {
                if(a[i]=='a'||a[i]=='d'||a[i]=='m'||a[i]=='i'||a[i]=='n'||a[i]=='a'||a[i]=='x')
                {
                    s+=a[i];
                }
                else 
                {
                    int u=0;
                    if(s!="")
                    {
                        b[++t]=c[s];
                        s="";
                    }
                    if(a[i]>='0'&&a[i]<='9')
                    {
                        u=u*10+(a[i]-48);
                        while(a[i+1]>='0'&&a[i+1]<='9')
                        {
                            ++i;
                            u=u*10+(a[i]-48);
                        }
                        q[++h]=u;
                    }
                    if(a[i]==')')
                    {
                        int x=q[h];--h;
                        int y=q[h];--h;
                        if(b[t]=='>')q[++h]=max(x,y);
                        if(b[t]=='<')q[++h]=min(x,y);
                        if(b[t]=='+')q[++h]=x+y;
                        t--;
                    }
                }
            }
            printf("%d
    ",q[h]);
        }
        return 0;
    }
    刷进第一页

    有时候多希望一个人能多陪陪我,(╯﹏╰)。

  • 相关阅读:
    Android开发实例关键点讲解系列之一:Eclipse中建立Android工程
    类欧几里得小记
    【清华集训2017模拟12.09】塔
    【51nod1792】Jabby's segment tree
    【51nod1220】约数之和
    【51nod 2026】Gcd and Lcm
    【JZOJ5180】【NOI2017模拟6.29】呵呵
    2017noip总结
    2017.11.7总结
    Codeforces Round #395 Div.1 C pacifist【JZOJ5449】Pacifist
  • 原文地址:https://www.cnblogs.com/chdy/p/10054227.html
Copyright © 2011-2022 走看看