第八周组队赛(周一)130827

这次的题相对之前简单,A题和B题的类型看过,就敲了,不过写代码能力有待提高,有些 还会出小错误,多亏队友提醒,

A题不是1A,唉~它竟然不支持long long ==__Int 64,修改,A了


B题找规律,不过BNU不知哪里出错了,就是不判B题,后面赛后交A了

B题就是给出一个b进制的数,求该数%(b-1)后的结果,我当时的想法是把它转换成十进制看效果,对于一个数比如题目中的例子7 123456,把它转成十进制为(1*7^5+2*7^4+3*7^3+4*7^2+5*7^1+6*7^0)对它取模,发现7^(7-1)总==1

又有(a*b)%c=(a%c * b%c)%c;  ,所以相当于(1*7^5+2*7^4+3*7^3+4*7^2+5*7^1+6*7^0)%(7-1)==(1*1+2*1+3*1+4*1+5*1+6*1)%(7-1) == (1+2+3+4+5+6)%(7-1),也就是把你输入的数各个位加起来%(b-1)就OK了


C题给出一个长度L,用它来组成一个三角形,三角形的边长是整数的,问可以组成多少种方案,就是我一直在画那个三角形,后面发现只要三角形三边都不相同,就是相当两种方案,A了,不过在杭电上TLE了,因为杭电限时1s,这里限时3s,唉~~有待优化吧   找到了方法,在杭电A了!代码在下面

解析:分三种情况:1 等边情况a=b=c s+=1;

2.等腰情况:a=b<c  由于 a+b>c--->2*a>n-2*a----->a>n/4    又a<c----->a<n-2*a----->a<n/3  则 n/4<a<n/3

                     a<b=c  由于 c>a---->c>n-2*c------>c>n/3    又 b+c<n--->c<n/2  则 n/3<c<n/2

3.三边不等情况 假设为 a<b<c  则a<b<n-a-b-----> (n-2*a)/2<b<(n-a)/2  

然后我就是很耐心的判断奇偶情况,求出最终答案!


E题其实很简单,就是理清分子分母的问题,我又犯了一次错误,long  long 竟然在输出的时候变成了int ,所以一直出不了结果,赛后A了~~~~~


J题:题意:给出一组字符串,在给出n个数,每次求和取出原串中的单词输出。   

题意很简单,就是那个字母呀看着头晕,其实翥子已经写出来了,但是不明白为什么长度总是多出一位,我看了看也知道为什么,后面他叫我敲,我敲后是一样的结果,后面听说样例后面都多了一个空格!超级无语了!不然早A了....


A题代码:

#include <cstdio>//A
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main() {
    int t,a;
    long long mmax,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d  %I64d",&a,&n);
        mmax=n;
        while(n!=1)
        {
            if(n%2==0)
            {
                n=n/2;
                mmax=max(n,mmax);
            }
            else
            {
                n=n*3+1;
                mmax=max(n,mmax);
            }
        }
       cout<<a<<" "<<mmax<<endl;
    }
    return 0;
}

B题代码:

#include <cstdio>//B
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
char s[10000001];
int main()
{
    int t,a,b;

    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%s",&a,&b,s);
        int len=strlen(s);
        int sum=0;
        for(int i=0;i<len;i++)
        sum+=(s[i]-'0');
        int dd=sum%(b-1);
        printf("%d %d\n",a,dd);
    }
    return 0;
}

C题代码:

#include <iostream>//C
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    int n,a,b;
    scanf("%d",&n);
    while(n--)
    {
        int s=0;
        scanf("%d%d",&a,&b);
        int lc=b/2,kk=1;
        if(b%2 ==0)
        {
            lc-=1;
            kk=2;
        }
        for(int i=lc; i>=kk; i--)
        {
            for(int j=i; j>=1; j--)
            {
                int k=b-i-j;
                if(k>j)break;
                if(k+j>i)//判断是否是三角形
                {
                    if(i!=j && i!=k && j!=k)s+=2;
                    else
                        s+=1;
                }
            }
        }
        printf("%d %d\n",a,s);
    }
    return 0;
}

