浙江理工大学2019年新生赛

问题 A: 你的名字

题目描述

Walfy同时喜欢上了n个妹子,第i个妹子的智力值为ai魅力值为bi。为了防止妹子们发现walfy是个渣男,现在walfy要给妹子排个序,这样他能按照这个排序分配和妹子聊天的时间。排序规则如下:智力高的妹子需要花费更多的时间来聊天,如果智力一样,那么魅力高的花费的时间将会多一点;如果她们的魅力也一样,姓名字典序更小的花费的时间也将多一点。
对于字典序大小的定义,对于字符串s和t来说,如果s 由于他将所有时间都用于和妹子聊天了,他现在要请求你的帮助。

输入

a第一行输入一个正整数T,表示测试用例的数量。接下来是测试用例。
每个测试用例的第一行包含一个正整数n,含义见上文;
接下来的n行,每行一个字符串s和两个整数ai,bi,用空格隔开,表示妹子的姓名、智力和魅力;
数据范围:( 1 <= T <= 10, 1 <= n <= 1000, 1 <= |s| <= 10, 1<= ai,bi <= 1000,同一个测试用例没有两个妹子有同样的名字,且名字只包含小写英文字母)

输出

每个测试用例输出n个值,第i个值代表第i个妹子花费时间是第几大的。

样例输入

3
2
abb 2 1
ac 1 100
3
abb 1 1
accb 1 1
acc 2 1
3
abb 1 1
ac 1 1
accb 1 1

样例输出

1 2
2 3 1
1 2 3

提示

样例解释或提示:
第一组样例,abb的智商更高所以Walfy在她身上花费的时间更多。
第二组样例,acc的智商最高,所以在她身上花费的时间是第一大的,之后因为acc的名字字典序更小,所以在她身上花费的时间是第二大的。

题解:

多特征值排序,写个冒泡或者sort都行

代码:

#include
using namespace std;
struct node
{
    int zs,ml;
    string name;
    int num2,num1;
}a[1005];
int comp(node a,node b)
{
	return a.num1>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].name>>a[i].zs>>a[i].ml;
            a[i].num1=i;
        }
        for(int i=1;i<=n;i++)
           for(int j=i+1;j<=n;j++)
           {
                if(a[i].zsa[j].name)swap(a[i],a[j]);
                }
           }
        for(int i=1;i<=n;i++)a[i].num2=i;
        sort(a+1,a+1+n,comp);
        for(int i=1;i<=n;i++)cout<

问题 B: duxing201606很快乐

题目描述

世界上没有两片完全相同的树叶,同样的,KFC也没有两个完全相同的原味鸡。而duxing哥是一个非常讲究的人,面对一个原味鸡,自己总是能说出这是第X级的原味鸡。可是duxing哥有点不满意,他希望知道这个原味鸡的美味值是多少。经过研究,他发现第X级的原味鸡美味值=第x-1级的原味鸡的美味值*1+第x-2级的原味鸡的美味值*2+.....+第1级原味鸡美味值*(x-1)。也就是:设第x级的原味鸡美味值是fx,那么fx=∑i=1x-1(x-i)*fi。
当然了,这一切需要一个基准,duxing哥把第1级的原味鸡美味值定为1,即f1=1
可是这个计算对于duxing哥来说太麻烦了,所以他把这个任务交给了你,给你一个x,问你第x级原味鸡美味值是多少?

输入

一个数x(1<=x<=40)

输出

一个数,表示第x的原味鸡美味值

样例输入

【输入样例1】
2
【输入样例2】
7

样例输出

【输出样例1】
1
【输出样例2】
144

题解:

递推题,双重for循环就能搞定(打表也行,数据量不大)

注意数组要开long long型,不然会运行错误

代码:

#include
using namespace std;
long long a[45],x;
int main()
{
    while(cin>>x)
    {
        memset(a,0,sizeof(a));
        a[1]=1,a[2]=1;
        if(x==1)
            cout<<1<2)
        {
            for(int i=3; i<=x; i++)
            {
                for(int j=1; j<=i-1; j++)
                {
                    a[i]=a[i]+a[i-j]*j;
                }
            }
            cout<

问题 C: Brain Power

题目描述

Ulire沉迷Brain Power以后,见到啥都想先O-oooooooooo AAAAE-A-A-I-A-U- JO-oooooooooooo AAE-O-A-A-U-U-A- E-eee-ee-eee AAAAE-A-E-I-E-A- JO-ooo-oo-oo-oo EEEEO-A-AAA-AAAA一下。

总之,现在Ulire给你一个字符串s,要求你按照以下规则处理字符串:

1)   删除字符串中除了元音字母和字母‘j’(不区分大小写)以外的所有字符。

2)   对于连续出现的字符(不区分大小写),第一个字母须为大写,其余字母须为小写;如果这个字符恰好连续出现了4次,则这4个字母都要为大写。

