CQUPT萌新赛题解(附F代码)

Posted staray

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CQUPT萌新赛题解(附F代码)相关的知识,希望对你有一定的参考价值。

题解或许会迟到,但永远不会缺席(逃

还是感谢qs手下留情和mzjj给弱智一点面子,才让本蒟蒻拿到了键盘(

题目贴了网址也没意义,鶸校只让内网进(兰儿鶸校oj也见不得人

那么开始正题:

T1,T2:

ORZ直接略过吧.......

T3:

给了个公式,直接用double算会爆精度WA掉(据说记忆化搜索没事?)

然后可以直接把1-70的答案打印出来找规律,发现这TM不是斐波拉契数列吗...

所以直接整数递推之后再printf(".0000")就行了ORZ......

话说这公式就是斐波拉契数列的公式(当然本蒟蒻是不知道的啦)

T4:
c语言课才学了strcmp用法,也算是复习了一下吧(真TM好用,不然就得搞半天一点都不熟练的map了)

直接暴力枚举每个字符串跟字典里面的其中一个对的上不,对不上直接输出,对的上就输出翻译后的。

嵌套问题一开始写了个Floyd,不出所料的T了,略加思索就发现用一个fa数组就可以解决了,对于 i 的翻译结果为 j 的原单词的直接fa[ i ] = j,输出答案的时候直接while(fa[i])到顶就行了,还可以类似并查集思想压缩一下路径(不压缩也能A

T5

裸的线段树加了区间查询的时候允许修改左右最多2位....

标程并看不太懂ORZ,还是写自己的做法吧.....

如果每次查询都拆开成25次询问,时间复杂度为O(25*m*logn),铁定T,所以不能这样。

我们发现其实这25次里面中间的查询都重复了。

所以我们直接用线段树查[L+2 , R-2]这个区间(如果L+2 >= R-2答案肯定为零,不用查了)

记录其最大值M和次大值m,然后我们枚举区间向外延伸的25种情况,每种情况更新的M-m取最小值就是答案了。

时间复杂度为O(m*(logn+25)) ,还行。

T6:

本蒟蒻复习了半天普通dp结果考个状压(兰儿已经很裸了本鶸还是不会

最后45min双手离开键盘进入观海模式OMZ

状态和解法在代码里面都有:

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=1005;
 6 const int maxs=3005;
 7 struct data
 8 {
 9     int h,s,a,b,t;
10 }w[15];
11 int dp[maxn][maxs][15];
12 int n,p;
13 int main()
14 {
15 
16     scanf("%d%d",&p,&n);
17     
18     for(int i=1;i<=n;i++)
19     {
20         scanf("%d%d%d%d%d",&w[i].h,&w[i].s,&w[i].t,&w[i].a,&w[i].b);
21         w[i].s=w[i].h-w[i].s;
22         w[i].t=w[i].s-w[i].t;
23         w[i].a=w[i].a+w[i].b;
24     }
25     
26     //dp[i][S][j] 精力剩余i,唱歌情况为S,前一首是j的最大满意度 
27     
28     //边界:每首歌当第一首歌的情况,其他状态全部-inf 
29     
30     int ans=0,all=(1<<n+1)-1;
31     memset(dp,-100,sizeof(dp));
32     
33     for(int i=1;i<=n;i++)
34     for(int j=w[i].a;j<=p;j++)
35     {
36         dp[j][1<<i][i]=w[i].h; 
37         ans=max(ans,w[i].h);
38     }
39     
40     for(int i=1;i<=p;i++)
41     for(int S=0;S<=all;S++)
42     for(int j=1;j<=n;j++) if((1<<j)&S)
43     for(int k=1;k<=n;k++) if(i>=w[k].b&&(1<<k)&S)
44     {
45     
46         //当前状态由两种方式转移而来:S中原来有k, S中原来没有k  
47     
48         if(j==k) dp[i][S][k]=max(dp[i][S][k],dp[i-w[k].b][S][j]+w[k].t);
49         else
50         dp[i][S][k]=max(dp[i][S][k],dp[i-w[k].b][S][j]+w[k].s);
51         
52         if(i>=w[k].a) 
53         dp[i][S][k]=max(dp[i][S][k],dp[i-w[k].a][S-(1<<k)][j]+w[k].h);
54         
55         if(dp[i][S][k]>ans)
56         ans=dp[i][S][k]; 
57     }
58     
59     printf("%d",ans);
60     return 0;
61 }

 

 

还是太菜了,同志仍需努力啊ORZ.......

 

以上是关于CQUPT萌新赛题解(附F代码)的主要内容,如果未能解决你的问题,请参考以下文章

CTFshow萌新赛-萌新福利

----已搬运----2021.6.1 NEWSCTF 萌新赛 -- Web --- weblog ---反序列化

CTFshow萌新赛-千字文

CTFshow-萌新赛逆向_签退

CTFshow-萌新赛杂项_劝退警告

ACM团队招新赛题解