暑假训练赛3

目录

  1. Problem A: 数三角形
  2. Problem B: 项链
  3. Problem E: M.wjw的星期五
  4. Problem G: 卡斯丁狗要吃糖葫芦
  5. Problem J: 【蟠桃记】
  6. Problem K: 背包
  7. Problem L: 造围栏

Problem A: 数三角形

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 617  Solved: 350

[Submit][Status][Web Board]

Description

给定一个等边三角形,它的每条边被分成n等分,分别用平行于三边的直线过各个n等分点截这个三角形,如图所示:

请问,图中总共有多少个三角形?

Input

输入包含多组测试数据,直至EOF。

每组测试数据包含一个正整数n,表示三角形三边被分为了n等份(n<500)。

Output

 输出三角形的个数。

Sample Input

1 2 3

Sample Output

1 5 13

  • 一道数学题吧。。。。

#include<bits/stdc++.h>
using namespace std;
int main()
{
   int n;
   while(~scanf("%d",&n))
   {
       if(n%2)                                                        //如果是偶数
            cout<<(n+1)*(2*n*n+3*n-1)/8<<endl;
       else                                                            //奇数
            cout<<n*(n+2)*(2*n+1)/8<<endl;
   }
   return 0;
}

Problem B: 项链

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 102  Solved: 45

[Submit][Status][Web Board]

Description

强迫症非常麻烦,尤其是买东西的时候。冠璐女神的生日快到了,某强迫症要送一条项链送给她,重点是,这条项链要对称,这条项链要对称,这条项链要对称。(很重要所以说三遍)

项链都是环状的(废话...),每条项链上有颜色不同的珍珠,用小写字母 a−z 代表不同的颜色。一条项链是对称的,是指从项链的某个位置开始,两个方向看过去是一样的(珍珠的颜色一样)。

比方说,如图所示的项链(第一个输入样例),从箭头位置开始看,无论是顺时针还是逆时针,看到的都是ababbaba,因此这条项链是对称的。

有的项链非常长,很难看出它们的对称性。你能快速地判断哪些项链是对称的吗?

Input

第一行有一个整数N,表示一共有N条项链。

接下来N行,每行一个由小写字母组成的字符串,代表项链上珍珠的颜色,可能从项链的任意位置开始。

Output

输出N行,如果项链是对称的,输出YES,否则输出NO。

Sample Input

3

abbabaab

abab

abcdefg

Sample Output

YES

YES

NO

HINT

1≤N≤5,项链长度≤10^5

  • c_str()是string类的一个成员函数, 返回常量char *类型的C风格字符串。

  • strstr()判断s是否是z的子串,如果是就返回yes;

  • 将s串乘2再反转,如果是对称的话那原串必定是该处理后的子串

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    string s,z;
    scanf("%d",&n);
    while(n--)
    {
        cin>>s;
        z=s+s;
        reverse(z.begin(),z.end());
        printf("%s\n",strstr(z.c_str(),s.c_str())?"YES":"NO");
    }
}

Problem E: M.wjw的星期五

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 39  Solved: 17

[Submit][Status][Web Board]

Description

wjw最近运气极其差,什么roll点1-100连着十次都是个位数啊,买个珍珠奶茶没有珍珠啊,吃方便面没有调料包啊...

迷信的wjw觉得,一定是因为这个月的13号正好是星期五,才会导致他的运气这么差。

现在他想知道,在某个年份中,有多少个月的13号是星期五,这样他才可以提前做好心理准备。

PS.已知1998年1月1日是星期四,输入的年份肯定大于或等于1998年。

Input

input

输入只有一行,表示年份(大于等于1998年)

Output

output

输出只有一行,表示这一年中有多少个月的13号是星期五

Sample Input

1998

Sample Output

3

HINT

 说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;

#include<bits/stdc++.h>
using namespace std;
const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
    int x,cnt=0,pp=0;
    scanf("%d",&x);if(x%400==0 || (x%4==0&&x%100!=0))pp=1;
    for(int i=1998;i<x;i++)
    {
        if(i%400==0 || (i%4==0&&i%100!=0))
            cnt++;//记闰年数
    }
    int days=(x-1998)*365+cnt;
    int y=(days%7+4)%7;//该年第一天是周几
    int sum=0,flag=0;
    for(int i=1;i<=12;i++)
    {
        if(pp==1&&i==3)sum++;//cout<<((sum+13)%7+y-1)%7<<endl;
        if(((sum+13)%7+y-1)%7==5)flag++;
        sum+=month[i];
        
     }
     cout<<flag<<endl;
}

Problem G: 卡斯丁狗要吃糖葫芦

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 191  Solved: 70

[Submit][Status][Web Board]

Description

    卡斯丁狗喜欢吃糖葫芦(喜欢前面再加两个字“并不”),但是,但是,他很挑剔,他只吃这样的,就是这样的,就是,就是不管你从哪一头吃,看起来都是一样的,卡斯丁狗给你了一个很长的串,他记得这个很长的串有N个长度一样且满足上述的条件的串组成,你告诉他,他有没有记错。

Input

一个字符串,和一个数N(N<=1000)

Output

 YES或者NO

Sample Input

abbatxxt 2

abbatxtc 2

Sample Output

YES