3)   对于连续出现的 ‘j’(不区分大小写),只保留第一个。

输入

第一行一个T表示有T组数据

每组有一个字符串。(仅包含大小写字母)

字符串总长度 <= 500

输出

每组输出处理后的字符串。

样例输入

1
aaaaaeeeeei

样例输出

AaaaaEeeeeI

题解:

题目本身不难,难在对题目意思的理解上

题意为:先删除一些字符,成为一个新的字符串,再进行操作

代码:

#include
using namespace std;
string str1,str2;
int t;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>str1;
		int n=str1.size();
		int k=0;
		str2.clear();
		for(int i=0;i='a'&&str2[i]<='z')
				{
					str2[i]=str2[i]-32;
					cout<='a'&&str2[i]<='z') 
				{
					str2[i]=str2[i]-32;
					cout<1) 
				{
					if(sum==4)
					{
						if(str2[i]>='a'&&str2[i]<='z')str2[i]=str2[i]+32;
						for(int f=1; f<4; f++)cout<='A'&&str2[f]<='Z') 
							{
								str2[f]=str2[f]+32;
								cout<

问题 D: NotNight打区域赛

题目描述

区域赛共有n只有效参赛队伍,NotNight的队伍排在第k个,在主持人公布获奖名单前,他想知道他获得的奖项。

区域赛奖牌发放规则:竞赛按照有效参赛队的10%,20%,30%比例产生金奖、银奖和铜奖(均向上取整)。

输入

第一行输入一个正整数T,表示测试用例的数量。

接下来T行,每行两个正整数n和k,用空格隔开。

(1<= T <= 100000, 1 <= k <= n <= 100000)

数据保证n>=3。

输出

每行一个答案。如果NotNight获得金奖,则输出”jin”;如果获得银奖,则输出”yin”;如果获得铜奖,则输出”tong”;如果未获奖,则输出”tie”

样例输入

4

10 1

10 2

10 3

10 4

样例输出

jin

yin

yin

tong

题解:

注意向上取整,用(int)x+1

代码:

#include
int main()
{
    int b,a,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        double x,y,z;
        x=0.1*a;
        y=0.2*a;
        z=0.3*a;
        if(x>(int)x)x=(int)x+1;
        if(y>(int)y)y=(int)y+1;
        if(z>(int)z)z=(int)z+1;
        if(b<=x)printf("jin\n");
        else if(b>x&&b<=x+y)printf("yin\n");
        else if(b>x+y&&b<=x+y+z)printf("tong\n");
        else printf("tie\n");
    }
}

问题 E: 快乐的duxing201606

题目描述

duxing201606来到了教室,看到旁边坐了一个妹子。duxing201606想要搭讪,于是duxing201606灵机一动,设计出了一个游戏。现在他在纸上画了一个半径为x的圆,妹子和duxing201606轮流在圆中画长y宽z的长方形(长方形是可以任意角度画上去的,画的长方形不能重合),谁画不下长方形谁就输了。作为游戏设计者,duxing201606想要知道在双方都使用最优策略的情况下,谁会获胜。妹子先画,duxing201606后画。

输入

三个整数x,y,z,分别代表圆半径,长方形长和宽(1<=x,y,z<=10000)

 

输出

如果duxing201606赢了,输出“forever loney”

如果duxing201606输了,输出“clever duxing201606”

注意,请只输出双引号内部的内容

提示

样例解释或提示:

无论对方画在哪里,画完之后duxing01606都没法画了,所以duxing1606输了

题解:

如果y>=x*2或者z>=x*2时,duxing201606赢

代码:

#include
using namespace std;
int y,z;
int x;
int main()
{
    cin>>x>>y>>z;
    float yuan=3.14*x*x;
    int zhen=y*z;
    if(y>=x*2||z>=x*2)cout<<"forever loney"<

 

问题I:送温暖

题目描述

独行哥开着货车去给山里的孩子送温暖,为了把物资尽快送到孩子们面前,独行哥选择在山路上漂移。如果货车左右两边的质量差距过大的话,漂移的时候就会翻车。物资必须被固定在货车的左右两边之一,才能保证在独行哥漂移时不被损坏。假设不放置物资时,货车左右两边质量恰好相等,现在独行哥想知道应该怎么样放置物资,才能使货车左右两边质量差最小。

输入

第一行一个整数n(1<=n<=1e3),表示物资数量

第二行n个整数w_i(1<=w_i<=1e3),表示n个物资的质量

输出

一行

货车左右两边最小质量差

样例输入

6

2 2 5 5 8 9

样例输出

1

题解:

一开始的思路是深搜,结果因为递归而TLE了

后来想到是01背包问题的变种,重量就是价值

状态转移方程是:dp[j]=max(dp[j],dp[j-w[i]]+w[i])

代码:

(深搜)

#include
using namespace std;
const int INF=0x7f;
int n,ans,sum;
int w[1005];
void dfs(int dep,int cnt) 
{
    if(dep==n)
    {
        ans=min(ans,abs(sum-2*cnt));
        return;
    }
    dfs(dep+1,cnt+w[dep]);
    dfs(dep+1,cnt);
}
int main()
{
    scanf("%d",&n);
    sum=0;
    for(int i=1;i<=n;i++) 
    {
        scanf("%d",&w[i]);
        sum+=w[i];
    }
    ans=INF;
    dfs(0,0);
    printf("%d\n",ans);
}
#include
using namespace std;
int w[1005],n;
int dp[1000005];
int sum=0;
int main()
{
    memset(dp,0,sizeof(dp));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&w[i]);
        sum+=w[i];
    }
    for(int i=1;i<=n;i++)
       for(int j=sum/2;j>=w[i];j--)
       {
            dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
       }
    printf("%d\n",sum-dp[sum/2]*2);
    return 0;
}

