sduacm16级寒假热身赛解题报告

题目链接https://vjudge.net/contest/147139
password: acmlab2016

A - Bachgold Problem
【题意】
给一个2到100000的数,将它拆成若干个素数的和.并使这个数目最大.
【思路】
水题。
【Code】

#include<cstdio>
int n;
int main()
{
    scanf("%d",&n);
    printf("%d\n",n/2);
    for (int i=0;i<n/2-1;i++)
        printf("2 ");
    if (n%2==0) printf("2\n");
    else printf("3\n");
    return 0;
}

B - Parallelogram is Back
【题意】
给你平行四边形三个点的坐标,让你写出第四个点的所有可能的坐标.
【思路】
一定有三种可能,并且可以由数学方法计算出。
【Code】

#include<cstdio>
using namespace std;
int x1,x2,x3,y1,y2,y3;
int main()
{
    while(~scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3))
    {
        printf("3\n");
        printf("%d %d\n",x1+x2-x3,y1+y2-y3);
        printf("%d %d\n",x1+x3-x2,y1+y3-y2);
        printf("%d %d\n",x2+x3-x1,y2+y3-y1);
    }
    return 0;
}

C - Lesha and array splitting
【题意】
就是让这个数列分为几个小部分,每一部分相加都不为0,将每一部分的下标的最左和最右分别输出。
【思路】
只需要考虑这个数列相加是否为0,如果不为0让其整个一部分为一部分,如果为0的话则分为两部分,
第一个不是0的数之前为一部分,之后为一部分,全为0的话就输出NO。
【Code】

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001],b[1001];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        int flag=0,sum=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
            if(a[i]!=0&&flag==0)
            {
                flag=i;
            }
        }
        if(flag==0) printf("NO\n");
        else{
            if(sum!=0)  printf("YES\n1\n1 %d\n",n);
            else  printf("YES\n2\n1 %d\n%d %d\n",flag,flag+1,n);
        }

    }
}

D - Ilya and tic-tac-toe game
【题意】
给你一个初始的图,问你能否在一步操作中x取得胜利。
//一开始一直以为要博弈…英语渣渣不想说话
【思路】
暴力枚举x放的位置。然后判断是否存在连着3x的.
【Code】

#include<cstdio>
#include<cstring>
using namespace std;
char a[10][10];
int fx[8]={1,-1,0,0,1,-1,1,-1};
int fy[8]={0,0,1,-1,1,-1,-1,1};
int judge()
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(a[i][j]=='x')
            {
                for(int z=0;z<8;z++)
                {
                    int flag=0;
                    for(int k=1;k<=2;k++)
                    {
                        int xx=i+fx[z]*k;
                        int yy=j+fy[z]*k;
                        if(xx>=0&&xx<4&&yy>=0&&yy<4)
                        {
                            if(a[xx][yy]=='x')continue;
                            else flag=1;
                        }
                        else flag=1;
                    }
                    if(flag==0)return 1;
                }
            }
        }
    }
    return 0;
}
int main()
{
    memset(a,'.',sizeof(a));
    for(int i=0;i<4;i++)
    {
        scanf("%s",a[i]);
    }
    int flag=0;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(a[i][j]=='.')
            {
                a[i][j]='x';
                int tmp=judge();
                a[i][j]='.';
                if(tmp==1)flag=1;
            }
        }
    }
    if(flag==1)printf("YES\n");
    else printf("NO\n");
}

E - New Year and Hurry
【题意】
你有240-k分钟的时间去解决至多n个问题,解决第i个问题需要5*i分钟。问最多能解决几个问题。
【思路】
水题。
【Code】

#include<cstdio>
int main()
{
    int ans,n,k;
    scanf("%d %d",&n,&k);
    for (int i=1;i<=n;i++)
    if (k+i*5<=240){
        k+=i*5;
        ans=i;
    }
    printf("%d\n",ans);
    return 0;
}

F - New Year and North Pole
【题意】
给你一组移动方案,问是否合法
【思路】
不必考虑东西方向,只考虑南北方向。而且由于在北极只能向南走,在南极只能向北走。就可以认为是一条长20000的线段,然后就简单了。
【Code】

