2017/8/7 考试吐槽

2017 8 7 得分:50

果然科学定律是不能够违背的……前几天,人品大爆发,考的还像那么回事,但是,带来的副作用是:RP 暴跌……真正需要人品的时候,已经掉光了……我又有什么办法呢……联考挂飞,这就是你!

A、Passward

不要吐槽这个拼写……原题如此……

题面……还是别贴了,找不到啊……直接重述题意+贴相似题目:找出最长的前后缀公共部分,并且这个东西在中间出现过。http://cogs.pro/cogs/problem/problem.php?pid=2688不同的是只有一组数据。

考试时候脑残啊……写挂了Hash……废了自认为的15分……然后……Hash竟然可以A?!……

我曾经是个探险家,直到我膝盖中了一箭!from:一条躺在沙滩上的咸鱼……

不说了都是泪啊啊……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const long long BASE=23333;
 7 const int maxn=100005;
 8 unsigned long long HA[maxn],poww[maxn];
 9 char s[maxn];
10 unsigned long long getha(int l,int r)
11 {
12     return HA[r]-HA[l-1]*poww[r-l+1];
13 }
14 int len;
15 bool check(int val)
16 {
17     unsigned long long s1=getha(len-val+1,len),s2=getha(1,val);
18     if(s1!=s2)return 0;
19     for(int i=2;i<=len-val;i++)
20     {
21         unsigned long long s3=getha(i,i+val-1);
22         if(s3==s1)
23             return 1;
24     }
25     return 0;
26 }
27 int haha()
28 {
29     freopen("fool.in","r",stdin);
30     freopen("fool.out","w",stdout);
31     int n;scanf("%d",&n);
32     while(n--)
33     {
34         scanf("%s",s+1);len=strlen(s+1);
35         poww[0]=1;
36         for(int i=1;i<=100000;i++)poww[i]=poww[i-1]*BASE;
37         HA[0]=0;
38         for(int i=1;i<=len;i++)
39         {
40             HA[i]=HA[i-1]*BASE+s[i]-'a';
41         }
42         int ans=0;
43         for(int i=len-2;i;i--)
44             if(check(i)){ans=i;break;}
45         if(!ans)puts("---");
46         else 
47         {
48             for(int i=1;i<=ans;i++)putchar(s[i]);
49             puts("");
50         }
51     }
52 }
53 int sb=haha();
54 int main(){;}
A

(就是在这个题基础上过了2688,vscode自动保存退不回去了明明是你懒癌发作不想改回去了啊

B、就

没错又是个很无厘头的题面……

题意:一排$N$个数,找出$K$个不连续的数使相加和最大。

看到题$SB$的以为这是个数据结构优化DP……大力撸了棵线段树……然后……5分?!!!!!!尼玛啊暴力都没这么少分……我学傻了……

然后正解竟然是……$STL$优化贪心再加链表合并?!把这个点和左右的点退出来,将他们合并看做一个点,合并出来的再塞回去?!这就带上反悔防止选错了?!这就完了?!正确性显而易见,但是这种窒息操作……唉算了算了,反正智障都是一样的,智商是硬伤,自己脑残怨不了别人……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<set>
 6 using namespace std;
 7 struct pii
 8 {
 9     int first;
10     long long second;
11     bool operator<(const pii &b)const
12     {
13         return second>b.second||(second==b.second&&first<b.first);
14     }
15 };
16 set<pii>s;
17 const int maxn=100005;
18 int n,L[maxn],R[maxn],k;
19 long long res,a[maxn];
20 int haha()
21 {
22     scanf("%d%d",&n,&k);
23     for(int i=1;i<=n;i++)
24     {
25         long long x;scanf("%lld",&x);
26         s.insert((pii){i,x});a[i]=x;
27         L[i]=i-1,R[i]=i+1;
28     }
29     for(int i=1;i<=k;i++)
30     {
31         set<pii>::iterator it=s.begin();
32         pii S=*it;s.erase(it);
33         res+=S.second;int pos=S.first;
34         long long tmp=0;
35         s.erase((pii){L[pos],a[L[pos]]});s.erase((pii){R[pos],a[R[pos]]});
36         a[pos]=tmp=-S.second+a[L[pos]]+a[R[pos]];
37         R[L[L[pos]]]=L[R[R[pos]]]=pos;L[pos]=L[L[pos]];R[pos]=R[R[pos]];
38         //cout<<pos<<" "<<L[pos]<<" "<<R[pos]<<endl;
39         s.insert((pii){pos,tmp});
40     }
41     printf("%lld\n",res);
42     while(1);
43 }
44 int sb=haha();
45 int main(){;}
B

C、书

今天就是这么不正常的一天……

题意:每个书有一定几率被抽到,被抽到时在第几位就耗费多少体力,随后将其放在书的顶部。求无限次操作后抽一本书的期望体力消耗。

真是道防$AK$好题……考场上推了两个小时啥都没推出来,连样例都手玩都玩不出来,以为自己要$GG$,单题被虐100分了……

然后……卧槽这个题全场平均分$0$分?!一个点都没人过?!小数据卡爆搜?!卧槽这个题晚上我得好好口胡一波……

 我们按照原题的叙述,设$A[i]$为抽到$i$的概率。我们可以看到,只要抽到了$i$,至少就会造成1的体力消耗。

然后我们就要找到在这个基础上,其他的书对它造成的额外影响。

如果我们直接考虑每种情况的话,显然会超时。我们要找一个合理的方法卡时间。

方法很简单,但却需要费一番脑子:枚举另一本书的情况,然后得出另一本书在这本书前面的概率。

为什么这样是正确的呢?我们换个角度想一想:如果一本书没有书在前面,那么耗费体力绝对就是$1$;如果说有一本书多压在上面,取出它的体力就要多消耗$1$,因此求额外消费的体力也就是求出期望压在这本书上面书的数量。根据期望的线性性,显然,上面的这个式子是正确的。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int mod=1e9+7;
 7 const int maxn=1005;
 8 int n,probablities[maxn];
 9 long long qpow(long long v,int tim)
10 {
11     long long tmp=1,t=v;
12     for(;tim;tim>>=1,t=t*t%mod)
13         if(tim&1)tmp=tmp*t%mod;
14     return tmp;
15 }
16 int haha()
17 {
18     scanf("%d",&n);
19     for(int i=1;i<=n;i++)
20     {
21         long long x,y;scanf("%lld%lld",&x,&y);
22         x=x*qpow(y,mod-2)%mod;
23         probablities[i]=x;
24     }
25     long long ans=0;
26     for(int i=1;i<=n;i++)
27     {
28         long long sum=1;
29         for(int j=1;j<=n;j++)
30             if(j!=i)sum=(sum+probablities[j]*qpow((probablities[i]+probablities[j])%mod,mod-2))%mod;
31         ans=(ans+sum*probablities[i]%mod)%mod;
32     }
33     printf("%lld\n",ans);
34 }
35 int sb=haha();
36 int main(){;}
C

 

posted @ 2017-08-07 20:44  ccc000111  阅读(191)  评论(0编辑  收藏  举报