接看所有A后面连续P的个数最大值

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<set>
  4. #include<iostream>
  5.  
  6. #define forn(i, n) for (int i = 0; i < int(n); i++)
  7. #define fore(i, s, t) for (int i = s; i < (int)t; i++)
  8. #define fi first
  9. #define se second
  10.  
  11. using namespace std;
  12.  
  13. const int maxn=5e3+5;
  14. const int maxm=2e5+5;
  15. const int inf=1e9;
  16.  
  17. int main(){
  18. int t;
  19. cin>>t;
  20. while(t--){
  21. int n;
  22. string s;
  23. cin>>n;
  24. cin>>s;
  25. int ans=0;
  26. for(int i=0;i<n;i++){
  27. if(s[i]=='A') {
  28. int cnt=0;
  29. while(i+cnt+1<n&&s[i+cnt+1]=='P')
  30. cnt++;
  31. ans=max(ans,cnt);
  32. }
  33. }
  34.  
  35. cout<<ans<<endl;
  36. }
  37. }
  38.  

  

N个字符串中选择3个使得选中的3个字符串满足要么同一位置上字符相等,要么都不相同,有多少钟选法

题解:好像是个组合计数,其实就是找满足条件的三元组个数,显然可以枚举前两个然后算法第三个再去判断第三个是否存在,这样复杂度是n^2*log(n),可以过

另外写代码的时候出了个问题,

这是循环内部的代码,利用了set来找另外一个字符,但是这样写竟然是超时的,如果我们改为 if 判断的话就很快1S内跑完,而这样写3S都跑不完

按道理来讲两者速度不会差太多,但是从这里可以看出至少差了三倍以上

因此这警示我们对于循环内部的东西一定要尽量去优化他,有的东西编译器会帮我们去优化,但是谁知道哪天会出问题呢?不要留下这样一个隐患!

  1. #include<bits/stdc++.h>
  2.  
  3. #define forn(i, n) for (int i = 0; i < int(n); i++)
  4. #define fore(i, s, t) for (int i = s; i < (int)t; i++)
  5. #define fi first
  6. #define se second
  7.  
  8. using namespace std;
  9.  
  10. const int maxn=5e3+5;
  11. const int maxm=2e5+5;
  12. const int inf=1e9;
  13.  
  14. int main(){
  15. int n,m;
  16. cin>>n>>m;
  17. vector<string> str(n);
  18. for(int i=0;i<n;i++)
  19. cin>>str[i];
  20. set<string> ls;
  21. for(int i=0;i<n;i++)
  22. ls.insert(str[i]);
  23. long long ans=0;
  24. for(int i=0;i<n;i++){
  25. for(int j=i+1;j<n;j++){
  26. string target;
  27. for(int k=0;k<m;k++){
  28. if(str[i][k]==str[j][k]) target.push_back(str[i][k]);
  29. else {
  30. if(str[i][k]!='S'&&str[j][k]!='S') target.push_back('S');
  31. if(str[i][k]!='E'&&str[j][k]!='E') target.push_back('E');
  32. if(str[i][k]!='T'&&str[j][k]!='T') target.push_back('T');
  33. }
  34. }
  35. if(target!=str[i]&&target!=str[j]&&ls.count(target)) ans++;
  36. }
  37. }
  38. cout<<ans/3<<endl;
  39. }
  40.  

  

官方题解是贪心,但是显然DP可做,因此阶段性太明显了,一旦填到第i个字符,我们只需要记录已经用了多少奇数多少偶数以及现在的这个位置填哪个