#include<cstdio>
char st[6];
int main()
{
    int T,N,cut = 0,ok = 1;
    scanf("%d",&T);
    while(T--){
        scanf("%d %s",&N,st);
        if((cut == 0 && st[0] != 'S') || (cut == 20000 && st[0] != 'N'))
            ok = 0;
        if(st[0] == 'S')
            cut += N;
        else if(st[0] == 'N')
            cut -= N;
        if(cut < 0 || cut > 20000)
            ok = 0;
    }
    if(!ok || cut != 0) printf("NO\n");
        else  printf("YES\n");
    return 0;
}

G - Santa Claus and a Place in a Class
【题意】
给你个m*2n的矩阵,问k在哪个位置。
【思路】
水题。
【Code】

#include<cstdio>
int n,m,k,x=1,y=1;
int main()
{
    scanf("%d %d %d",&n,&m,&k);
    while (k>2*m){
        k-=2*m;
        x++;
    }
    while (k>2){
        k-=2;
        y++;
    }
    if (k==2) printf("%d %d R\n",x,y);
    else printf("%d %d L\n",x,y);
    return 0;
}

H - Santa Claus and Keyboard Check
【题意】
经过一定的对应规则将两个字符串转化为相同的字符串,问是否存在这种可能,如果存在输出所有对应规则
【思路】
将每一步字符的对应规则存储起来,对应原字符也要存储起来,但不需要输出.
如果与前面的对应规则矛盾就输出-1.
一开始没有仔细考虑wa了4发….
【Code】

#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
char s1[1001],s2[1001];
int ans=0,n;
int c[150];
char d[30][2];
bool deal()
{
    n=strlen(s1);
    for (int i=0;i<n;i++)
    {
        if (s1[i]!=s2[i])
        {
            if (c[s1[i]]==s2[i]&&c[s2[i]]==s1[i]) continue;
            if (c[s1[i]]!=0&&c[s1[i]]!=s2[i]) return false;
            if (c[s2[i]]!=0&&c[s2[i]]!=s1[i]) return false;
            c[s1[i]]=s2[i];
            c[s2[i]]=s1[i];
            d[ans][0]=s1[i];
            d[ans][1]=s2[i];
            ans++;
        }else if (c[s1[i]]!=s1[i]&&c[s1[i]]!=0) return false;
        else if (c[s1[i]]==0){
            c[s1[i]]=s1[i];
        }
    }
    return true;
}
int main()
{
    scanf("%s",s1);
    scanf("%s",s2);
    if (!deal())
    {
        printf("-1\n");
        return 0;
    }
    printf("%d\n",ans);
    for (int i=0;i<ans;i++)
        printf("%c %c\n",d[i][0],d[i][1]);
    return 0;
}

I - Felicity is Coming!
【题意】
  每个体育馆有一定数量的小精灵,每个宠物小精灵都有自己的类型。相同类型的小精灵会进化成相同类型的精灵,不同类型的小精灵进化成的精灵的类型都不相同。
  你的任务是找到不同的进化计划的个数,使得所有宠物小精灵在它们的体育馆都进化过,且每个体育馆的每种类型的宠物小精灵的数量保持不变。
【思路】
  保存下每个类型的小精灵所在体育馆,判断两个小精灵的在的体育馆种类和出现次数是否相同
  在所在体育馆出现次数都相同的小精灵会组成一个个集合。设这些集合的大小为x1,x2,x3…..
对于一个大小为x的集合,方案数为x!,即为他们的全排列数。那么ans=x1!*x2!*x3!…..xk!
【Code】

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1000005;
const int mod  = 1000000007;
int n, m;
vector<int> a[maxn];

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int num;
        scanf("%d",&num);
        while(num--){
            int flag;
            scanf("%d",&flag);
            a[flag].push_back(i);
        }
    }
    sort(a+1,a+m+1);
    /*for(int i=1;i<=m;i++)
    {
        printf("%d----",i);
        for (int j=0;j<a[i].size();j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }*/
    long long ans = 1;
    int fnum=1;
    for(int i=2;i<=m;i++)
    if(a[i] == a[i-1]){
        fnum++;
        ans = (ans*fnum)%mod;
    }else  fnum= 1;
    printf("%lld\n",ans);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值