浙江工业大学迎新决赛

这次比赛就过了五个签到题,真的菜。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        “伟大的勇栗兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您。您骑着威风凛凛的小白兔,带领栗子们奋勇前行。伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,
冲在每场战争的前线——无论您在哪里,他们都能找到您。骑小白兔飞驰吧,凶猛的女王,但愿您有真正的朋友和软弱的敌人。”
今天,冰雪聪明的栗酱终于玩到了她梦寐很久的文明游戏。
不过作为一个萌新,兔头獐脑的栗酱自然不愿意第一次玩就遇到一个尴尬的结局,于是希望通过你来寻找一个完美结局。

        已知游戏结束前场上有n个国家,第i个国家有ai块土地,任意2个国家若是想建立外交关系,则需要互相在对方的一块土地上建立一个大使馆。
一块土地只能建立一个大使馆,若一个国家和其他国家存在外交关系,则需要征用一块己方土地作为备用大使馆。
        完美结局的定义是:找到最多数量的国家,使他们相互之间存在外交关系。

输入描述:

  
  
第一行一个数T,表示有T组数据。
对于每组数据,第一行输入一个数n,表示国家的数量,接下来一行输入n个数,a 1,a 2,…,a n,其中a i表示第i个国家拥有的土地数量。每两个相邻的数之间用空格隔开。

输出描述:

对于每一个询问,输出一个数,即完美结局下,相互建立外交关系的国家数量。
示例1

输入

2
5
2 2 2 2 2
10
8 6 5 9 2 7 10 3 3 9

输出

2
6

说明

对于第一个样例:
最多只能找到2个国家,使他们互相建立外交关系。
对于第二个样例:
第1,2,4,6,7,10个国家间可互相建立外交关系,最多数量为6。

备注:

  
  