因此一个四维的DP即可

  1. #include<bits/stdc++.h>
  2.  
  3. #define forn(i, n) for (int i = 0; i < int(n); i++)
  4. #define fore(i, s, t) for (int i = s; i < (int)t; i++)
  5. #define fi first
  6. #define se second
  7.  
  8. using namespace std;
  9.  
  10. const int maxn=100+5;
  11. const int maxm=2e5+5;
  12. const int inf=1e9;
  13.  
  14. int n;
  15.  
  16. int pm[maxn];
  17.  
  18. int dp[maxn][maxn][maxn][2];
  19.  
  20. int main(){
  21. cin>>n;
  22. for(int i=1;i<=n;i++)
  23. cin>>pm[i];
  24. int c0=n/2,c1=(n+1)/2;
  25. for(int i=1;i<=n;i++)
  26. if(pm[i]) {
  27. if(pm[i]&1) c1--;
  28. else c0--;
  29. }
  30. memset(dp,0x3f,sizeof(dp));
  31. dp[0][c0][c1][0]=dp[0][c0][c1][1]=0;
  32. for(int i=1;i<=n;i++){
  33. for(int j=0;j<=c0;j++){
  34. for(int k=0;k<=c1;k++){
  35. if(pm[i]){
  36. if(pm[i]&1) dp[i][j][k][1]=min(dp[i-1][j][k][0]+1,dp[i-1][j][k][1]);
  37. else dp[i][j][k][0]=min(dp[i-1][j][k][1]+1,dp[i-1][j][k][0]);
  38. }
  39. else {
  40. dp[i][j][k][1]=min(dp[i-1][j][k+1][0]+1,dp[i-1][j][k+1][1]);
  41. dp[i][j][k][0]=min(dp[i-1][j+1][k][1]+1,dp[i-1][j+1][k][0]);
  42. }
  43. }
  44. }
  45. }
  46. cout<<min(dp[n][0][0][0],dp[n][0][0][1]);
  47. }
  48.  

  

应该是这场最喜欢的一道题了,学到了很多,虽然最后懂了之后有点索然无味的感觉

首先对于我们可以在序列上考虑问题,毕竟两者相通

对于一个序列来说,我们倒序去扫描,对于最后一个数来说,假如他是3,那么我们知道他前面有3个数比他小,那么我们让给这个数赋值为4,并且把4标记一下,表示4已经被用过了

注意能这样做的前提是序列中每一个数均出现一次,并且每一个数都出现过

然后继续,如果下一个是4,那么这个数应该填的是6,因为4被用了,要比4个数大,这里只能填6了

看到这里我们就明白了,这个序列按照这样的方式一定能构造出来,除非出现数不够用的情况

然后树上的话跟序列就是一模一样的,无非是倒叙扫描变为DFS

代码的写法也可以很暴力,因为这里N<=2000,N^2的做法绝对没有问题

  1. #include<bits/stdc++.h>
  2.  
  3. #define forn(i, n) for (int i = 0; i < int(n); i++)
  4. #define fore(i, s, t) for (int i = s; i < (int)t; i++)
  5. #define fi first
  6. #define se second
  7.  
  8. using namespace std;
  9.  
  10. const int maxn=2e3+5;
  11. const int maxm=2e5+5;
  12. const int inf=1e9;
  13.  
  14. int n;
  15.  
  16. int c[maxn];
  17.  
  18. int head[maxn],ver[maxn*2],nex[maxn*2],tot;
  19.  
  20. void AddEdge(int x,int y){
  21. ver[++tot]=y,nex[tot]=head[x],head[x]=tot;
  22. }
  23.  
  24. typedef vector<int> vi;
  25.  
  26. vi dfs(int x){
  27. vi now;
  28. for(int i=head[x];i;i=nex[i]){
  29. int y=ver[i];
  30. vi ret=dfs(y);
  31. now.insert(now.end(),ret.begin(),ret.end());
  32. }
  33. if(now.size()<c[x]) {
  34. puts("NO");exit(0);
  35. }
  36. now.insert(now.begin()+c[x],x);
  37. return now;
  38. }
  39.  
  40. int main(){
  41. cin>>n;
  42. int root;
  43. for(int i=1;i<=n;i++){
  44. int t;
  45. cin>>t>>c[i];
  46. if(t) AddEdge(t,i);
  47. else root=i;
  48. }
  49. vi ans=dfs(root);
  50. vector<int> a(n);
  51. for(int i=0;i<n;i++)
  52. a[ans[i]-1]=i+1;
  53. puts("YES");
  54. for(int i=0;i<n;i++)
  55. printf("%d ",a[i]);
  56. }
  57.  

  

