花&五子棋&凉宫春日的忧郁&Back and Forth

刚开始感觉是组合数学…没想到是跟喝汤差不多的一道DP.

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
#define ll long long
ll dp[maxn][4][2];
const int mod=1e9+7;
void init(ll s){
    memset(dp,0,sizeof(dp));
    dp[1][1][0]=s;
}
int main(){
    int t;scanf("%d",&t);
    while(t--) {
        ll n, s;
        scanf("%lld%lld", &n, &s);
        init(s);
        for(int i=2;i<=n;++i){
            dp[i][1][0]=(dp[i-1][1][0]*(s-1)%mod+dp[i-1][2][0]*(s-1)%mod)%mod;
            dp[i][2][0]=dp[i-1][1][0];
            dp[i][3][1]=dp[i-1][2][0];
            dp[i][1][1]=((dp[i-1][1][1]*(s-1)%mod+dp[i-1][2][1]*(s-1)%mod)%mod+dp[i-1][3][1]*(s-1)%mod)%mod;
            dp[i][2][1]=dp[i-1][1][1];
        }
        ll res=0;
        res=((dp[n][1][1]+dp[n][2][1])%mod+dp[n][3][1])%mod;
        printf("%lld\n",res);
    }
    return 0;
}

五子棋

模拟 斜线那个注意一下.

#include <bits/stdc++.h>
using namespace std;
int mapp[250][250];
bool check_updown(int x,int y)
{
    int sum=1;
    for(int i=x+1;i<=225;++i){
        if(mapp[x][y]==mapp[i][y]) sum++;
        else break;
    }
    for(int i=x-1;i>=1;--i){
        if(mapp[x][y]==mapp[i][y]) sum++;
        else break;
    }
    if(sum>=5) return 1;
    return 0;
}
bool check_rightle(int x,int y)
{
    int sum=1;
    for(int i=y+1;i<=225;++i){
        if(mapp[x][y]==mapp[x][i]) sum++;
        else break;
    }
    for(int i=y-1;i>=1;--i){
        if(mapp[x][y]==mapp[x][i]) sum++;
        else break;
    }
    if(sum>=5) return 1;
    return 0;
}
bool check_rightxie(int x,int y)
{
   int sum=1;
    for(int i=1;x+i<=225&&y+i<=225;++i){
        if(mapp[x][y]==mapp[x+i][y+i]) sum++;
        else break;
    }
    for(int i=1;x-i>=1&&y-i>=1;++i){
        if(mapp[x][y]==mapp[x-i][y-i]) sum++;
        else break;
    }
    if(sum>=5) return 1;
    return 0;
}
bool check_leftxie(int x,int y)
{
   int sum=1;
    for(int i=1;x+i<=225&&y-i>=1;++i){
        if(mapp[x][y]==mapp[x+i][y-i]) sum++;
        else break;
    }
    for(int i=1;x-i>=1&&y+i<=225;++i){
        if(mapp[x][y]==mapp[x-i][y+i]) sum++;
        else break;
    }
    if(sum>=5) return 1;
    return 0;
}
int check_all(int x,int y)
{
    if(check_leftxie(x,y)||check_updown(x,y)||check_rightle(x,y)||check_rightxie(x,y))
    {
        return 1;
    }
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    int x,y;
    int flag=0;
    for(int i=1; i<=t; ++i)
    {
        scanf("%d%d",&x,&y);
        if(flag) continue;
        if(i%2==1)
        {
            mapp[x][y]=1;
        }
        else
        {
            mapp[x][y]=2;
        }
        if(check_all(x,y))
        {
            flag=i;
        }
    }
    if(!flag) puts("Tie");
    else
    {
        if(flag&1) printf("A ");
        else printf("B ");
        printf("%d\n",flag);
    }
    return 0;
}

凉宫春日的忧郁

取对数…..

#include <bits/stdc++.h>
const double eps=1e-6;
using namespace std;
 
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        double n,m;
        cin>>n>>m;
        double a=1,b=0;
        a=m*log10(n);
        for(int i=1; i<=m; ++i)
        {
            b+=log10(i);
        }
        if(a-b>=eps)
        {
            puts("No");
        }
        else puts("Yes");
    }
    return 0;
}

Back and Forth

想练一下DFS 结果题意被别人误导…..

#include <bits/stdc++.h>
const double eps=1e-6;
using namespace std;
int a[12],b[12],ans;
int tmp;
map<int,int>mp;
int sum;
void dfs(int now,int p,int pre){
     if(now==1){
       tmp=ans;
       tmp-=a[p];
       b[11]=a[p];
       a[p]=0;
       for(int j=1;j<=11;++j){
        if(b[j])dfs(2,j,p);
       }
       a[p]=b[11];
     }
     if(now==2){
        tmp+=b[p];
        a[pre]=b[p];
        b[p]=0;
        for(int i=1;i<=10;++i){
            if(a[i])dfs(3,i,p);
        }
        b[p]=a[pre];
        tmp-=b[p];
     }
     if(now==3){
        tmp-=a[p];
        b[pre]=a[p];
        a[p]=0;
        for(int i=1;i<=11;++i){
            if(b[i])dfs(4,i,p);
        }
        a[p]=b[pre];
        tmp+=a[p];
     }
     if(now==4){
        if(!mp[tmp+b[p]]){
            mp[tmp+b[p]]=1;
            sum++;
        }
     }
}
int main(){
    for(int i=1;i<=10;++i){
        scanf("%d",&a[i]);
    }
    ans=1000;
    for(int i=1;i<=10;++i){
        scanf("%d",&b[i]);
    }
    for(int i=1;i<=10;++i){
        dfs(1,i,0);
    }
    printf("%d",sum);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/smallocean/p/10284583.html