在杭电A的代码:

#include <stdio.h>//C
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    int t,aa,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&aa,&n);
        int s=0;
        if(n%3==0)s+=1;

        int l=(n/4)+1;
        int r=n/3;
        if(n%3==0)r--;
        if(r>=l)
        s+=(r-l+1);

        l=n/3+1;
        r=n/2;
        if(n%2==0)r--;
        if(r>=l)
        s+=(r-l+1);
        for(int a=1;a< n/3;a++)
        {
            l=a+1;
            int t=(n-2*a)/2+1;
            r=(n-a)/2;
            if((n-a)%2==0)
            r--;
            l=max(l,t);
            if(r>=l)
            s+=2*(r-l+1);
        }
        printf("%d %d\n",aa,s);
    }
    return 0;
}


E题代码:

#include <iostream>//E
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
//long long gcd(long long  n,long long  m)
//{
//    if(n<m) swap(n,m);
//    return n%m==0?m:gcd(m,n%m);
//}
//long long  lcm(long long  n,long long  m)
//{
//    if(n<m) swap(n,m);
//    return n/gcd(n,m)*m;
//}
long long gcd(long long a,long long b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
long long lcm(long long a,long long b)
{
    return (a*b)/gcd(a,b);
}
long long dp[420][420][2];
void ff()
{
    dp[0][1][0]=1;
    dp[0][1][1]=1;
    dp[1][1][0]=1;
    dp[1][1][1]=2;
    dp[1][2][0]=1;
    dp[1][2][1]=2;
    long long f1,f2,s1,s2;
    for(int i=2; i<=410; i++)
    {
        f1=f2=1;
        for(int j=2; j<=i+1; j++)
        {
            dp[i][j][0]=i*dp[i-1][j-1][0];
            dp[i][j][1]=j*dp[i-1][j-1][1];
            s1=dp[i][j][0];
            s2=dp[i][j][1];
            if(s1==0 && s2==0) continue;
            long long gg = gcd(s1,s2);
            dp[i][j][0]/=gg;
            dp[i][j][1]/=gg;
            if(f1==0 && f2==0)
            {
                f1=-dp[i][j][0];
                f2= dp[i][j][1];
                continue;
            }
            long long l=lcm (f2,s2);
            f1=f1*(l/f2)-s1*(l/s2);
            f2=l;
        }
        if(f1==0)
        {
            dp[i][1][0]=0;
            dp[i][1][1]=0;
        }
        else
        {
            long long gg = gcd(f1,f2);
            f1/=gg;
            f2/=gg;
            dp[i][1][0]=f1;
            dp[i][1][1]=f2;
        }
    }
}
int  main()
{
    ff();
//    for(int i=0;i<=10;i++)
//    {
//        for(int j=1;j<=i+1;j++)
//        {
//            printf("%lld/%lld ",dp[i][j][0],dp[i][j][1]);
//        }
//        cout<<endl;
//    }
    int t,a,b,c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d%d",&a,&b,&c);
        if(dp[b][c][1]<0)
        {
            dp[b][c][0]*=-1;
            dp[b][c][1]*=-1;
        }
        if(dp[b][c][0]==0)
            printf("%d 0\n",a);
        else if(dp[b][c][0]%dp[b][c][1]==0)
            printf("%d %lld\n",a,dp[b][c][0]/dp[b][c][1]);
        else
            printf("%d %lld/%lld\n",a,dp[b][c][0],dp[b][c][1]);

    }
    return 0;
}


J 题代码:

#include <cstdio>//J
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
char a[1005];
int main()
{
    int t,num,l,b;
    scanf("%d",&t);
    int sum ;
    while(t--)
    {
        sum = 0;
        cin>>num;
        getchar();
        gets(a);
        int len=strlen(a);
        scanf("%d",&l);
        printf("%d ",num);
        int g=0;
        while(l--)
        {
            scanf("%d",&b);
            sum += b;
            sum = (sum + len) % len;
            printf("%c",a[sum]);
        }
        printf("\n");
    }
    return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值