Codeforces Round #612 (Div. 2) (A-D)的更多相关文章

  1. Codeforces Round #316 (Div. 2) (ABC题)

    A - Elections 题意: 每一场城市选举的结果,第一关键字是票数(降序),第二关键字是序号(升序),第一位获得胜利. 最后的选举结果,第一关键字是获胜城市数(降序),第二关键字是序号(升序) ...

  2. Codeforces Round #240 (Div. 2)(A -- D)

    点我看题目 A. Mashmokh and Lights time limit per test:1 secondmemory limit per test:256 megabytesinput:st ...

  3. Codeforces Round #324 (Div. 2) (哥德巴赫猜想)

    题目:http://codeforces.com/problemset/problem/584/D 思路: 关于偶数的哥德巴赫猜想:任一大于2的偶数都可写成两个素数之和. 关于奇数的哥德巴赫猜想:任一 ...

  4. Codeforces Round #395 (Div. 2)(未完)

    2.2.2017 9:35~11:35 A - Taymyr is calling you 直接模拟 #include <iostream> #include <cstdio> ...

  5. B. Nirvana Codeforces Round #549 (Div. 2) (递归dfs)

    ---恢复内容开始--- Kurt reaches nirvana when he finds the product of all the digits of some positive integ ...

  6. 【Codeforces】Codeforces Round #491 (Div. 2) (Contest 991)

    题目 传送门:QWQ A:A - If at first you don't succeed... 分析: 按照题意模拟 代码: #include <bits/stdc++.h> usin ...

  7. 【Codeforces】Codeforces Round #492 (Div. 2) (Contest 996)

    题目 传送门:QWQ A:A - Hit the Lottery 分析: 大水题 模拟 代码: #include <bits/stdc++.h> using namespace std; ...

  8. Codeforces Round #671 (Div. 2) (A~E)

    Link~ 题面差评,整场都在读题 A 根据奇偶性判断一下即可. #include<bits/stdc++.h> #define ll long long #define N #defin ...

  9. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

随机推荐

  1. 提升命令行效率的Bash快捷键

    转自:http://linuxtoy.org/archives/bash-shortcuts.html 生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 大部分对其他 ...

  2. Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别

    昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [root@typecodes tcpmsg]# g ...

  3. 对CAN signal 的一点理解

      首先每个 ECU是一个网络节点,每个网络节点可收发一些 Message,每个Message 由CAN signals构成.每个 CAN signal利用一个或多个连续的2进制位来表示承载的信息.下 ...

  4. leetcode--js--Median of Two Sorted Arrays

     问题描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of ...

  5. java开发学生信息管理系统 源码

    开发环境:    Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图 源码及原文链接:https://javadao.xyz/forum.php?mo ...

  6. C#实现把String字符串转化为SQL语句中的In后接的参数

    实现把String字符串转化为In后可用参数代码: public string StringToList(string aa) { string bb1 = "("; if (!s ...

  7. Python中autoescape标签使用详解

    1.spaceless标签:移除html标签中的空白字符.包括空格.tab键.换行符,示例代码如下: {% spaceless %}具体内容{% endspaceless %} 2.autoescap ...

  8. vue_day01

    Vue_day01 1. 认识vue 1.1 什么是vue (1)Vue是构建界面的渐进式的js框架 (2)只关注视图层, 采用自底向上增量开发的设计. (3)Vue 的目标是通过尽可能简单的 API ...

  9. Python爬虫连载9-JS加密之“盐”​、ajax请求

    一.JS加密之“盐”​ 1.salt属性“盐":多用于密码学,比如我们的银行卡是六位密码,但是实际上在银行的系统里,我们输入密码后,会给原始的密码添加若干字符,形成更加难以破解的密码.这个过 ...

  10. 各大原厂看好MRAM发展

    MRAM是一种以电阻为存储方式结合非易失性及随机访问两种特性,可以兼做内存和硬盘的新型存储介质.写入速度可达NAND闪存的数千倍,此外,其制作工艺要求低,良品率高,可以很好的控制成本.在寿命方面,由于 ...