9月25日四校联考

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9月25日四校联考相关的知识,希望对你有一定的参考价值。

技术分享

 

·前言啊f**k今天早上体检,但是并不影响做题2333因为题目真的好 NOIP

 啊对了附中评测姬好坑啊正解强行T 23333技术分享

第一题《萝卜种子》

简要题意:小姑娘看了看狐狸的萝卜田,发现田里最多只能生长7个萝卜(多余的种子不会发芽),且4种萝卜发芽的概率是完全相同的。它们的效果分别是:

普通萝卜:生产2kg兔粮

超能萝卜:生产2kg兔粮,每种植一个其他萝卜额外产生1kg兔粮

固氮萝卜:不能用于生产兔粮,但能使每个普通萝卜和超能萝卜生产的兔粮+1kg

金坷垃萝卜:不能用于生产兔粮,但能使每个普通萝卜和超能萝卜生产的兔粮+2kg

【输入数据】

       一行,四个正整数,表示Npt,Ncn,Ngd,Njkl

【输出数据】

       一行,一个数表示生产兔粮的期望值(保留2位小数)

【样例输入1】

1 1 1 1

【样例输出1】

13.00

【样例输入2】                                                                                   

2 2 2 2

【样例输出2】

35.50  //(36+40+30+36)/4=35.50

【数据范围】

对于50%的数据,Npt+Ncn+Ngd+Njkl<=7

对于100%的数据,Npt,Ncn,Ngd,Njkl<=10

题解:这一题来源于炉石传说圣骑士的斩杀

这题我们写个暴力就能过了,记住做的时候写组合数算方案。。。QAQ

技术分享
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <string>
 6 using namespace std;
 7 long double C(int a,int b)
 8 {
 9     if (a<b) return 0;
10     int i;
11     long double kk=1;
12     for (i=a;i>=a-b+1;i--) kk=kk*i;
13     for (i=b;i>=1;i--) kk=kk/i;
14     return kk;
15 }
16 int main()
17 {
18     int a,b,c,d;
19     freopen("seed.in","r",stdin);
20     freopen("seed.out","w",stdout);
21     cin>>a>>b>>c>>d;
22     int minkeng=min(7,a+b+c+d);
23     double zy=1.0/C(a+b+c+d,minkeng);
24     double ans=0;
25     for (int i=0;i<=a;i++)
26       for (int j=0;j<=b;j++)
27         for (int k=0;k<=c;k++)
28           for (int p=0;p<=d;p++)
29             {
30                 if (i+j+k+p!=minkeng)
31                   continue;
32                 long double wwd=C(a,i)*C(b,j)*C(c,k)*C(d,p)*zy;
33                 int aa;
34                 aa=k*(i+j)+2*p*(i+j);
35                 aa+=i*2+(minkeng+1)*j;
36                 ans+=wwd*aa;
37             }
38     printf("%.2lf",ans);
39     return 0;
40 }
蕾姆..

第二题《击败黑熊》

简要题意:凶恶的黑熊的陷阱一共有N+1个机关,机关分为3种,它们分别是:

守卫机关(d):该机关有一个守卫,守卫不会主动攻击,小兔可以选择无视守卫直接通过机关或者杀死该守卫,杀死守卫会使自身的罪恶值+1,并获得一定数量的战斗力

审判机关(p):该机关有一个守卫,不能被杀死,如果小兔的罪恶值大于或等于守卫的触发上限,守卫就会主动攻击小兔,小兔直接阵亡

黑熊机关:前N个机关均不是黑熊机关,第N+1个机关一定是黑熊机关,只有小兔的罪恶值大于或等于M才能通过,否则小兔直接阵亡

小兔希望在通关的基础上获得最大的战斗力以便和黑熊硬碰硬。

【输入数据】

       第一行两个整数N,M

       接下来N行描述第1~N个机关,每行一个字符和一个数值

       字符为d:该机关是守卫机关,后面的数值表示击杀守卫获得的战斗力

       字符为p:该机关是审判机关,后面的数值表示守卫的触发上限

【输出数据】

       小兔一定会阵亡输出“Rabbit can not beat bear.”(不含引号),否则输出一个整数表示小兔所能获得的最大战斗力

【样例输入】

4 2

d 1

d 2

p 2

d 1

【样例输出】

3

【数据范围】

对于10%的数据,N=0

对于20%的数据,N<=500

对于40%的数据,N<=8000

另有20%的数据,没有审判机关

对于100%的数据,N<=500000

答案保证不超过2147483647

题解:啊,这题的话我们可以脑补一下,我们会发现在遇到审判机关时,它只审判罪恶值而不是战斗力,所以我们可以维护一个小根堆,把战斗力小的都删除掉,一遍遍模拟就好了

