长沙多校联合训练

A题,一个简单的bfs

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define maxn 100009
 
using namespace std;
int vis[maxn];
vector<int>ve[maxn];
queue<int>q;
 
bool bfs(int s)
{
    int l;
    vis[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int v=q.front();
        q.pop();
        l=ve[v].size();
        for(int i=0; i<l; i++)
        {
            int u=ve[v][i];
            if(vis[u]==0)
            {
                q.push(u);
                vis[u]=vis[v]+1;
            }
            else if(vis[u]==vis[v]||vis[u]>vis[v]+1)
                return 0;
        }
    }
    return 1;
}
 
int main()
{
    int n,m,s;
    int t;
    int ca=1;
    scanf("%d",&t);
    while(t--)
    {
        int x,y;
        memset(vis,0,sizeof vis);
        scanf("%d%d%d",&n,&m,&s);
        for(int i=0; i<n; i++)ve[i].clear();
        for(int i=0; i<m; i++)
        {
            scanf("%d%d",&x,&y);
            ve[x].push_back(y);
            ve[y].push_back(x);
        }
        while(!q.empty())q.pop();
        printf("Case %d: ",ca++);
        if(bfs(s))puts("NO");
        else puts("YES");
    }
    return 0;
}
View Code

G题,找规律的题;

#include<cstdio>
#include<algorithm>
#define maxn 104
#include<cstring>
using namespace std;
 
int sor[maxn][maxn];
int tar[maxn][maxn];
int cot1[maxn];
int cot2[maxn];
 
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)&&(n+m)>0)
    {
        memset(cot1,0,sizeof cot1);
        memset(cot2,0,sizeof cot2);
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                scanf("%d",&sor[i][j]);
                if(sor[i][j]==1)cot1[i]++;
            }
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                scanf("%d",&tar[i][j]);
                if(tar[i][j]==1)cot2[i]++;
            }
        }
        bool flag=1;
        for(int i=0; i<n; i++)
        {
            if(cot1[i]+cot2[i]!=m&&cot1[i]!=cot2[i])
                flag=0;
        }
        int cnt_1=0,cnt_2=0;
        if(flag)
        {
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<i; j++)
                {
                    cnt_1=0,cnt_2=0;
                    for(int k=0; k<m; k++)
                    {
                        if(sor[i][k]==sor[j][k])
                            cnt_1++;
                        if(tar[i][k]==tar[j][k])
                            cnt_2++;
                    }
                    if(cnt_1!=cnt_2&&cnt_1+cnt_2!=m)
                    {
                        flag=0;
                        break;
                    }
                }
                if(flag==0)
                    break;
            }
        }
        if(flag)puts("Yes");
        else puts("No");
    }
    return 0;
}
View Code

H题,dp

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 10009
#define mod 9997
using namespace std;
 
long long dp[maxn][2];
 
int main()
{
    memset(dp,0,sizeof dp);
    int n;
    dp[1][0]=1;
    dp[1][1]=1;
    dp[2][1]=2;
    dp[2][0]=2;
    for(int i=3;i<10009;i++)
    {
        dp[i][0]+=dp[i-1][0]+dp[i-1][1];
        if(dp[i][0]>mod)dp[i][0]%=mod;
        dp[i][1]+=dp[i-1][0]-dp[i-2][1]+mod+mod;
        dp[i][1]+=dp[i-1][1];
        if(dp[i][1]>mod)dp[i][1]%=mod;
    }
    while(scanf("%d",&n)&&n!=-1)
    {
        printf("%lld
",(dp[n][1]+dp[n][0])%mod);
    }
    return 0;
}
View Code

I题,二分

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200009
#define ll long long
using namespace std;
 
int num[maxn];
ll k;
int n;
 
bool check(int mid)
{
    int m=n/mid;
    int ma=0;
    ll ans=0;
    for(int i=1; i<=n; i++)
    {
        if(!mid)break;
        ma=max(ma,num[i]);
        if(i%m==0)
        {
            mid--;
            ans+=ma;
            ma=0;
        }
    }
    if(ans>k)return 1;
    else return 0;
}
 
int main()
{
    while(scanf("%d%lld",&n,&k)&&n!=-1)
    {
        ll cnt=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&num[i]);
            cnt+=num[i];
        }
        if(cnt<=k)
        {
            puts("-1");
            continue;
        }
        int l=1;
        int r=n;
        while(l<r)
        {
            int mid=(l+r)/2;
            if(check(mid))r=mid;
            else l=mid+1;
        }
        printf("%d
",l);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3590417.html