广东工业大学新生杯决赛(重现版)

转送门

Problem A: junior97与The Flash

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

NPS队首席代码手junior97是The Flash的big fan。
每天The Flash都要奔跑在城市中除暴安良(超级英雄真忙= =,还是做一条咸鱼好)。但是,跑步是需要消耗很多能量的,The Flash为了节省时间,想要一次性摄取除暴安良一天需要消耗的能量。在junior97强大的演算能力下,他帮助The Flash推算出了明天城市中哪个地点会出现事件(按照时间顺序给出,假设每个事件的发生时间不重叠),但是junior97懒得算The Flash需要跑的总路程了,他把这个问题抛给了cjcjcjcj和Zorro0302小弱鸡,Zorro0302和cjcjcjcj两脸懵逼,现在小弱鸡向各位大佬求助。
城市可以看作是一个边长为1的正n边形,事件只会发生在正n边形的每个顶点上,顶点编号按顺时针方向为1~n。
The Flash一开始在顶点1。为了节省能量,The Flash跑的是两点之间的最短距离。
(The Flash只要得到他需要跑的距离就能自动脑补出需要补充多少能量了)

Input

第一行一个数T(1<=T<=35),表示有T组数据,接下来T组数据的第一行有两个数n和m (3<=n<=20,1<=m<=1000),第二行有m个数,分别代表事件发生的地点(按时间顺序给出)。

Output

输出一个数,The Flash需要奔跑的最短距离(保留5位小数)

Sample Input

24 32 4 36 21 2

Sample Output

3.414211.00000

HINT

圆周率约等于3.141592653


本题中所有数据精确到小数点后5位即可



样例1:


 


A题--这题涉及的是余弦定理的应用。

详细可以看代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define pi 3.141592653
int main()
{
     int T;
     scanf("%d",&T);
     while(T--)
     {
          int n,m,i,j,a[1010];
          double r,b[22],jiaodu,sum=0;
          scanf("%d%d",&n,&m);
          for(i=0;i<m;i++)
          {
              scanf("%d",&a[i]);
          }

          jiaodu=360.0/(double)n;

              r=(  1.0 /((double)sqrt( 1.0-  cos(   jiaodu / 180.0 *pi   )  )  *sqrt(2.0)) );

          double k;

          for(i=1;i<n;i++)
          {
              k=jiaodu*(double)i;
              if(k>180.0)
              {
                  k=360.0-(double)jiaodu*i;
              }
              b[i]=r* sqrt(2.0) *(double)sqrt(1.0-(double)cos(   (  k/180.0*pi   )   )     );
          }
          b[0]=0;
          if(a[0]!=1)
          {
              if(a[0]==n||a[0]==2)
              {
                 sum+=1.0;
              }
              else
              {
                sum+=b[abs(a[0]-1)];
              }
          }
          for(i=1;i<m;i++)
          {
              if(abs(a[i]-a[i-1])==1||abs(a[i]-a[i-1])==n-1)
              {
                   sum+=1.0;
              }
              else
              {
                  sum+=b[abs(a[i]-a[i-1])];
              }
          }
          printf("%.5lf\n",sum);
     }
     return 0;
}

Problem B: 狗哥的肚子

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

在 ACM 集训队中,狗哥的肚子形状多变,令人啧啧称奇,但是大家都有一个疑问,狗哥的肚子在最大的时候,能有多大呢?于是大家通过观察测量,用三种近似形状和相对应的整数数据来描述狗哥的肚子。
但是狗哥的肚子实在太多变化的形状了,大家没有办法找出其中最大的值,于是请求你写一个程序,来计算狗哥的肚子横截面的最大面积。

Input

第一行是一个正整数T,代表有T组输入。
每组输入第一行是一个整数 N ,表示狗哥的肚子形状变化个数。
接下来 N 行,每行开头包括一个大写字母,可能是 T (三角形)、 R (矩形) 、 C (圆形) ,表示狗哥肚子横截面的形状。
在字母后,是一到两个整数,表示形状的尺寸,也就是说T后会跟着两个整数,分别代表着三角形的底和高,,R后会跟着两个整数,代表着矩形的两条邻边的长度,而 C 后会跟着一个整数,代表着半径。
保证 N ≤ 1000 ,尺寸都在[0,100]之间,且定义 π = 3.14159。

Output

对于每一组样例,输出最大的狗哥的肚子横截面积,结果请保留两位小数。

Sample Input

21T 3 24T 3 2R 2 1C 5C 10

Sample Output

3.00314.16

HINT

第二个输入,选择 C 10 ,因为 10 × 10 × 3.14159 = 314.159(保留两位小数) = 314.16 。

B题就是很水的按指令操作问题。

