日常水题

  

输出 :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\n",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\n",q[h]);
    }
    return 0;
}
刷进第一页

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

posted @ 2018-12-02 17:25  chdy  阅读(175)  评论(0编辑  收藏  举报