江西财经大学第一届程序设计竞赛

链接:https://www.nowcoder.com/acm/contest/115/A
来源:牛客网

贪玩蓝月
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

"挤需体验五番钟,里造会挨上这款游戏!"
怎么可能嘛!当我是傻子吗!#?%!“”@……
于是我就去玩了,然后我果然成功证明,我是正确的,这破游戏,真的很无聊.
有多无聊呢,和这道题一样.
------------------------------------
问题有两种情况
0 给出两个100以内的正整数做加法
1 给出一个字符串问有多少个字符(字符串长度不超过100000)

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例先输入一个整数N(0或者1)
若N为0,则输入两个整数a,b(0<=a,b<=100)
若N为1,则输入一个字符串s

输出描述:

输出T行
每行输出一个样例对应的结果
示例1

输入

2
0 1 1
1 aa

输出

2
2

a+b签到

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int op;
        cin>>op;
        if(op==0)
        {
            int a,b;
            cin>>a>>b;
            cout<<a+b<<"\n";
        }
        else
        {
            string s;
            cin>>s;
            cout<<s.size()<<"\n";
        }
    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/115/B
来源:牛客网

大吉大利
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给出一个出生日期,比如:1999-09-09,
问:从出生那一天开始起,到今天2018-04-21为止(包括出生日期和今天),有多少天,年月日都不包含数字4?

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包含一个字符串“yyyy-mm-dd”(1990<=yyyy<=2018)
题目保证测试数据的正确性

输出描述:

输出题意要求的天数
示例1

输入

1
1999-09-09

输出

5020

日期统计,把它搞到2018-4-21就好啦

#include<bits/stdc++.h>
using namespace std;
int md[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int leap(int y)
{
    return y%4==0&&y%100!=0||y%400==0;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int y,m,d,cnt=0;
        scanf("%d-%d-%d",&y,&m,&d);
        if (m!=4&&d%10!=4&&y%10!=4)cnt++;
        if (leap(y))md[2]=29;
        while(y!=2018||m!=4||d!=21)
        {
            d++;
            if(d>md[m])d=1,m++;
            if(m>12)
            {
                m=1;
                y++;
                if(leap(y))md[2]=29;
                else md[2]=28;
            }
            if(m!=4&&d%10!=4&&y%10!=4)cnt++;
        }
        printf("%d\n",cnt);
    }
}

链接:https://www.nowcoder.com/acm/contest/115/C
来源:牛客网

今晚吃鸡
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

决赛圈还剩下两个人,“伏地魔”XDD和跑毒进圈的FZL,XDD拿着狙击枪AWM瞄准并准备射击奔跑中的FZL。
XDD知道自己只有这一次机会,如果失误了,他就会被大哥FZL空中360度甩狙一枪带走。
那么XDD能吃鸡吗,请你帮助他。
-------------------------------------------
为了便于分析,子弹,XDD,FZL都假设为原点,子弹水平射出,FZL在奔跑过程中与XDD的距离不变。
子弹下坠的加速度为9.8米每秒。
给出 XDD和FZL的距离 浮点数 L 、子弹的速度 浮点数V1、FZL奔跑的速度浮点数 V2
XDD需要知道从射击到击中目标这段时间内 子弹下坠的距离 L1和 FZL跑动的距离L2,从而预判射击的位置,请你帮他计算。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包括三个浮点数 L V1 V2(0<L,V1,V2<=10000)

输出描述:

输出T行
每个测试用例输出一行对应的结果
L1 L2(一个空格隔开,结果保留6位小数)
示例1

输入

1
100 1000 10

输出

0.049000 1.000000

物理题,求出时间t

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        double l,v1,v2,t;
        cin>>l>>v1>>v2;
        t=l/v1;
        printf("%.6f %.6f\n",4.9*t*t,v2*t);
    }
}

链接:https://www.nowcoder.com/acm/contest/115/D
来源:牛客网

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

题目描述