技术分享
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdio.h>
 4 #include <cmath>
 5 #include <string>
 6 #include <string.h>
 7 #include <numeric>
 8 #include <queue>
 9 #define gc getchar()
10 #define REM main
11 using namespace std;
12 priority_queue<int,vector<int>, greater<int> >q;
13 int read()
14 {
15     int xxxx=0,fuh=1;char ch=gc;
16     while(!isdigit(ch)){
17         if(ch==-)fuh=-1;
18         ch=gc;
19     }
20     while(isdigit(ch)){
21         xxxx=(xxxx<<3)+(xxxx<<1)+ch-0;ch=gc;
22     }
23     return xxxx*fuh;
24 }
25 /*int pow4(int a,int b)
26 {
27     int r=1,base=a;
28     while(b!=0)
29     {
30         if(b&1)
31             r*=base;
32         base*=base;
33         b>>=1;
34     }
35     return r;
36 }*/
37 int REM()
38 {
39     cin.sync_with_stdio(false);
40     int n,m;
41     freopen("beatbear.in","r",stdin);
42     freopen("beatbear.out","w",stdout);
43     n=read();m=read();int cnt=0;
44     for (int i=1;i<=n;i++)
45       {
46           char ch;
47           ch=gc;
48           if (ch==d)
49             {
50                 int k=read();
51                 q.push(k);
52                 cnt++;
53             }
54           else
55             {
56                 int k=read();
57                 while(cnt>=k)
58                   {
59                       cnt--;
60                       q.pop();
61                   }
62             }
63       }
64     if (cnt<m)
65       {
66           cout<<"Rabbit can not beat bear.";
67           return 0;
68       }
69     int ans=0;
70     while(cnt>0)
71       {
72           ans+=q.top();
73           q.pop();
74           cnt--;
75       }
76     cout<<ans;
77     return 0;
78 }
南小鸟..

第三题:《种萝卜2》

简要题意:在嫦娥的帮助下,狐狸将土地拓成了M个坑排成一排,从左到右按1~M编号,每个坑里可以种一个胡萝卜,在N天小兔都会凭心情选择一个坑,狐狸会到那个坑种胡萝卜,如果已经被占用,则会种在前一个坑里,如果依然被占用,狐狸会再往前找空的坑,直到找到空的坑或者发现前面没有可用的坑为止。你本来需要输出N行,每一行表示当天的胡萝卜将种在哪一个坑里(无法种下输出0),但为了避免输出占用过多的时间,你只需要输出(1*第一天+2*第二天+……+N*第N天)%1000000007的结果即可

【输入数据】

       第一行两个整数N,M

       接下来一个N个整数,表示当天小兔选择的坑

【输出数据】

       一行,一个整数,意义如题目描述

【样例输入】

5 8

7 7 1 6 1

【样例输出】

42  //1*7+2*6+3*1+4*5+5*0=42

【数据范围】

对于30%的数据,N,M<=1000

对于70%的数据,N,M<=200000

对于100%的数据,N,M<=3000000

题解:啊f**k我们写个并查集维护点i左边的最右是哪个点就好了。。

技术分享
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdio.h>
 4 #include <cmath>
 5 #include <string>
 6 #include <string.h>
 7 #include <numeric>
 8 #define gc getchar()
 9 #define REM main
10 using namespace std;
11 int f[5000000+1];
12 const long long mod=1000000007;
13 int read()
14 {
15     int xxxx=0,fuh=1;char ch=gc;
16     while(!isdigit(ch)){
17         if(ch==-)fuh=-1;
18         ch=gc;
19     }
20     while(isdigit(ch)){
21         xxxx=(xxxx<<3)+(xxxx<<1)+ch-0;ch=gc;
22     }
23     return xxxx*fuh;
24 }
25 int find(int x)
26 {
27     if (x!=f[x])
28       return f[x]=find(f[x]);
29     return x;
30     
31 }
32 int REM()
33 {
34     cin.sync_with_stdio(false);
35     freopen("carrot.in","r",stdin);
36     freopen("carrot.out","w",stdout);
37     int n,m,i,j;
38     n=read();m=read();
39     for (i=1;i<=m;i++) f[i]=i;
40     long long ans=0;
41     for (i=1;i<=n;i++)
42       {
43           int x=read();
44           int fa=find(x);
45           if (fa==0) continue;
46           f[fa]=fa-1;
47           ans=(ans+(long long)fa%mod*(long long)i%mod)%mod;
48       }
49     cout<<ans;
50     return 0;
51 }
花丸亲..

论体检插队...

以上是关于9月25日四校联考的主要内容,如果未能解决你的问题,请参考以下文章

20170820四校联考

四校联考2017.8.20T1填算式

四校联考比赛题解FJ NOIP 四校联考 2017 Round 7

10.29 FJ四校联考

[20180901]四校联考

2017-2-19四校联考