7 28 组队赛

A

题目很长,但是描述基本没用,大水题,下次读题再也不能让题目的长短影响对题目的判断,可跳跃性的阅读,阅读也是一种能力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
    int c=0;
    int n,num;
    while(cin>>n)
    {
        c++;
        if(n==0)
            break;
        else
        {
            int s1=0;
            int s2=0;
            for(int i=0;i<n;i++)
            {
                cin>>num;
                if(num!=0)
                    s1++;
                else
                    s2++;
            }
            cout<<"case "<<c<<": ";
            cout<<s1-s2<<endl;
        }
    }
    return 0;
}


FDigital Matrix

题目链接:UVA上的,直接拿题目去搜吧

题目大意:将一个矩阵A转化为矩阵B,A/B中数字的范围都是1-k,每一步转化可将A中一个数字转化为1-k中的任意数字,但在转化过程中不能出现对称矩阵,让你求最少需要几步转化,若无法将A转化为B,输出-1.

有一种很特殊的样例是需要注意的:

A:1 2

    3 1

B:1 3

    2 1

特殊在A[1][2]==B[2][1]   A[2][1]==B[1][2]

所以变两次肯定不行,因为会出现对称阵。k=2时也需要好好分析

下面是两份代码:

第一份:根据k分情况讨论

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int map1[200][200];
int map2[200][200];
int T,n,k;
int main()
{
    int i,j;
    int sum; //记录总的需要改变的个数
    int ans; //记录特殊情况的个数
    int cases=0;
    scanf("%d",&T);
    while(T--)
    {
        cases++;

        scanf("%d%d",&n,&k);
        sum=0;
        ans=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&map1[i][j]);
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&map2[i][j]);
                if(map2[i][j]!=map1[i][j])
                    sum++;
            }
        }
        printf("Case %d: ",cases);
        int sum1=0;
        for(i=0;i<n;i++)
        {
            if(map1[i][i]!=map2[i][i])
                sum1++;
        }
        if(sum==0)
            printf("0\n");
        else
        {
            int cot=0;//判断map2是否对称矩阵
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    if(map2[i][j]!=map2[j][i])
                        cot++;
                }
            }

            if(cot==0)
                printf("-1\n");
            else
            {
                for(i=0;i<n;i++)
                {
                    for(j=0;j<i;j++)
                    {
                        if(map2[i][j]!=map2[j][i]&&map1[i][j]==map2[j][i]&&map1[j][i]==map2[i][j])
                            ans+=2;
                    }
                }
                if(k==2)
                {
                   if(n==2&&map1[0][1]==map2[1][0]&&map1[1][0]==map2[0][1])
                        printf("-1\n");
                   else if(ans==2&&ans==sum-sum1)
                        printf("%d\n",sum+2);
                    else
                        printf("%d\n",sum);
                }
                else if(k>2)
                {
                    if(ans==2&&ans==sum-sum1)
                        printf("%d\n",sum+1);
                    else
                        printf("%d\n",sum);
                }
            }

        }
    }
    return 0;
}

第二种:根据输出的结果讨论分析

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int map1[200][200];
int map2[200][200];
int T,n,k;
int main()
{
    int i,j;
    int sum; //记录总的需要改变的个数
    int ans; //记录特殊情况的个数
    int cases=0;
    scanf("%d",&T);
    while(T--)
    {
        cases++;

        scanf("%d%d",&n,&k);
        sum=0;
        ans=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&map1[i][j]);
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&map2[i][j]);
                if(map2[i][j]!=map1[i][j])
                    sum++;
            }
        }
        printf("Case %d: ",cases);
        int sum1=0;
        for(i=0;i<n;i++)
        {
            if(map1[i][i]!=map2[i][i])
                sum1++;
        }
        if(sum==0)
            printf("0\n");
        else
        {
            int cot=0;//判断map2是否对称矩阵
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    if(map2[i][j]!=map2[j][i])
                        cot++;
                }
            }

            if(cot==0||(n==2&&k==2&&map1[1][0]==map2[0][1]&&map1[0][1]==map2[1][0]))
                printf("-1\n");

            else
            {
                for(i=0;i<n;i++)
                {
                    for(j=0;j<i;j++)
                    {
                        if(map2[i][j]!=map2[j][i]&&map1[i][j]==map2[j][i]&&map1[j][i]==map2[i][j])
                            ans+=2;
                    }
                }
                if(k==2&&ans==2&&ans==sum-sum1)
                    printf("%d\n",sum+2);
                else
                {
                   // cout<<"sum:"<<sum<<" sum1:"<<sum1<<" ans:"<<ans<<endl;
                    if(ans==2&&(ans==sum-sum1))
                        printf("%d\n",sum+1);
                    else
                        printf("%d\n",sum);
                }
            }
        }
    }
    return 0;
}


 

 

 C:Optimal Store

VUA上的,这道题重点是一定要读懂题目,可是自己读了半天也没读懂,大神一来,连读带猜就把样例弄懂了,呵呵,下次一定要大胆的敢于猜测

//C:
//注意取值范围和时间限制   scanf  long long 
//要敢于去猜测,敢于去想,敢于去敲代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long a;
long long f[100];
void ff()
{
    f[1]=1;
    f[2]=2;
    for(int i=3; i<=50; i++)
        f[i]=f[i-1]+f[i-2];
}
int main()
{
    ff();
    //cout<<f[45]<<endl;    
    int T,n;
    scanf("%d",&T);
    for(int cas=1; cas<=T; cas++)
    {
        int ans;
        long long sum=1;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            ans=0;
            scanf("%d",&a);
            int j=45;
            for(j=45;j>=1;j--)
            {
                while(a>=f[j])
                {
                    a-=f[j];
                    ans++;
                }
            }
            sum*=ans;
            //cout<<"jajaj"<<endl;
        }
        printf("Case %d: %lld\n",cas,sum);
        //cout<<"Case "<<cas<<": "<<sum<<endl;
    }
    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值