T≤10
1≤n≤1000
1≤a i≤n
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
bool cmp( int a,  int b)
{
     return a > b;
}
int main()
{
     int T;  scanf ( "%d" , &T);
     while (T--)
     {
         int n;  scanf ( "%d" , &n);
         int a[1001];
         for ( int i = 1; i <= n; i++)
             scanf ( "%d" , &a[i]);
         sort(a+1, a + n+1, cmp);
         for ( int i = 1; i <= n; i++)
         {
             if (a[i] <i) //a[i]只需大于i,便可与前i个国家建立外交关系并留下一块空地;
             {
                 printf ( "%d\n" , i-1);
                 break ;
             }
         }
     }
     return 0;
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

栗酱有一个长度为n的数列A,一个长度为m的数列B,现在询问A中有多少个长度为m的连续子序列A',
满足(a' 1+b 1)%k = (a' 2+b 2)%k = …… = (a' m + b m)%k。

输入描述:

  
  
第一行一个数T,表示有T组数据。
对于每组数据,
第一行三个整数,n, m, k。
第一行输入n个数, a 1,a 2,…,a n, 表示A数列中的数,
第二行输入m个数, b 1,b 2,…,b m, 表示B数列中的数。

输出描述:

每一组数据输出一行,满足条件的连续子序列数量。
示例1

输入

2
3 2 5
7 8 7
8 7
3 2 5
7 8 9
8 7

输出

1
2

备注:

  
  
T≤15,
2≤m≤n≤2×10 5,
1≤a i,b i,k≤10 9
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
int a[200001],b[200001];
using namespace std;
int main()
{
     int T; scanf ( "%d" ,&T);
     while (T--)
     {
         int n,m,k;  scanf ( "%d%d%d" ,&n,&m,&k);
         for ( int i=1;i<=n;i++)
             scanf ( "%d" ,&a[i]);
         for ( int j=1;j<=m;j++)
             scanf ( "%d" ,&b[j]);
             int s=0;
         for ( int i=1;i<=n-m+1;i++)
         {
             int t=(a[i]+b[1])%k;  int wh=1;
             for ( int j=i+1; ;j++)
             {
                 if ((a[j]+b[wh+1])%k==t&&wh<m) wh++;
                 else break ;
             }
             if (wh==m)s++;
         }
         printf ( "%d\n" ,s);
     }
     return 0;
}                                  这题比赛的时候算了一下会超时就没做,没想到,提交301ms.

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

有不等式 y⋅x3≤ n,已知y为正整数,x为大于1的正整数,问当x和y的解数量刚好为m的时候n的最小值,如果不存在输出 -1。

输入描述:

多组数据读入。
每组数据一个数字m,如题所示。

输出描述:

每组数据输出一行,输出答案。
示例1

输入

1

输出

8

说明

当方案恰好只有一种的时候,n的最小值为8,此时y=1,x=2。

备注:

1 ≤ m ≤ 1016

#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main( )
{
     long long m;
     while ( scanf ( "%lld" , &m) != EOF)
     {
         long long l = 2, r = 9*m; 
         while (l <= r)
         {
             long long p = (l + r) / 2;
             long long s = 0;
             for ( long long i = 2; i <= 1000000; i++)
             {
                 if (p < i*i*i)  break ;
                 s = s + p /(i*i*i);
             }
             if (s >= m) r = p-1;
             else l = p + 1;
         }
         long long sum = 0;
         for ( long long i = 2; i <= 1000000; i++)
         {
             if (l < i*i*i)  break ;
             sum = sum + l / (i*i*i);
         }
         if (sum == m)  printf ( "%lld\n" , l);
         else printf ( "-1\n" );
     }
     return 0;
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

小周最近在玩一款二战游戏,他因而对曲射炮的轨迹产生了很大的兴趣,但是在尝试计算后,小周发现这个问题并不是那么简单,他因而来请教你这位计算机高手,请你来帮帮他吧。问题大致可描述为,在二维平面的原点(0,0)处有一曲射炮,炮口可沿任意方向发出初速度为v的炮弹,小周想要把炮弹投射到点(x,y)处,现在你需要帮助小周得出炮口与地面夹角的弧度。为使问题简化,我们忽略空气阻力,x轴沿水平方向分布。设重力加速度g=9.8。

输入描述:

第一行为一个整数T,表示输入的数据组数。
每组数据对应一行输入, 依次为三个正整数x,y,v,含义如题面所示。

输出描述:

每组数据输出一行,如果无论如何挑战炮口与地面夹角都无法将炮弹投射这目标处,输出“NO SOLUTION.”(不包括引号),否则从小到大输出所有可能的弧度(均四舍五入至小数点后5位,如果有两个解四舍五入至小数点后5位后相同,只视为一个解),中间用一个空格分隔。
示例1

输入

4
45 56 78
32 78 55
33 33 25
12 25 25

输出

0.93196 1.53271
1.24254 1.50973
NO SOLUTION.
1.25456 1.43951

备注:

1≤T≤200,
0 < x ≤ 10000
0 < y ≤ 10000
0 < v ≤ 20000
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
     int T; scanf ( "%d" ,&T);
     while (T--)
     {
         int x,y,v;
         scanf ( "%d%d%d" ,&x,&y,&v);
         double a=9.8*x*x/(2.00*v*v);  设一个角度,把所有变量带入,最后转化成一个关于tan()的一元二次方程;
         double b=-1.00*x;              
         double c=9.8*x*x/(2.00*v*v)+1.00*y;
         if (b*b-4*a*c<0)  printf ( "NO SOLUTION.\n" ); 
         else if (b*b-4*a*c==0)
         {
             double h1=(-b+ sqrt (b*b-4*a*c))/(2.00*a); 直接求根
             printf ( "%.5lf\n" , atan (h1));
         }
         else
         {
             double h1=(-b+ sqrt (b*b-4*a*c))/(2.00*a);
             double h2=(-b- sqrt (b*b-4*a*c))/(2.00*a);
             if (h1>h2) swap(h1,h2);
             printf ( "%.5lf %.5lf\n" , atan (h1), atan (h2));
         }
     }
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        栗酱突发闲心,玩了一会儿仙剑。
        她玩的这个版本的仙剑非常简单,打架的时候,每次只有一个小怪,栗酱也只有一个主角,主角在每回合开始先攻击小怪,小怪有a点生命值,主角有b点生命值,小怪有c点攻击力,主角有d点攻击力,每次攻击都会造成确确实实的攻击力的伤害。
        生命值小于等于零时就会挂掉。
        栗酱发现好像战斗一开始就已经能知道结果了,请你帮她算一下,这样她就可以挂机去做更有趣的事了。
        数据保证攻击力和初始生命值均大于等于1。

输入描述:

第一行一个数据组数T。
每组数据一行4个整数a,b,c,d,数据之间用一个空格隔开。

输出描述:

对于每组数据每行给出一个"Yes"或"No",代表栗酱能否取得胜利。
示例1

输入

2
1 2 3 4
84 3 23 6

输出

Yes
No

说明

样例1解释:
第一回合时栗酱先发动攻击,小怪的生命值:1−4≤0,所以栗酱取得了胜利。

备注:

T≤1000,
1≤a,b,c,d≤1000
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
     int T; cin >> T;
     while (T--)
     {
         int a, b, c, d;
         cin >> a >> b >> c >> d;
         while (1)
         {
             a = a - d;
             if (a <= 0) break ;
             b = b - c;
             if (b <= 0)  break ;
         }
         if (a <= 0) cout <<  "Yes" ;
         else cout <<  "No" ;
         cout << endl;
     }
     return 0;
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        栗酱一个人闲得无聊的时候总是会一个人玩一些有趣的游戏。
        有一天,她在机房里看见了一张图,可能是做acm的学长留下的:

        栗酱想知道每一个数字,横着竖着分别有几根火柴呢?(由于火柴商偷工减料,我们认定,只要存在棍子,它就是火柴!)


输入描述:

第一行一个数据组数T。
每组数据一行给出一个数字'a'。

输出描述:

对于每个数字给出两个值,分别是横着有几根火柴,竖着有几根火柴。
示例1

输入

1
0

输出

2 4
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
     int a[10][2];
     a[0][0] = 2, a[0][1] = 4;
     a[1][0] = 0, a[1][1] = 2;
     a[2][0] = 3, a[2][1] = 2;
     a[3][0] = 3, a[3][1] = 2;
     a[4][0] = 1, a[4][1] = 3;
     a[5][0] = 3, a[5][1] = 2;
     a[6][0] = 3, a[6][1] = 3;
     a[7][0] = 1, a[7][1] = 2;
     a[8][0] = 3, a[8][1] = 4;
     a[9][0] = 3, a[9][1] = 3;
     int T; cin >> T;
     while (T--)
     {
         int n; cin >> n;
         cout << a[n][0] <<  ' ' << a[n][1] << endl;
     }
     return 0;
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        自从学姐拒绝了qwb之后,qwb开始了疯狂的骚扰。qwb来到了一个公共电话亭,他摸摸口袋只有n元钱。
        已知该公用电话的规则是,前3分钟一共收费x元(不到3分钟也要收x元),超过3分钟每分钟收费y元(不到1分钟也要收y元)。(先扣钱再打电话。)
        那么问题来了,qwb最多骚扰学姐几分钟?(假设学姐不会挂qwb电话)

输入描述:

第一行输入一个整数T,表示数据组数,
接下来T行,每行三个整数n,x,y 。

输出描述:

每行输出一个整数,表示qwb最多骚扰学姐的分钟数。
示例1

输入

2
10 5 1
5 4 1

输出

8
4

备注:

1≤T≤10000,
1≤n,x,y≤10000
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
     int T; cin >> T;
     while (T--)
     {
         int n, x, y;
         cin>>n>>x>>y;
         int sum = 0;
         if (n >= x)
         {
             sum = 3;
             if (x >= 3 * y)
                 sum += (n - x) / y;
             else
                 sum =( n / x)*3 + (n - (n / x)*x) / y;
         }
         cout << sum << endl;
     }
     return 0;
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        qwb闲着无聊,就开始拆自己的电脑,他发现主板上某个元件可以视作如图所示无限长的电路。已知该电路由三种不同的电阻r 1,r 2,r 3构成,他想要计算ab之间的电阻。

输入描述:

   
   
第一行输入一个整数T,表示数据组数,
接下来T行,每行三个整数r 1,r 2,r 3

输出描述:

每组数据输出一行,保留两位小数。
示例1

输入

2
1 1 1
1 2 3

输出

2.73
5.46

备注:

   
   
T≤10 4,
1≤r 1,r 2,r 3≤10 4
从无穷远处倒推

#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
     int T; cin >> T;
     while (T--)
     {
         double r1, r2, r3;
         cin >> r1 >> r2 >> r3;
         double R = r2*1.00;
         for ( int i = 1; i <= 1000; i++)
         {
             R = 1.00*r2*(r1 + r3 + R) / (r2 + r1 + r3 + R);
         }
         cout << setiosflags(ios::fixed) << setprecision(2) << r1 + r3 + R << endl;
     }
     return 0;
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        栗酱这次遇到了一个大麻烦,她手里只有一张大钞,面值为A元,但是现在临时需要花费B块钱了。

        她的花费非常紧急,所以她来到一个小卖部来兑,可是小卖部的老板态度极差,拒绝了栗酱的直接兑换请求。

        栗酱没有办法,周边也没有别的店,栗酱只好在店里强行花费一些钱来获取这个零散的B块钱了。

        但是这个店家十分奇怪,在知道栗酱需要B块钱后,会尽可能地不找给栗酱相应的钱,以获取利益。栗酱赶时间,花多少钱反而不那么重要了,请帮栗酱算一下,只买一次东西,一定能得到B块零钱的最少花费是多少。(货币的面值仅存在这些取值{0.01,0.02,0.05,0.10,0.50,1.00,2.00,5.00,10.00,20.00,50.00,100.00})

输入描述:

多组数据,数据第一行T表示数据组数。
每组数据一行,A,B分别代表栗酱当前的大钞和需要的零钱。

输出描述:

每组数据一行,输出最少花费。
示例1

输入

2
0.05 0.01
0.10 0.05

输出

0.02
0.01

说明

第一个样例:
如果付0.01块,老板会找你两个0.02。
花0.02老板就没办法了,只能找你一个0.02,一个0.01,或三个0.01

备注:

T≤100,
a>b,
a,b∈{0.01,0.02,0.05,0.10,0.50,1.00,2.00,5.00,10.00,20.00,50.00,100.00}
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
int main()
{
     int T;  scanf ( "%d" , &T);
     while (T--)
     {
         double a, b;
         scanf ( "%lf%lf" , &a, &b);
         if (b == 0.01)
         {
             if (a == 0.02)
                 printf ( "0.01\n" );
             else
                 printf ( "%.2lf\n" , a - 0.03);
         }
         else if (b == 1.00)
         {
             if (a == 2.00)
                 printf ( "0.01\n" );
             else
                 printf ( "%.2lf\n" , a - 3.99);
         }
         else if (b == 10.00)
         {
             if (a == 20.00)
                 printf ( "0.01\n" );
             else
                 printf ( "%.2lf\n" , a - 39.99);
         }
         else
             printf ( "0.01\n" );
     }
     return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值