问题 J: 圈圈

题目描述

Ulire有一块菱形木板,他想在上面切下两个圆,要求在第一个圆尽可能大的前提下让第二个圆也尽可能大。Ulire显然是知道怎么切的,但他现在沉迷于Brain Power无法自拔,就把问题委托给了你。

输入

两个正整数a和b,表示菱形两个对角线的长度。(1<=a,b<=100)

输出

输出一个数,为第二个圆的半径,数据要求精确到小数点后四位。

样例输入

2 2

样例输出

0.1213

题解:

浙江理工大学2019年新生赛_第1张图片

注意:double型必须和double型做运算。

两种方法:1、把int型改成double

                  2、在后面加上*1.0

代码:

#include
using namespace std;
int a,b;
double R,rx,ry,t,x,y;
int main()
{
	scanf("%d%d",&a,&b);
	x=a/2.0;
	y=b/2.0;
	t=sqrt((double)(x*x+y*y));
	R=x*y/t;
	rx=(x-R)/(x+R)*R;
	ry=(y-R)/(y+R)*R;
	printf("%.4lf\n",max(rx,ry));
}

问题 M: 签到

题目描述

Ulire最近在研究哈夫曼树,一种功能是将一串字符压缩为更短的01串的数据结构,现在他发现因为写错了一个条件,导致输出的所有0都变成了1,所有1都变成了0,所以他希望你能够把这个01串变回正确的形式,当然,为了精确,他每次只会给出一个字母对应的01串,所以每个01串不会超过5位。

正式的说,你会得到一个数字n和n位由0和1组成的字符串,而你则要将其中的0和1分别变成1和0,并重新输出。

输入

第一行输入一个正整数n(1<=n<=5),代表字符串的长度 

第二行输入一个长度为n的0和1构成的串s

输出

输出一行,将s中的0换成1,1换成0产生的新串

样例输入

5
11010

样例输出

00101

题解:

c++语言基础题

签到题,题如其名(不知道有没有被前面一大堆哈夫曼树吓蒙的人)

代码:

#include
using namespace std;
string s,n;
int main()
{
    cin>>n;
    cin>>s;
    for(int i=0;i

 

你可能感兴趣的:(浙江理工大学2019年新生赛)