训练日记

https://cn.vjudge.net/contest/228009#problem/Q

题意:

就是判断是否是完美匹配(每一个点都被匹配),简单水题

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
int a[100005];
int main()
{
    int t,i,j,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=1;i<n;i++)
            scanf("%d",&a[i]);
        if(n%2)
            printf("No\n");
        else
        {
            int ans;
            ans=0;
            for(i=n-1;i>0;i--)
            {
                if(a[i]==2)
                    ans--;
                else
                    ans++;
                if(ans<0)
                    break;
            }
            if(i==0)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
}

这个题我竟然没有1A,原因竟然是把输入T,写成了输入N

https://cn.vjudge.net/contest/228009#problem/E

题意;

就是看矩阵里某两个字符串出现的次数

分析:

两个深搜。。。。水题

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
char c[1005][1005];
int n,m,ans,ant;
int b[4][2]={1,0,-1,0,0,1,0,-1};
bool ok(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m)
        return true;
    return false;
}
void dfs1(int x,int y,int num)
{
    int i,aa,bb;
    if(num==3)
    {
        ans++;
        return;
    }
    for(i=0;i<4;i++)
    {
        aa=b[i][0]+x;
        bb=b[i][1]+y;
        if(num==0&&ok(aa,bb)&&c[aa][bb]=='i')
            dfs1(aa,bb,num+1);
        else
        if(num==1&&ok(aa,bb)&&c[aa][bb]=='r')
            dfs1(aa,bb,num+1);
        else
        if(num==2&&ok(aa,bb)&&c[aa][bb]=='l')
            dfs1(aa,bb,num+1);
    }
    return;
}
void dfs2(int x,int y,int num)
{
    int i,aa,bb;
    if(num==2)
    {
        ant++;
        return;
    }
    for(i=0;i<4;i++)
    {
        aa=b[i][0]+x;
        bb=b[i][1]+y;
        if(num==0&&ok(aa,bb)&&c[aa][bb]=='a')
            dfs2(aa,bb,num+1);
        else
        if(num==1&&ok(aa,bb)&&c[aa][bb]=='t')
            dfs2(aa,bb,num+1);
    }
    return;
}
int main()
{
    int t,i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%s",&c[i]);
        ans=ant=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(c[i][j]=='g')
                {
                    dfs1(i,j,0);
                }
                else
                if(c[i][j]=='c')
                {
                    dfs2(i,j,0);
                }
            }
        }
        printf("%d %d\n",ans,ant);
    }
}

https://cn.vjudge.net/contest/228009#problem/U

题意:

就是找出串里的字母没有一样的最长的串

分析:

用一个数组记录与此时位置相同字母前一次出现的位置

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define mod 1000000007
using namespace std;
int Next[500];
char s[10000005];
int maxn,l,r;
int main()
{
    int n,i,j,num,rr,ll,m;
    while(~scanf("%d",&n))
    {
        //cin>>s;
        scanf("%s",&s);
        memset(Next,-1,sizeof(Next));
        maxn=-1;
        l=r=0;
        rr=ll=0;
       // num=0;
       m=strlen(s);
        for(i=0;i<m;i++)
        {
            if(Next[s[i]]<ll)
            {
               Next[s[i]]=i;
               //rr=i;
               if(maxn<i-ll+1)
               {
                   maxn=i-ll+1;
                   r=i;
                   l=ll;
               }
            }
            else
            {
                ll=Next[s[i]]+1;
                Next[s[i]]=i;
                //rr=i;
            }
        }
        printf("%d %d %d\n",maxn,l,r);
    }
}

这个题我TLE好几次,就是在循环条件里用了s.size(),但是要是把长度赋给一个变量,就不会超时

https://cn.vjudge.net/contest/228009#problem/W

题意;

幸运值每天都减少,尽量使幸运值和最大,一天只能一个人,从n个人里找出k 个人

分析:

就是贪心+dp,将数组按照幸运值减少的值从大到小排序

选择k个人的时候需要用到dp

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
struct node
{
    int val,des;
    bool operator<(const node &aa)const
    {
        if(des!=aa.des)
            return des>aa.des;
        return val>aa.val;
    }
}v[1005];
int dp[1005];
int main()
{
    int n,i,j,k;
    while(~scanf("%d%d",&n,&k))
    {
        for(i=0;i<n;i++)
            scanf("%d",&v[i].val);
        for(i=0;i<n;i++)
            scanf("%d",&v[i].des);
        sort(v,v+n);
       for(i=0;i<=n;i++)
        dp[i]=-inf;
       dp[0]=0;
        for(i=0;i<n;i++)
        {
            for(j=k;j>0;j--)
            {
                dp[j]=max(dp[j],dp[j-1]+v[i].val-v[i].des*(j-1));
            }
        }
        printf("%d\n",dp[k]);
    }
}

https://cn.vjudge.net/contest/228009#problem/N

题意:

就是在一个无向图里进行删边操作,使它的每一个点到0距离最短,问有几种方案

分析:

就是一个最短路径的模板

代码;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
int a[55][55];
char c[55][55];
int dp[100],n;
bool vis[100];
long long int ans;
struct node
{
    int id;
    bool operator<(const node &aa)const
    {
        return dp[id]>dp[aa.id];
    }
};
void dfs()
{
    int i,j;
    dp[0]=0;
    for(i=1;i<n;i++)
        dp[i]=inf;
    priority_queue<node>q;
    node now,next;
    now.id=0;
    q.push(now);
    vis[0]=1;
    while(!q.empty())
    {
        now=q.top();
        //vis[now.id]=1;
        q.pop();
        //printf("555555dkjsfko\n");
        for(i=0;i<n;i++)
        {
            if(i==now.id)continue;
            if(c[now.id][i]!='0')
            if(dp[i]>dp[now.id]+c[now.id][i]-'0')
            {
                //printf("ok\n");
                dp[i]=dp[now.id]+c[now.id][i]-'0';
                if(!vis[i])
                {
                    next.id=i;
                    vis[i]=1;
                    q.push(next);
                }
            }
        }
    }
}
int main()
{
    int i,j,k;
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)
        scanf("%s",&c[i]);
        ans=1;
        memset(vis,0,sizeof(vis));
        dfs();
        bool flag;
        flag=0;
        for(i=1;i<n;i++)
        {
            if(dp[i]==inf)
            {
                ans=0;
                break;
            }
            //printf("lll   %d\n",dp[i]);
            ll sum;
            sum=0;
            for(j=0;j<n;j++)
            {
                if(i==j)continue;
                if(c[i][j]!='0'&&dp[i]==dp[j]+c[j][i]-'0')
                    sum++;
            }
            //printf("******       %lld\n",sum);
            ans=ans*sum;
            ans=ans%mod;
           // if(flag)break;
        }
        printf("%lld\n",ans);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值