浙江工业大学迎新决赛

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

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

题目描述

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

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

输入描述:

第一行一个数T,表示有T组数据。
对于每组数据,第一行输入一个数n,表示国家的数量,接下来一行输入n个数,a1,a2,…,an,其中ai表示第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≤ai≤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+b1)%k = (a'2+b2)%k = …… = (a'm + bm)%k。

输入描述:

第一行一个数T,表示有T组数据。
对于每组数据,
第一行三个整数,n, m, k。
第一行输入n个数, a1,a2,…,an, 表示A数列中的数,
第二行输入m个数, b1,b2,…,bm, 表示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×105,
1≤ai,bi,k≤109
#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闲着无聊,就开始拆自己的电脑,他发现主板上某个元件可以视作如图所示无限长的电路。已知该电路由三种不同的电阻r1,r2,r3构成,他想要计算ab之间的电阻。

输入描述:

第一行输入一个整数T,表示数据组数,
接下来T行,每行三个整数r1,r2,r3

输出描述:

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

输入

2
1 1 1
1 2 3

输出

2.73
5.46

备注:

T≤104,
1≤r1,r2,r3≤104
从无穷远处倒推

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值