#include<stdio.h>
#include<algorithm>
#define pi 3.14159
using namespace std;
int main()
{
      int T;
      scanf("%d",&T);
      while(T--)
      {
           int i,n;
           double ds,hs,dc,hc,r,s[1050],maxz=0.0;
           char ch;
           scanf("%d",&n);
           for(i=0;i<n;i++)
           {
                getchar();
                scanf("%c",&ch);
                switch(ch)
                {
                    case 'T':scanf("%lf %lf",&ds,&hs);s[i]=(ds*hs)/2;break;
                    case 'R':scanf("%lf %lf",&dc,&hc);s[i]=dc*hc;break;
                    case 'C':scanf("%lf",&r);s[i]=r*r*pi;break;
                }
                maxz=max(maxz,s[i]);
           }
           printf("%.2lf\n",maxz);
      }
      return 0;

}

Problem C: 算法的魅力

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

有一天,肥宅又在玩二十四点,他用5、5、7、7又一次成功的凑出了这个点数,他看着这个点数,突然想到,在一到二十四这些整数中,其中为5和7的整倍数的数有5、7、10、14、15、20,21,他们加起来的和为92。
肥宅算出这个和,他内心想到,这个数真是太优美了,但是他突然觉得,算出1到24这个范围内的结果是不够的,还应该算出1到n中为5和7的整倍数的数之和,该怎么求呢?
可是肥宅太懒,他只想赶着吃土豆咖喱牛肉,于是肥宅把这个艰巨的任务委托了给你。你是否能借助算法的魅力,拯救肥宅呢?

Input

第一行一个整数T,代表有T组数据
接下来T行,每一行一个正整数N,代表肥宅想求的范围的上界。
下界为永远为1。
1 <= T <= 100
1 <= N <= 1e9

Output

对于每一组样例,你应该输出一行整数,代表每组数据的所求和的答案。

Sample Input

32410100

Sample Output

92221680

HINT

数字规模很大


这题我还真不会做,也是看网上别人的代码写的

#include<stdio.h>
typedef long long ll;
ll n;
ll cal(ll x)
{
     ll r=n/x*x;
     ll res=(x+r)*((r-x)/x+1)/2;
     return res;
}
int main()
{
      int t;
      scanf("%d",&t);
      while(t--)
      {
          scanf("%lld",&n);
          ll ans=cal(5)+cal(7)-cal(35);
          printf("%lld\n",ans);
      }
      return 0;
}

Problem D: Gakki的疑问

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

众所周知,新垣结衣(Gakki)很爱她的老公姚师姐,6月11日是Gakki的生日,姚师姐想送她生日礼物,于是跑去问:“老婆,你最近缺些什么吗?”,可爱的Gakki很傲娇,她拿起笔在纸上写了写,然后羞涩地塞给师姐,说:“这道题,你能在1s里解出来,就给我买钻石项链,解不出来,就买辆兰博基尼吧!”,只见纸上写着:
如果一个数字只含有0和1,那么这个数字我称为漂亮数,比如1, 0, 11, 10111这些数都是漂亮数,而2,3,200,91这些都不是,现在给你一个数字n,你是否能够把它拆成几个漂亮数的和,并且这些漂亮数的个数最少?
姚师姐大为震惊,当然不是因为兰博基尼很贵,他不差钱,而是因为傻白甜的老婆居然会出题考自己,姚师姐成功在1s内解出了这道题目,现在这道题目被媒体扒了出来,你是否有能力达到Gakki老公的水平呢?

Input

第一行输入一个样例数T,表示一共有多少数字需要计算,接下来有T行,每行1个数字n,对于每个数字n,求出组成它的最少数量的漂亮数字。1<=T<=10000, 1<=n<=1e6

Output

对于每个数字n,输出两行答案,第一行是漂亮数的个数,第二行是组成它的漂亮数,按大小从小到大输出,并且在升序情况下,小的数字尽量小。

Sample Input

2932

Sample Output

91 1 1 1 1 1 1 1 1310 11 11

HINT

例如113 = 1 + 11 + 101 = 1 + 1 + 111

你所得到的答案应该是1+1+111。


121 = 10 + 111 = 11 + 110

你所得到的答案应该是10+111。

这题其实我也不太会,看了题解就知道

#include<bits/stdc++.h>
using namespace std;
int a[13],b[9]={0,1,10,100,1000,10000,100000,100000};
int main()
{
     int T,n;
     scanf("%d",&T);
     while(T--)
     {
          scanf("%d",&n);
          int cnt=0;
          while(n)
          {
               int x=n,k=0;
               for(int i=1;i<=6&&x;i++)
               {
                    int y=x%10;
                    if(y>0)
                    {
                       n-=b[i];
                       k=k+b[i];
                    }
                    x/=10;
               }
               a[cnt++]=k;
          }
          sort(a,a+cnt);
          printf("%d\n",cnt);
          for(int i=0;i<cnt;i++)
          {
               printf("%d%c",a[i],i==cnt-1?'\n':' ');
          }
     }
     return 0;
}