事情,是这样的。
有这么一天双休日的中午。
我刚把我衣服扔进了洗衣机,然后拿了个小板凳坐在旁边发呆。
然后突然想到这么无聊干脆玩会阴阳师好了,于是从斗篷帽子里掏出我的手机登录了阴阳师。
看着更新公告里写着的新SSR式神一目连感叹了一下:我要是能有个一目连该多好啊
看了一眼我家帅气的扛把子咕咕,正准备肝困难的时候发现庭院里那一串灯笼里的调查问卷有蝴蝶在绕,于是点进去填了一波在最结尾写上了我当时的愿望:我想要一目连。
然后奖励了一个符,顺手就抽了。本来以为又是R卡,没想到手机震动了一下。
握草!!!一目连!!!!
当时我就激动的站了起来使劲看了一眼然后仰天大笑以及截图装逼。
---------------------------------------------------------------------------------------
SSR全称为superior super rare,特级超稀有。一般为卡牌类游戏最高稀有等级。
 
题目是给出三个字符,求其升级到SSR所需要的次数。
最小为AAA,最大为SSR;
SSQ升级到SSR需要升级1次,
SRR升级到SSR需要升级19次。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包含三个连续的大写字母(A - S)

输出描述:

每个样例输出一行
升级到SSR所需的次数
示例1

输入

3
SSR
SRR
AAA

输出

0
19
6857

备注:

SRR升级到SSR的过程:
SRR -> SRS -> SSA ->SSB -> SSC -> ……->SSR 共19次

直接按照进制算啊

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        cout<<('S'-s[0])*19*19+('S'-s[1])*19+('R'-s[2])<<"\n";
    }
}

链接:https://www.nowcoder.com/acm/contest/115/E
来源:牛客网

消息列表
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

当你的好友给你发来一条消息,你的消息列表上就会置顶显示该好友的名字以及该好友发给你的消息总数,换句话说,你的消息列表里的好友是按跟你发消息的时间进行排序的,给你发消息的时间离当前时间越近的好友将排到越前面。当然,你可能会手动置顶一些好友,那么其他的好友给你发消息时,他们的名字就只能在你手动置顶好友的后面再置顶了。如果消息被你查看或者忽略,又或者你把好友消息删除了,消息总数将重置为0。

根据用户的需求,有以下几个功能,需要你来实现:
(1)recv:收到一条好友消息,对于手动置顶好友的消息,将在“手动置顶好友列表”里置顶;对于其他好友的消息,将在“手动置顶好友列表”之下的消息列表里置顶,同时都需要显示该好友的消息总数。
(2)view:查看好友消息,将使该好友消息数变为0。
(3)up:手动置顶好友。
(4)down:取消手动置顶。
(5)delete:删除好友消息,这个操作将使该好友从消息列表中删除,同时取消对该好友的手动置顶(如果存在的话)。

假设初始消息列表为空,经过了一系列好友消息的操作之后,最终的消息列表将是怎么样的呢?

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例。
每组样例
第一行输入一个整数M,表示操作数(1≤M≤1000000);
接下来M行,
每行输入一个操作,由一个操作类型和一个好友id构成,之间以空格分开,操作类型如上面5个英文单词表示,
例如:“recv 123456”表示接收到id为123456的好友的一条消息,“delete 123456”表示在消息列表中删除 id 为123456的好友的消息记录。
为了简化问题,一开始消息列表为空并假设好友名字id由六位数字“唯一”标识(000000≤id≤999999),
题目保证输入数据的一致性。

输出描述:

每组样例,
输出最后的消息列表,自顶向下,每行输出一个:“好友id 消息数”。
每组样例后空一行。
示例1

输入

1
13
recv 000001
recv 000002
up 000002
view 000001
recv 000002
recv 000004
up 000004
up 000001
recv 000004
recv 000003
view 000001
view 000004
down 000002

输出

000004 0
000001 0
000003 1
000002 2

