The 11th Zhejiang Provincial Collegiate Programming Contest

A - Pokemon Master

题目大意:比重量

代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
int a[1005];
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        int sum1,sum2;
        sum1=sum2=0;
        cin>>n>>m;
        for(int i=0; i<n; i++)
        {
            int x;
            cin>>x;
            sum1+=x;
        }
        for(int i=0; i<m; i++)
        {
            int x;
            cin>>x;
            sum2+=x;
        }
        //cout<<sum1<<" "<<sum2<<endl;
        if(sum1>sum2)
            cout<<"Calem"<<endl;
        if(sum1<sum2)
            cout<<"Serena"<<endl;
        if(sum1==sum2)
            cout<<"Draw"<<endl;
    }
    return 0;
}

B - Problem Arrangement

题目大意:安排一场比赛把题目安排在不同的位置会有不用的有趣值,求最大有趣值

http://blog.csdn.net/y990041769/article/details/24136457

代码:

#include <bits/stdc++.h>
int dp[1<<13][510];   //dp[i][j]表示取i的二进制位值兴趣值为j时的个数
int f[13];
int a[13][13];

void isit()//表示全部的阶乘
{
    f[1]=1;
    for(int i=2;i<13;i++)
        f[i]=f[i-1]*i;
}
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int T,m,n;
    scanf("%d",&T);
    isit();
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(int i=0;i<=(1<<n);i++)   //所有情况
        {
            int tmp=0;   //已经表示过的题数
            for(int j=1;j<=n;j++)
                if(i&(1<<(j-1)))//表示过就++
                    tmp++;
            //printf("%d\n",tmp);
            for(int j=1;j<=n;j++)//对于每个题目遍历
            {
                if(i&(1<<(j-1))) continue;
                for(int k=0;k<=m;k++)//每个状态遍历
                {
                    if(k + a[tmp+1][j] >= m)   //把大于值m得全部保存到j
                        dp[i+(1<<(j-1))][m] += dp[i][k];
                    else
                        dp[i+(1<<(j-1))][k+a[tmp+1][j]] += dp[i][k];
                }
            }
        }
        if(dp[(1<<n)-1][m] == 0)
            printf("No solution\n");
        else
        {
            int tm = gcd(f[n],dp[(1<<n)-1][m]);
            printf("%d/%d\n",f[n]/tm, dp[(1<<n)-1][m]/tm);
        }
    }
}

C - Talented Chef

题目大意:有点像以前的三个饼两个锅,然后最快多少时间做出来.大概猜了一下整除,然后就过了

代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int a[40005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m,sum1=0,maxnum=0;
        cin>>n>>m;
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
            sum1+=a[i];
            if(a[i]>maxnum)
                maxnum=a[i];
        }
        if(sum1%m==0)
            cout<<max(sum1/m,maxnum)<<endl;
        else cout<<max(sum1/m+1,maxnum)<<endl;
    }
    return 0;
}

E - Paint the Grid Again

题目大意:每次操作能把每一行变成X,或者每一列变成O,问如何操作能变出结果.有多种的话,输出字典序最小的.思路就是反向模拟.相当于一张白纸,然后画了好几笔变成所求的图案,如今我们要反向拆解,直到再次变回一张白纸.当然,多次重复覆盖的点设成特殊值,特判就行.这里我设成”.”

代码:

#include<bits/stdc++.h>
using namespace std;
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
char G[505][505];
int col[505],row[505];
int n;
char ch[1005];
int id[1005];
bool check()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(G[i][j]!='.')
                return 0;
    return 1;
}
int findok(int cnt)
{
    for(int i=n; i>=1; i--)
    {
        if(row[i])continue;
        int j,t=0;
        for(j=1; j<=n; j++)
        {
            if(G[i][j]=='O')
                break;
            else if(G[i][j]=='.')t++;
        }
        if(t==n)
        {
            row[i]=1;
            continue;
        }
        if(j==(n+1))
        {
            row[i]=1;
            ch[cnt]='R';
            id[cnt]=i;
            for(int k=1; k<=n; k++)
                G[i][k]='.';
            return 1;
        }
        //cout<<j<<endl;
    }
    //cout<<1111<<endl;
    for(int i=n; i>=1; i--)
    {
        if(col[i])continue;
        int j,t=0;
        for(j=1; j<=n; j++)
        {
            if(G[j][i]=='X')
                break;
            else if(G[j][i]=='.')t++;
        }
        if(t==n)
        {
            col[i]=1;
            continue;
        }
        if(j==(n+1))
        {
            col[i]=1;
            ch[cnt]='C';
            id[cnt]=i;
            for(int k=1; k<=n; k++)
                G[k][i]='.';
            return 1;
        }
    }
    return 0;
}


int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1; i<=n; i++)
            scanf("%s",G[i]+1);
        memset(col,0,sizeof(col));
        memset(row,0,sizeof(row));
        int cnt=0,goal=1;
        while(1)
        {
            if(check())
                break;
            int deal=findok(cnt++);
            if(deal==0)
            {
                goal=0;
                break;
            }
            //cout<<1<<endl;

        }

        if(goal==0)
        {
            cout<<"No solution"<<endl;
            continue;
        }
        for(int i=cnt-1; i>=0; i--)
        {
            cout<<ch[i]<<id[i];
            if(i!=0)
                cout<<" ";
        }
        cout<<endl;
    }

    return 0;
}


F - Paint the Grid Reloaded

题目大意:传说中的缩点最短路,待补.

http://blog.csdn.net/cacyth/article/details/45169215

代码:

#include<bits/stdc++.h>
using namespace std;

