BC 74 div2

来源:互联网 发布:支持mac的网游加速器 编辑:程序博客网 时间:2024/06/06 03:44

T1:


*****当and mod 1e9+7时,若是2个小于1e9+7的数相加,则不需要用ll。

但这道题是乘25!!!!!!!!!

以后不能惯性思维直接用int。******



如果 s[i]!=0,那么s[i+1]=s[i]-1;

首先查一遍,如果出现错误,ans=0;

记0出现的次数为o

则ans=26*25^o;


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long mo=1e9+7;
int a[100005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
    int ans=26;
        int n;
        cin>>n;
        memset(a,0,sizeof(a));
        for(int i=1;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=1;i<n;i++)
        {
            if(!a[i])
            {
                ans=(ans*25)%mo;
            }
            else if(a[i]!=a[i+1]+1)
            {
                ans=0;
                break;
            }
        }
        cout<<ans<<endl;
    }
}


T2:

对于每组数据的6个点做一次floyd,然后对于每两个点有共6*6种情况,总复杂度约36n;

代码:

注意别老忘了scanf!!!!

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int mo=1e9+7;
int s[7][7],a[7];


inline jdz(int x)
{
if (x<0)
return -x;
else
return x;
}


#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mo=1e9+7;
int t,n,m,a[7],s[7][7],x,y;


int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=1;i<=6;i++) 
scanf("%d",&a[i]);
for (int i=1;i<=6;i++) 
for (int j=1;j<=6;j++) 
s[i][j]=abs(a[i]-a[j]);

s[1][2]=s[2][1]=s[3][4]=s[4][3]=s[5][6]=s[6][5]=1;

for (int i=1;i<=6;i++)
for (int j=1;j<=6;j++)
for (int k=1;k<=6;k++)
s[j][k]=min(s[j][k],s[j][i]+s[i][k]);

ll sum=0;
for (ll k=1;k<=m;k++)
{
scanf("%d%d",&x,&y);
int ans=abs(x-y);
for (int i=1;i<=6;i++)
for (int j=1;j<=6;j++)
ans=min(ans,abs(x-a[i])+s[i][j]+abs(y-a[j]));
sum=(sum+k*ans)%mo;
}
printf("%lld\n",sum);
}
return 0;
}


T3:

初步一想这样写比较保险:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
int dp[1<<17],a;
ll ans,mo=1e9+7;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
    int n,m,ma=0;
    int x,y;
    ll ans=0;
    memset(dp,30,sizeof(dp));
    dp[0]=0;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    {
    scanf("%d",&a);
    for (int j=1;j<=(1<<17);j++)
    {
    dp[j]=min(dp[j],dp[j^a]+1);//方法二的情况
    for (int k=0;k<=17;k++)
    dp[j]=min(dp[j],dp[j^(1<<k)]+1);//方法一的情况
    }
    }
    for (int i=1;i<=m;i++)
    {
    scanf("%d%d",&x,&y);
    ans=(ans+dp[x^y]*i)%mo;
    }
    cout<<ans<<endl;
    }

一想这样时间应该会超。

但居然过了。。。。。。。。1600ms。





0 0
原创粉丝点击