NO

  • 判断n能否被len(长度)整除,如果不能直接输出NO了!!

  • 然后判断每一段是否为回文串

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000;
char a[maxn];
int main()
{
    int n;
    memset(a,'\0',sizeof(a));
    while(~scanf("%s",a))
    {
        
        scanf("%d",&n);    
        int len=strlen(a);//for(int k=0;a[k]!='\0';k++)cout<<a[k]<<",";
        if(len%n!=0)                            //一开始就因为没有判断然后就WA!!!横!!
        {
            cout<<"NO\n";continue;
        }
        int x=len/n;
        int i=0,j=0,flag=1,y=0,k;
        while(j<n)
        {
            k=0;
            y=x*(j+1);//cout<<"y="<<y<<endl;
            //cout<<"i="<<i<<endl;cout<<"y="<<y<<endl;
            for(i;i<(y+x)/2;i++)
            {
                //printf("a[%d]=%c,a[%d]=%c\n",i,a[i],y-1-k,a[y-1-k]);
                //cout<<""<<a[i]<<endl;
                //cout<<""<<a[y-i-1]<<endl;
                if(a[i]!=a[y-1-k])
                {
                    flag=0;break;
                }
                k++;
            }
            i=y;//cout<<"i="<<i<<endl;
        
            j++;
        }
        if(flag)cout<<"YES\n";
        else cout<<"NO\n";

    }
    
    return 0;
}

Problem J: 【蟠桃记】

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 498  Solved: 441

[Submit][Status][Web Board]

Description

喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!

什么问题?他研究的问题是蟠桃一共有多少个!

不过,到最后,他还是没能解决这个难题,呵呵^-^

当时的情况是这样的:

第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

Input

输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的

Output

对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。

Sample Input

2 4

Sample Output

4 22

  • 注意是可以从第n天往前递推的;

#include<stdio.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0||n>30)break;
        int s=1;
        for(n; n>1; n--)
        {
            s=(s+1)*2;
        }
        printf("%d\n",s);
    }
}

Problem K: 背包

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 193  Solved: 102

[Submit][Status][Web Board]

Description

你有一个神奇的背包,他的容积是m(0<m<=80),只有你装满他,你才能拿走他,现在给你n(1<=n<=20)个物品Xi(Xi<=m),那么一共有几种方式,可以让你拿走背包?

Input

第一行 n,m

第二行 n个数字

Output

输出方案数

Sample Input

3 40

20 20 20

Sample Output

3

void dfs(变量){
    if(超出阈值){    //判断边界
        return;
    }
    if(条件成立){
        ans++;
        return;
    }
    for(int i=s;i<n;i++){    //尝试每一种可能性
        dfs(step+1);            //继续下一步
    }
    return;
}
  • 代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,x[30],i,j,ans;//n:物品数;m:容积;x:每个物品体积;ans:方案数
void dfs(int v,int s){    //深度优先搜索(不撞南墙不回头)
                        //v:容积;s:下标
    if(!v){    //如果容积是0则表示已经装满了,也是一种装法,然后返回
        ans++;
        return;
    }
    if(s>n||v<0)    //下标>n,即装了所有的物品都没装满;v<0,装太多了剩下的容积不够
        return;        //不符合,结束
    for(int i=s;i<n;i++)    //继续尝试
        dfs(v-x[i],i+1);        
    return;
}
int main(){
    while(cin>>n>>m){
        for(i=0;i<n;i++)cin>>x[i];
        ans=0;
        dfs(m,0);
        cout<<ans<<endl;
    }
    return 0;
}

Problem L: 造围栏

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 216  Solved: 92

[Submit][Status][Web Board]

Description

在那,山地那边,海地那边,n*m的格子里面有k匹草泥马。学名曰羊驼。LLL非常喜欢骑马,所以他就想偷至少一匹泥马,如果他骑马逃出了n*m的格子就代表偷马成功,他可以驾驭任何一匹泥马。每个回合内LLL可以驾驭他的泥马往上下左右任意地方移动一格。而牧马人JJJ发现有人在偷他的马,所以就想造围栏把泥马围在n*m的格子里面,每个回合内JJJ可以造一个围栏。现在假设两个人都采取最佳的策略,LLL先下手,问最后LLL是否得手

Input

多组测试数据

第一行输入n,m ,k (1<=n,m<=100, 0<=,k<=100,)

接下来k行每行输入x,y。表示每只神兽的位置(1<=x<=n,1<=y<=m)

Output

成功输出YES。

否则输出NO。

Sample Input

2 2 1

1 2

3 4 0

100 50 2

50 25

50 25

Sample Output

YES

NO

NO

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[101][3],n,m,k;
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        int x=0;判断用
        if(k==0)printf("NO\n");//没有马就肯定是失败的了
        else
        {
            for(int i=1;i<=k;i++)//有k匹马
                scanf("%d%d",&a[i][1],&a[i][2]);//输入马的坐标(x,y)
            for(int i=1;i<=k;i++)//遍历坐标进行判断
            {
                if(a[i][1]<=5)//上边距
                {
                    cout<<"YES\n";
                    x=1;
                    break;
                }
                if((n-a[i][1])<=4)//下边距
                {
                    cout<<"YES\n";
                    x=1;
                    break;
                }
                if(a[i][2]<=5)//左边距
                {
                    cout<<"YES\n";
                    x=1;
                    break;
                }
                if((m-a[i][2])<=4)//右边距
                {
                    cout<<"YES\n";
                    x=1;
                    break;
                }
             }
            if(x==0)cout<<"NO\n";
       }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值