string G[50];
int t,n,m;
vector<int> y[1610];
int vis[50][50];
int dx[]= {0,0,-1,1};
int dy[]= {1,-1,0,0};

void dfs(int p,int q,int id,char c)
{
    for(int i=0; i<4; i++)
    {
        int ii=p+dx[i];
        int jj=q+dy[i];
        if(ii<0||ii>=n||jj<0||jj>=m)continue;
        if(G[ii][jj]==c&&vis[ii][jj]==0)
        {
            vis[ii][jj]=id;
            dfs(ii,jj,id,c);
        }
        else if(G[ii][jj]!=c&&vis[ii][jj]>0)
        {
            y[vis[ii][jj]].push_back(id);
            y[id].push_back(vis[ii][jj]);
        }
    }
}
int bfs(int p)
{
    int v[1610];
    memset(v,0,sizeof(v));
    queue < pair<int,int> > q;
    q.push(make_pair(p,1));
    v[p]=1;
    int res=0;
    while(!q.empty()){
        pair<int,int> fr=q.front();
        q.pop();
        res=max(fr.second,res);
        for(int i=0;i<y[fr.first].size();i++){
            if(v[y[fr.first][i]]==0){
                q.push(make_pair(y[fr.first][i],fr.second+1));
                v[y[fr.first][i]]=1;
            }
        }
    }
    return res;
}



int main()
{
    cin>>t;
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        cin>>n>>m;
        for(int i=1; i<=n*m; i++)
            y[i].clear();
        for(int i=0; i<n; i++)
            cin>>G[i];
        int cnt=0;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(!vis[i][j])
                {
                    vis[i][j]=++cnt;
                    dfs(i,j,cnt,G[i][j]);
                }
            }
        }
        int ans=999999;
        for(int i=1; i<=cnt; i++)
        {
            ans=min(ans,bfs(i));
        }
        cout<<ans-1<<endl;
    }
    return 0;
}


G - Ternary Calculation

题目大意:很正常的暴力题目

代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int ans=0;
        int a1,a2,a3,flag;
        char c1,c2;
        flag=0;
        scanf("%d %c %d %c %d",&a1,&c1,&a2,&c2,&a3);
        if(c1=='*'||c1=='/'||c1=='%'||c2=='*'||c2=='/'||c2=='%')//*/%
            flag=1;
        if(flag)
        {
            if((c1=='*'||c1=='/'||c1=='%')&&(c2=='*'||c2=='/'||c2=='%'))//都是*/
            {
                if(c1=='*')
                    ans=a1*a2;
                else if(c1=='/')
                    ans=a1/a2;
                else if(c1=='%')
                    ans=a1%a2;

                if(c2=='*')
                    ans=ans*a3;
                else if(c2=='/')
                    ans=ans/a3;
                else if(c2=='%')
                    ans=ans%a3;
            }
            else
            {
                if(c1=='*'||c1=='/'||c1=='%')
                {
                    if(c1=='*')
                        ans=a1*a2;
                    else if(c1=='/')
                        ans=a1/a2;
                    else if(c1=='%')
                        ans=a1%a2;

                    if(c2=='+')
                        ans=ans+a3;
                    else if(c2=='-')
                        ans=ans-a3;
                }

                if(c2=='*'||c2=='/'||c2=='%')
                {
                    if(c2=='*')
                        ans=a2*a3;
                    else if(c2=='/')
                        ans=a2/a3;
                    else if(c2=='%')
                        ans=a2%a3;

                    if(c1=='+')
                        ans=ans+a1;
                    else if(c1=='-')
                        ans=a1-ans;
                }
            }
        }
        else
        {
            if(c1=='+')
                ans=a1+a2;
            else if(c1=='-')
                ans=a1-a2;
            if(c2=='+')
                ans=ans+a3;
            else if(c2=='-')
                ans=ans-a3;
        }
        cout<<ans<<endl;

    }
    return 0;
}


J - What day is that day?

题目大意:有点恶心的找规律题目.如果第一次写的话,还真的要郁闷死

代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int a[295],b[42];
long long n;
void init()
{
    int temp,sum1;
    for(int i=1; i<=42; i++)
    {
        temp=i%7;
        for(int j=0; j<i-1; j++)
        {
            temp=(temp*i)%7;
        }
        b[i]=temp%7;
        //cout<<b[i]<<" ";
    }
    sum1=0;
    for(int i=1; i<=294; i++)
    {
        sum1=(sum1+b[i%42])%7;
        a[i]=sum1;
        /*cout<<sum1<<" ";
        if(i%294==0)
            cout<<endl;*/
    }
}
string day[7]= {"Saturday","Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday"};
int main()
{
    int t;
    init();
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<day[a[n%294]]<<endl;

    }
    return 0;
}

L - Access System

题目大意:简单的模拟,把时间化到秒就能做了

代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
struct stu
{
    int time,id;
};
stu a[20005];
bool cmp(stu x, stu y)
{
    return x.time<y.time;
}
int ans[20005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1; i<=n; i++)
        {
            int h,m,s;
            scanf("%d:%d:%d",&h,&m,&s);
            a[i].time=3600*h+60*m+s;
            a[i].id=i;
        }
        sort(a+1,a+1+n,cmp);

        int cnt=0,pst;
        ans[cnt++]=a[1].id;
        pst=a[1].time;
        for(int i=2; i<=n; i++)
        {
            if(a[i].time-pst>=m)
            {
                ans[cnt++]=a[i].id;
                pst=a[i].time;
            }
        }
        cout<<cnt<<endl;
        sort(ans,ans+cnt);
        for(int i=0; i<cnt; i++)
        {
            if(i!=0)cout<<" ";
            cout<<ans[i];
        }
        cout<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值