CQUPT WEEKLY TRAINING (4)DIV2 解题报告

第一题:就是第n项等于前6项和。
注意限时比较紧,只有0.5s。所以用循环把结果存入数组。递归估计就TLE了

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>

using namespace std;
typedef long long LL;

const int MOD = 10000007;
LL f[10005];
int main()
{
    int t;
    int kase=1;
    scanf("%d",&t);
    int n;
    while(t--)
    {
        cin>>f[0]>>f[1]>>f[2]>>f[3]>>f[4]>>f[5]>>n;
        for(int i=6;i<=n;i++)
        {
            f[i]=(f[i-1]+f[i-2]+f[i-3]+f[i-4]+f[i-5]+f[i-6])%MOD;
        }
        printf("Case %d: ",kase++);
        cout<<f[n]%MOD<<endl;
    }
}

第二题:给个棋盘,黑白格相间。问最多能放多少个马,马之间不会打架。。
考虑到,马的走法。我全部放白或者黑就可以了,但是有特殊情况。就是棋盘有一边等于1的时候,全部放上就行。棋盘有一边等于2的时候,我就放一个田字格,中间间隔一个田字格。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef LL long long
int main()
{
    int T;
    scanf("%d",&T);
    int cas=0;
    while(T--)
    {
        cas++;
        int n,m,x,y;
        scanf("%d%d",&n,&m);
        if(n>m)swap(n,m);
        x=n*m;
        x=x/2;
        y=n*m-x;
        y=max(x,y);
        if(n==1)x=m;
        if(n==2)x=2*(2*(m/4)+min(2,m%4));
        printf("Case %d: %d\n",cas,max(x,y));
    }
    return 0;
}

第三题:全部1A,水模拟,读懂题意写写就好了。


#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>

using namespace std;


int main()
{
    int t,kase=1,l,r;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&l,&r);
        if(l>r)
        {
            printf("Case %d: %d\n",kase++,(2*l-r)*4+19);
            continue;
        }
        l=max(l,r);
            printf("Case %d: %d\n",kase++,l*4+19);
    }
    return 0;
}


第四题:也是水题,判断一下坐标关系就行了。


#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{
    int t,kase=1,x1,x2,y1,y2,m,a,b;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        scanf("%d",&m);
        printf("Case %d:\n",kase++);
        while(m--)
        {
           scanf("%d%d",&a,&b);
           if(x1<a&&a<x2&&y1<b&&b<y2)
                printf("Yes\n");
           else
                printf("No\n");
        }
    }
}

第五题:几何题。

如图,就是给大圆的半径和小圆的个数,求小圆半径。
这道题可以二分小圆半径,然后check。
也可以直接找几何关系。从大圆圆心连一条任意小圆的切线,切点连接该小圆圆心,构成一个直角三角形。然后用三角函数列式子就能解了。


#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>

using namespace std;

const double PI=acos(-1.0);

int main()
{
    int t,kase=1;
    scanf("%d",&t);
    double R,n,alpha,r;
    while(t--)
    {
        cin>>R>>n;
        alpha=PI/n;
        r=sin(alpha)*R/(1+sin(alpha));
        printf("Case %d: %.8lf\n",kase++,r);
    }
    return 0;
}


第六题:个人认为是好题。
给出一个n,求出一个比他大,且二进制的1的个数相同的第一个数。
硬模拟,我试过几次优化,感觉都不能过。
这里用的STL的next_permutation()就是求出下一个排列。
然后用字符串模拟一下,注意有可能该个数就是最大的排列,它的下一个需要特殊处理一下。

(这道题,理解有困难的,看看STL,string和基础的位运算)

另外gcc内置有几个位运算的函数,我之后尝试下可以不可以过。
给一篇好的位运算的文章:

http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=bitManipulation


#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>

using namespace std;

int fun(string a)
{
    int ans=1;
    for(int i=1;i<a.size();i++)
    {
        if(a[i]=='0')
            ans=(ans << 1);
        else
            ans=(ans << 1 | 1);
    }
    return ans;
}
int main()
{
    int t,kase=1;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        string str="";
        while(n)
        {
            if(n&1)
                str.insert(0,"1");
            else
                str.insert(0,"0");
            n/=2;
        }
        if(!next_permutation(str.begin(),str.end()))
        {
            str.insert(0,"10");
            str.erase(str.size()-1,1);
        }
        printf("Case %d: %d\n",kase++,fun(str));
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值