Problem E: Joefery大佬的考核

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

在这一天,Joefery大佬在他的小弟zhangab出题的时候,拿了一道小学生题给zhangab做,Joefery大佬说:“你做我的小弟这么久了,是时候给你加薪升职了。喏,这道小学生水平的题目作为你的考核内容,做出来就给你加薪升职”,但是…zhangab是真的没做出来,所以zhangab向各位dalao求助,zhangab想要加薪啊啊啊啊……考核内容如下:

矩形AGFE跟正方形ABCD重叠,其中点G落在BC边上,D点落在EF边上,给定矩形的边EF和边AE的长度,问正方形ABCD的面积S%10007=?

Input

第一行是一个整数T,代表T个样例,T≤10000
每个样例输入两个整数,a和b,(分别代表矩形的边EF和AE)0<a,b≤10007;

Output

输出正方形面积S%10007

Sample Input

28460 416486 6334

Sample Output

66223589
这题用的是相似三角形   利用的是AED  和三角形 ABG 两个相似你就知道原来  正方形的边长原来是长方形的  长 × 宽

#include<stdio.h>
int main()
{
      int t;
      scanf("%d",&t);
      while(t--)
      {
          int a,b;
          scanf("%d%d",&a,&b);
          printf("%d\n",a*b%10007);
      }
      return 0;
}

Problem F: 没有题目背景的水题

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

不写题目背景了。。。
一整数数列a1, a2, ... , an,以及另一个整数k,求一个区间i,j,(1 <= i <= j <= n),使得ai + ... + aj = k。

Input

第一行输入T,表示有T组数据
每组第一行两个数n,k (2<=n<=5000,0<=k<=10^8)
第二行有n个数,就是a数列(0<=ai<=10^4)

Output

每组数据两个数,分别是区间的起始和结束位置。如果存在多个,输出i最小的。如果i相等,输出j最小的。

Sample Input

16 101 2 3 4 5 6

Sample Output

1 4

HINT

 对于每一组数据,我们都保证有解

题解:

居然是纯暴力解决。我一开始也不会做的。

#include<stdio.h>
typedef long long ll;
int main()
{
     int T;
     ll n,k;
     scanf("%d",&T);
     while(T--)
     {
         int i,j;
         ll a[5050];
         scanf("%lld%lld",&n,&k);
         for(i=0;i<n;i++)
         {
            scanf("%lld",&a[i]);
         }
         ll sum;
         int flag=1;
         for(i=0;i<n&&flag;i++)
            {
              sum=0;
              for(j=i;j<n&&flag;j++)
                {
                  sum+=a[j];
                  if(sum==k)
                  {
                      printf("%d %d\n",i+1,j+1);
                         flag=0;
                  }
                }
            }

     }
     return 0;

}

Problem G: 白色相簿的季节

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

又到了白色相簿的季节。狗哥作为广工最帅气的投递员兼代码手,因为最近突然想到没有女朋友而心情变得低落。那能怎么办?工作还是要继续啊!所以今天他又和往常一样开始了送快递的工作。但他发现他今天送的快递和往常不大一样。只有n封信,竟然是n个男生送给他们各自女朋友的信!!!面对这n对情侣的信(1<=n<=18),狗哥因为难过而失去了理智,他在这时问你,把这n封信全部配送错有多少种方案。并且把这首《届かない恋》送给了你。

Input

第一行一个T,表示样例数
接下来T行,每行一个正整数n(1<=n<=18),表示n封信。

Output

对于每组样例,输出一个数,表示n封信全部配送错的方案数。

Sample Input

223

Sample Output

12

这道题用到的是错排。

#include<stdio.h>
typedef long long ll;
int main()
{
      ll a[35]={0,0,1,2};
      for(int   i=4;i<=35;i++)
      {
           a[i]=(i-1)*(a[i-1]+a[i-2]);
      }
      int n,t;
      scanf("%d",&n);
      while(n--)
      {
           scanf("%d",&t);
           printf("%lld\n",a[t]);
      }
      return 0;
}

Problem H: 最小公倍数

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

最小公倍数指两个或多个整数公有的倍数中最小的一个。现在给出N个整数,取其中至少K个数求出他们的最小公倍数L,问L的最小值是多少?

Input

第一行包含一个整数T(1<=T<=8)表示有T个测试样例,接下来T个测试样例第一行包含两个整数N(2<=N<=100)和K(2<=K<=N),表示有N个数和至少选择其中K个,第二行包含N个正整数X(1<=X<=1000)。

