那些年,我们学过的文化课

背单词(word.c/cpp/pas)
【题目描述】
  fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词。 看着满篇的单词非常头疼, 而每次按照相同的顺序背效果并不好,于是 fqk 想了一种背单词的好方法!他把单词抄写到一个 n 行 m 列的表格里,然后每天背一行或者背一列。他的复习计划一共有 k 天,在k 天后, fqk 想知道,这个表格中的每个单词,最后一次背是在哪一天呢?
【输入格式】
  第一行三个整数 k m n  。
  接下来 k 行,每行的格式可能如下:
  1 r ,表示当前天 fqk 背了第 r 行的单词。
  2 c ,表示当前天 fqk 背了第 c 列的单词。
【输出格式】
  输出包含 n 行, 每行 m 个整数, 表示每个格子中的单词最后一次背是在哪天,如果这个单词没有背过,则输出 0 。
【输入样例】
  3 3 3
  1 2
  2 3
  1 3
【输出样例】
  0 0 2
  1 1 2
  3 3 3
【数据范围】
  对于 30% 的数据, n,m,k<=1000 。
  对于 100% 的数据, n,m<=5000,nm<=100000,k<=100000。
【时空限制】
  对于每个测试点,时间限制为 1s ,空间限制为 512MB 。

【题目分析】

  没有。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,k;
int a[5005][5005]={0};
int h[5005]={0},l[5005]={0};
int read()
{
    char ch;
    int a = 0;
    bool b = 0;
    while(!((((ch=getchar())>='0')&&(ch<='9'))||(ch=='-')));
    ch == '-'?b = 1:a = ch - '0';
    while(((ch = getchar()) >= '0') && (ch <= '9')) a = a * 10 + ch - '0';
    return b?-a:a;
}
int main()
{
    freopen("word.in","r",stdin);
    freopen("word.out","w",stdout);
    n=read();m=read();k=read();
    for(int i=1;i<=k;i++)
    {
        int x=read(),y=read();
        if(x==1)
            h[y]=i;
        if(x==2)
            l[y]=i;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            a[i][j]=max(h[i],l[j]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

 

【题目分析】

  dfs套dfs(因为数据太小2333)。

  第一个dfs我们找到所有满足长度的字符串然后检验这个字符串是否满足那么接下来又用到第二个Dfs,将满足长度的字符串脱水缩合(按规则合并),因为规则中都是两个字符组成的字符串合并成一个字符,那么我们从前往后搜索,从规则里面找出合并要求,两字符中前面的不用管 只把后面的更改(这样每一次脱水后的氨基酸都连在一起),Dfs,直到t==n&&q[t]=='a'

(合并到最后,并且最后结果为a)

 

#include<cstdio>
#include<iostream>
using namespace std;
char q[7],a[40],b[40],c[40];
int n,m,ans,flag;
void Dfs(int t)
{
    if(flag)return;
    if(t==n&&q[t]=='a')
    {flag=1;return;}
    for(int i=1;i<=m;i++)
      if(a[i]==q[t]&&b[i]==q[t+1])
      {
          q[t+1]=c[i];
          Dfs(t+1);
          q[t+1]=b[i];
      }
}
void check()
{
    flag=0;
    Dfs(1);
    if(flag)ans++;
}
void dfs(int t)
{
    if(t>n){check();return;}
    for(int i=0;i<=5;i++)
    {
        q[t]=char(i+'a');
        dfs(t+1);
    }
}
int main()
{
    freopen("merge.in","r",stdin);
    freopen("merge.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
      cin>>a[i]>>b[i]>>c[i];
    dfs(1);
    printf("%d",ans);
    return 0;
}

 

【题目分析】

  截图那么完美,可是我不会呀,有什么用呢

 

//什么都不会,只好码暴力...

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int mo=1e9+7;
const int maxn=200010;
long long ans=0;
long long n,m;
long long k[maxn],b[maxn];
long long read()
{
    char ch;
    long long a=0;
    bool b=0;
    while(!((((ch=getchar())>='0')&&(ch<='9'))||(ch=='-')));
    ch=='-'?b=1:a=ch-'0';
    while(((ch=getchar())>='0')&&(ch<='9')) a=a*10+ch-'0';
    return b?-a:a;
}

long long solve(long long l,long long r,long long x)
{
    if(l==r) 
        return (k[l]*x%mo+b[l])%mo;
    else 
        solve(l+1,r,(k[l]*x%mo+b[l])%mo);
}
int main()
{
    freopen("fx.in","r",stdin);
    freopen("fx.out","w",stdout);
    n=read();
    m=read();
    for(int i=1;i<=n;i++)
    {
        k[i]=read();
        b[i]=read();
    }
    for(int i=1;i<=m;i++)
    {
        char ch;
        cin>>ch;
        if(ch=='M')
        {
            int x;
            x=read();
            k[x]=read();
            b[x]=read();
        }
        if(ch=='Q')
        {
            int L,R,X;
            L=read();R=read();X=read();
            ans=solve(L,R,X)%mo;
            printf("%I64d\n",ans);
        }
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

 

posted @ 2016-11-09 20:19  [lemon]  阅读(185)  评论(0编辑  收藏  举报
……