2017.5.15 COCI2011/2012 Contest#5
来源:互联网 发布:清风不语网络剧资源 编辑:程序博客网 时间:2024/06/07 09:54
A KRIŽALJKA
【分析】
这一题只要仔细看题目的话应该是简单的,也相信大家不是来看我怎么花式讲水题的,就直接贴代码了。
【代码】
#include <bits/stdc++.h>using namespace std;#define M 40char a[M],b[M];int n,m,f=1;int pos1,pos2;char mp[M][M];int main(){ scanf("%s",a+1); scanf("%s",b+1); n=strlen(a+1); m=strlen(b+1); for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++)mp[i][j]='.'; } for(int i=1;f&&i<=n;i++){ for(int j=1;f&&j<=m;j++){ if(a[i]==b[j]){ f=0; pos1=j; pos2=i; } } } for(int i=1;i<=n;i++)mp[pos1][i]=a[i]; for(int i=1;i<=m;i++)mp[i][pos2]=b[i]; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++)printf("%c",mp[i][j]); puts(""); } return 0;}
B EKO
【分析】
考虑到答案存在单调性,所以就直接二分咯。
想要1A的话还是要注意算md的时候有可能爆int。
【代码】
#include <bits/stdc++.h>using namespace std;#define ll long long#define M 1000005int a[M];int n,m;int l,r;int res;bool chk(int h){ ll hav=0; for(int i=1;i<=n;i++){ if(a[i]<=h)continue; hav+=a[i]-h; } return hav>=m;}int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); r=max(r,a[i]); } while(!(l>r)){ int md=1ll*(l+r)/2; if(chk(md)){ res=md; l=md+1; }else r=md-1; } printf("%d\n",res); return 0;}
C DNA
【分析】
知道题可以考虑贪心和dp,但是,我并没有找出容易的贪心做法,那就换一个路子,dp。
我们定义dp[i][j]表示将1~i全部变成j需要的最小个数。
那么转移方程也就比较容易推出了。
但是比赛的时候没有将这题1A,原因是RE了…
【代码】
#include<bits/stdc++.h>using namespace std;#define M 1000005int dp[2][M];//B 0;A 1 bool mk[M];char a[M];int n;int main(){ scanf("%d",&n); scanf("%s",a+1); for(int i=1;i<=n;i++){ bool f=(a[i]=='A'); dp[f][i]=min(dp[f][i-1],dp[!f][i-1]+1); dp[!f][i]=min(dp[f][i]+1,dp[!f][i-1]+1); } printf("%d",dp[1][n]); return 0;}
D RAZBIBRIGA
【分析】
花了半天时间看英文题似懂非懂。感谢小C的中文题意。
我们发现,想要组成这样一个首尾相连的矩形,唯一有用的只是一个单词的开头和结尾的字母。
既然有四个起点和终点,那么我们就枚举终态。
不过还要考虑到一些重复算的相同的部分。如何将他们去掉,就看大家各显神通了。
【代码】
#include <bits/stdc++.h>using namespace std;#define M 100005#define ll long longchar a[M][15];int n,m;ll ans;int cnt[28][28];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%s",a[i]+1); m=strlen(a[1]+1); for(int i=1;i<=n;i++){ int x=a[i][1]-'A'; int y=a[i][m]-'A'; cnt[x][y]++; } for(int i=0;i<26;i++){ for(int j=0;j<26;j++){ for(int k=0;k<26;k++){ for(int p=0;p<26;p++){ int you[28][28]; memset(you,0,sizeof(you)); ll now=cnt[i][j]; you[i][j]++; now*=1ll*(cnt[j][k]-you[j][k]); you[j][k]++; now*=1ll*(cnt[p][k]-you[p][k]); you[p][k]++; now*=1ll*(cnt[i][p]-you[i][p]); if(now<=0)continue; ans+=now; } } } } cout<<ans<<endl; return 0;}
E BLOKOVI
【分析】
比赛的时候完全没什么想法。直接敲了30分。
比赛结束后听jiedai大神的思路,感觉智商又下线了。
啦啦啦,我又回来了!
以下是sonytoy大神的证明
**我们假设已知当前积木
以积木
新的重心横坐标
新的最右端
所以
可以发现,
【代码】
#include <bits/stdc++.h>using namespace std;#define db double#define M 300005db ans,sum;int a[M];int n;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=n;i>1;i--){ sum+=a[i]; db Z=1.0*a[i]/sum; ans=max(ans,max(ans+Z,2-Z)); } printf("%.8f\n",ans); return 0;}
F POPLOČAVANJE
【分析】
这题十分的奇怪,因为纯暴力可以有58分。这可是最后一道题啊。
关于字符串的题目,博主现在只有这几种方法:Hash、Trie树。因为我还没有对字符串继续深入学。
所以除了暴力,我还想到了Hash,可是这样复杂度就是加一些奇奇怪怪的优化 跑的居然比正解的AC自动机、后缀自动机还快)。
但我觉得不能超过正解,所以我还是将原始的代码贴出来。
【代码】
#include<bits/stdc++.h>#define usi unsigned int#define ll long longusing namespace std;#define M 305005#define P 233char a[M],b[5005];usi num[M],F[M];int n,m,ans;int mk[M];ll cnt;int main(){ scanf("%d %s %d",&n,a+1,&m); F[0]=1; for(int i=1;i<=n;i++)F[i]=F[i-1]*P; for(int i=1;i<=n;i++)num[i]=num[i-1]*P+a[i]; while(m--){ scanf("%s",b+1); int len=strlen(b+1); usi res=0; for(int i=1;i<=len;i++)res=res*P+b[i]; int w=n-len+1; for(int i=1;i<=w;i++){ if(res==num[i+len-1]-num[i-1]*F[len])mk[i]++,mk[i+len]--; } } for(int i=1;i<=n;i++)cnt+=mk[i],ans+=(!cnt); printf("%d\n",ans); return 0;}
这场比赛做的还是比较顺利的。两题1A,两题较快A掉,还有最后两题,花了不少时间。而且F题被一个学弟给血虐了……我感觉这其实暴露了一些问题:不是说他们天赋异禀,而是说他们比我们更踏实,不在意那些所谓的题数,而是把事情做精。虽然比他们的年龄大,但是还是要向他们学习。
- 2017.5.15 COCI2011/2012 Contest#5
- COCI2011/2012 Contest#1 F Solution
- 【coci2011/2012 3】距离之和
- jzoj P1667【coci2011/2012 1】PLES
- jzoj P1664 【coci2011/2012 1】JABUKE
- jzoj P1665 【coci2011/2012 1】MATRIX
- [BZOJ1894][COCI2011-2012第7场]总统演讲
- [BZOJ3185][Coci2011][DP]kamion
- coci2011 debt 还债
- contest 15
- 2017.5.17 COCI2014/2015 Contest#5
- [BZOJ3189][Coci2011][扫描线][线段树]Slika
- Contest
- 2012 Multi-University Training Contest 5-1001 hdu4340
- 2012 Multi-University Training Contest 5-1004 hdu4342
- 2012 Multi-University Training Contest 5-1007 hdu4345
- 2012 Multi-University Training Contest 5-1011 hdu4349
- 2012 Multi-University Training Contest 5[hdu4340~4349]
- 当Ubuntu 使用命令行“sudo apt-get update”时出现问题的解决方式
- Qt creator 中设置命令行参数方法
- 机器学习-周志华-个人练习11.1
- JS高级程序设计——基本包装类型
- 走格子
- 2017.5.15 COCI2011/2012 Contest#5
- 1099: 孤独的骑士
- 深入理解JavaScript系列(38):设计模式之职责链模式
- Java通过反射将 Excel 解析成对象集合
- 外网配置Maven
- 深入理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
- 一元线性回归的详解及其Spss和Java的实现 之 spss实现
- 深入理解JavaScript系列(39):设计模式之适配器模式
- 杭电ACM题单整理