模拟一下,这个没什么好说的,但是贡献wa

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct T
{
    int is,tt,id,mes;
}a[N];
int cmp(T a,T b)
{
    return a.tt>b.tt&&a.is==b.is||a.is>b.is;
}
int  main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof a);
        int m;
        cin>>m;
        int tot=0;
        while(m--)
        {
            string s;
            int id;
            cin>>s>>id;
            a[id].id=id;
            if(s[0]=='r')
                a[id].mes++,a[id].tt=++tot;
            else if(s[0]=='v')
                a[id].mes=0;
            else if(s[0]=='u')
                a[id].is=1;
            else if(s[0]=='d')
                a[id].is=0;
            if(s[2]=='l')   a[id].mes=0,a[id].is=0,a[id].tt=0;
        }
        sort(a,a+N,cmp);
        for(int i=0; i<N; i++)
            if(a[i].tt)printf("%06d %d\n",a[i].id,a[i].mes);
        printf("\n");
    }
    return  0;
}

链接:https://www.nowcoder.com/acm/contest/115/F
来源:牛客网

解方程
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?

输入描述:

第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y

输出描述:

一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1
示例1

输入

2
1
20180421

输出

-1
9.9993

具有单调性,二分就行了。评测机快的话也是可以枚举答案的,遇到骚操作的话就去模拟退火随机化算法找答案

这种小数的你根据精度二分相应次数就行了

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        double y,l=0,r=100;
        cin>>y;
        for(int i=0; i<1000; i++)
        {
            double mi=(l+r)/2;
            double t=2018*mi*mi*mi*mi+21*mi+5*mi*mi*mi+5*mi*mi+14;
            if(t>y) r=mi;
            else l=mi;
        }
        if(y<14||y>2018.*100*100*100*100+21.*100+5.*100*100*100+5.*100*100+14)cout<<"-1\n";
        else printf("%.4f\n",l);
    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/115/G
来源:牛客网

小Q的口袋校园
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

周末,小Q喜欢在PU口袋校园上参加各种活动刷绩点,体验丰富多彩的大学生活。
但是每个活动有各自的开始时间、结束时间、Happy值以及绩点数,活动之间可能存在时间冲突。
小Q是一个认真踏实的女孩,她在同一时间只会参加一个活动。
给出每一天的活动数,求小Q在同一天内所能获得的最大Happy值 与 绩点数。
小Q是一个活泼开朗的女孩,她总是寻求最大的Happy值,如果Happy值相同,才会尽可能使绩点数更多。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例第一行输入一个整数N(表示有几项活动)
接下来N行,每行输入s,e,h,p 4个整数,分别代表一个活动的开始时间、结束时间、Happy值以及绩点数
0<=s<e<=24,1<=h,p<=100,1<=T,N<=20

输出描述:

输出T行
一行输出一个样例对应的结果
小Q在一天内所能获得的最大 Happy值 与 绩点数
示例1

输入

1
4
1 3 1 1
2 5 2 1
3 7 2 1
5 8 1 2

输出

3 3

说明

有两种方案
1)选择 第1、3两个活动,可以获得 Happy值 3 和 绩点数 2;
2)选择 第2、4两个活动,可以获得 Happy值 3 和 绩点数 3.

其实就是一个01背包的