Output

对于每个样例输出其相应的答案,答案范围保证在[1,1000],具体形式见样例。

Sample Input

24 21 2 3 45 36 2 3 3 7

Sample Output

26

HINT

#include<bits/stdc++.h>
using namespace std;
int main()
{
      int T;
      scanf("%d",&T);
      while(T--)
      {
          int n,k,a[1000],ans;
          scanf("%d%d",&n,&k);
          for(int i=0;i<n;i++)
          {
               scanf("%d",&a[i]);
          }
          for(int i=1;i<=1000;i++)
          {
               int cnt=0;
               for(int j=0;j<n;j++)
               {
                    if(i%a[j]==0)
                       cnt++;
               }
               if(cnt>=k)
               {
                   ans=i;
                   break;
               }
          }
          printf("%d\n",ans);
      }
      return 0;


}

Problem I: 狗哥的日常

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

狗哥超喜欢YYF的,觉得他超勇的,狗哥也学习了YYF的话癖,就是“Rua”。有一天,狗哥在愉快的刷着ICPC final的原题,每过一道,他都会喊出一句”Rua”,杰哥看了一下狗哥的刷题记录,发现他过了N道题,那么聪明的你,知道狗哥说了多少个Rua呢?

Input

首先是一个正整数T,代表数据组数
对于每一组,有一个正整数N(1<=N<=20),代表狗哥过的题数。

Output

对于每一组数据,输出对应行数的“Rua”(不含双引号),然后接一个空行。

Sample Input

3357

Sample Output

RuaRuaRuaRuaRuaRuaRuaRuaRuaRuaRuaRuaRuaRuaRua

HINT


#include<stdio.h>
int main()
{
      int T;
      scanf("%d",&T);
      while(T--)
      {
          int n,i;
          scanf("%d",&n);
          for(i=0;i<n;i++)
          {
              printf("Rua\n");
          }
          printf("\n");
      }
      return 0;
}

Problem J: csjhl和潮汕煎蚝烙

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

csjhl为什么叫csjhl呢?因为他很喜欢吃潮汕煎蚝烙。可是黄小悦同学一直喜欢和csjhl抢着吃,于是他们决定用24点决一死战。可是他们都很饿,所以一致同意玩简单版的24点。一共有5张牌,牌上数字的范围是1到10,牌的顺序不可以改变,并且只能使用加法和减法。在24点上csjhl单挑无敌,在他看到牌的时候他已经在思考用哪一种方法赢了黄小悦同学。可是csjhl不会数数,所以请你来编写一个程序告诉他一共有多少种方法取得胜利。

Input

输入一个T,表示样例组数。
接下来T行,每行5个整数ai。(0<ai<11)

Output

输出csjhl可以取胜的方案数。

Sample Input

31 1 5 5 101 1 7 7 107 7 1 1 10

Sample Output

012

HINT

第二组有一种方案 1-1+7+7+10=24

第三组有两种方案 7+7-1+1+10=24 7+7+1-1+10=24




#include<bits/stdc++.h>
using namespace std;
int a[6],ans;
void dfs(int num,int id)
{
     if(id==6)
     {
         ans += num==24;
         return ;
     }

     dfs(num+a[id],id+1);
     dfs(num-a[id],id+1);

}
int main()
{
     int T;
     scanf("%d",&T);
     while(T--)
    {
        ans = 0;
        for(int i=1; i<=5; ++i) scanf("%d",&a[i]);
        dfs(a[1], 2);
        printf("%d\n",ans);
    }
    return 0;


}

Problem K: 这题有点难

Time Limit: 1 Sec   Memory Limit: 128 MB

Description

给你两个正整数a、 b。
现在有Q次询问,每次询问给出一个整数c,问是否存在正整数x,y可以使得
x * a - y * b == c

Input

第一行一个整数,表示样例组数T( 1 <= T <= 20 )
每组样例第一行三个整数 a、 b、 Q,其中(1 <= a,b <= 100, 1 <= Q <= 10000)
接下来 Q行,每行一个整数 c(-100 <= c <= 100)

Output

对于每个若可以满足方程,则输出"Yes"(没有引号),否则输出"No"(没有引号)

Sample Input

12 2 3213034

Sample Output

NoYesYes

HINT


#include<bits/stdc++.h>
using namespace std;
int main()
{
      int T;
      scanf("%d",&T);
      while(T--)
      {
           int i,a,b,Q,c;
           scanf("%d%d%d",&a,&b,&Q);
           int ans= __gcd(a,b) ;
           while(Q--)
           {
                scanf("%d",&c);
                printf(c%ans==0?"Yes\n":"No\n");
           }
      }
      return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值