Codeforces Round #213 (Div. 2)(矩阵)

来源:互联网 发布:nginx本地c盘映射 编辑:程序博客网 时间:2024/06/06 01:38

A - Good Number

刚开始题意理解错了,wa了一次

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int N,K,a;int vis[10];bool is_good(int m){    memset(vis,0,sizeof(vis));    while(m>0)    {        int x=m%10;        vis[x]++;        m/=10;    }    for(int i=0;i<=K;i++)        if(!vis[i]) return false;    return true;}int main(){    scanf("%d%d",&N,&K);    int ans=0;    while(N--)    {        scanf("%d",&a);        if(is_good(a)) ans++;    }    cout<<ans<<endl;    return 0;}

B. The Fibonacci Segment

求最长的斐波那契数列

遍历一遍,如果满足则更新最大值,并保存下到当前的位置

#include<iostream>#include<cstdio>using namespace std;int n;int a[100010];void solve(){    int ans=2,i=3,x=1;    while(i<=n)    {        if(a[i]!=a[i-1]+a[i-2])        {            x=i-1;            i++;            continue;        }        ans=max(ans,i-x+1);        i++;    }    cout<<ans<<endl;}int main(){    cin>>n;    for(int i=1;i<=n;i++)    cin>>a[i];    if(n<=2)    {        cout<<n<<endl;        return 0;    }    solve();    return 0;}
C. Matrix
题意:给你一个a,和一串数字s。让你求由b[i,j] = s[i]*s[j],构成的数组矩阵中和等于a的子矩阵的个数。

观察一下,矩阵其实很特殊。可以提取出每行的系数。

a1*(a1,a2,..,an)

a2*(a1,a2,..,an)

an*(a1,a2,..,an)

用sum[i]表示数列a的前i项和。

那么任意一个子矩阵和可以表示为(sum[col1]-sum[col0])*(sum[row1]-sum[row0]) (col0<y<=col1,row0<x<=row1)

然后n^2枚举统计就好了,注意一些细节

考虑一个矩形(x, y, z, t)的sum和等于 (s[x] + s[x+1] + ... +s[y]) * (s[z] + s[z+1] + ... s[t]),所以处理出所有子序列的和即可,有些小细节要注意比如说0。

#include<iostream>#include<cstring>#include<string>using namespace std;typedef long long LL;LL hash[36010],sum[4040];int a;string s;int main(){    cin>>a>>s;    int len=s.size();    memset(sum,0,sizeof(sum));    memset(hash,0,sizeof(hash));    for(int i=0;i<len;i++)        sum[i+1]=sum[i]+s[i]-'0';    for(int i=1;i<=len;i++)        for(int j=0;j<i;j++)        hash[sum[i]-sum[j]]++;    LL cnt=0L;    if(a==0)    {        for(int i=0;i<=sum[len];i++)        cnt+=hash[0]*hash[i];    }    for(int i=1;i<=sum[len];i++)        if(a%i==0&&a/i<=sum[len])        cnt+=hash[a/i]*hash[i];    cout<<cnt<<endl;    return 0;}


0 0
原创粉丝点击