#include<bits/stdc++.h>
using namespace std;
int dp[25],num[25];
struct T
{
    int s,e,h,p;
} a[105];
int cmp(T a,T b)
{
    return a.s<b.s;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(dp,0,sizeof dp),memset(num,0,sizeof num);
        int n;
        cin>>n;
        for(int i=0; i<n; i++)
            cin>>a[i].s>>a[i].e>>a[i].h>>a[i].p;
        sort(a,a+n,cmp);
        for(int i=0; i<n; i++)
            for(int j=a[i].e; j<=24; j++)
                if(dp[j]<dp[a[i].s]+a[i].h)
                    dp[j]=dp[a[i].s]+a[i].h,num[j]=num[a[i].s]+a[i].p;
                else if(dp[j]==dp[a[i].s]+a[i].h) num[j]=max(num[j],num[a[i].s]+a[i].p);
        cout<<dp[24]<<" "<<num[24]<<"\n";
    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/115/H
来源:牛客网

小P的数学问题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活。
他总是能从所学的知识散发出奇妙的思维。
今天他想到了一个简单的阶乘问题,
0!= 1
1!= 1
2!= 1 * 2 = 2
3!= 1 * 2 * 3 = 6
4!= 1 * 2 * 3 *4 = 24
5!= 1 * 2 * 3 *4 * 5 = 120
如果 n=1000000000,那么n的阶乘会是多少呢,小P当然知道啦,那么你知道吗?

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个整数N(0<=N<=1000000000)

输出描述:

输出T行
每一行输出N的阶乘 N!(由于这个数比较大,所以只要输出其对1000000007取膜的结果即可)
示例1

输入

2
0
1000000000

输出

1
698611116

现场肯定很惨的,因为应该是想不到分段打表的,1e7那么就有100个元素,复杂度就是1e7*T

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll MD=1e9+7;
ll a[110]= {1,682498929,491101308,76479948,723816384,67347853,27368307,
            625544428,199888908,888050723,927880474,281863274,661224977,623534362,
            970055531,261384175,195888993,66404266,547665832,109838563,933245637,
            724691727,368925948,268838846,136026497,112390913,135498044,217544623,
            419363534,500780548,668123525,128487469,30977140,522049725,309058615,
            386027524,189239124,148528617,940567523,917084264,429277690,996164327,
            358655417,568392357,780072518,462639908,275105629,909210595,99199382,
            703397904,733333339,97830135,608823837,256141983,141827977,696628828,
            637939935,811575797,848924691,131772368,724464507,272814771,326159309,
            456152084,903466878,92255682,769795511,373745190,606241871,825871994,
            957939114,435887178,852304035,663307737,375297772,217598709,624148346,
            671734977,624500515,748510389,203191898,423951674,629786193,672850561,
            814362881,823845496,116667533,256473217,627655552,245795606,586445753,
            172114298,193781724,778983779,83868974,315103615,965785236,492741665,
            377329025,847549272,698611116
           };
int main()
{
    ll T,n;
    cin>>T;
    while(T--)
    {
        cin>>n;
        if(!n)cout<<"1\n";
        else
        {
            ll now=n/10000000;
            ll ans=a[now];
            for(ll i=now*10000000+1; i<=n; i++)
                ans=ans*i%MD;
            cout<<ans%MD<<"\n";
        }
    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/115/I
来源:牛客网

小P和小Q
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

小P和小Q是好朋友,今天他们一起玩一个有趣的游戏。
他们的初始积分都为1,赢的人可以将自己的分数乘以 (K的平方),而输的人也能乘以K。
他们玩的太开心了,以至于忘了自己玩了多久,甚至 K 是多少和游戏进行的回合数 N 都忘了。
现在给出他们俩最终的积分a,b,请问是否存在正整数K、N满足这样的积分,判断他们的游戏结果是否可信。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例一行,输入两个正整数a,b(0<a,b<=1e9)

输出描述:

输出T行
一行输出一个样例对应的结果
若结果可信,输出 Yes
否则,输出 No
示例1

输入

6
2 4
75 45
8 8
16 16
247 994
1000000000 1000000

输出

Yes
Yes
Yes
No
No
Yes

备注:

每回合的K可能不同

CF原题,但是不是能吧,不应该是必须的

所以他们的成绩就是k^3了

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        int x=(int)(pow(a*1LL*b,1.0/3)+1e-8);
        if(x*1LL*x*x==a*1LL*b&&a%x==0&&b%x==0)
            printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

posted @ 2018-04-24 14:41  暴力都不会的蒟蒻  阅读(...)  评论(...编辑  收藏