CF 1110 D. Jongmah

题目大意:给你​\(n\)个瓷砖,每块瓷砖上有一个数字​\(a_i,(1\leq a_i\leq m)\)。你可以将三个有连续数字​\((比如3,4,5)\)的瓷砖或者三个数字相同​\((比如7,7,7)\)的瓷砖组成一个三元组。每个瓷砖只能用一次。问最多可以得到多少个三元组。​

比赛的时候好像全场A穿,然而并没有想到 (TAT。

一开始想到\(DP\),但是​觉得状态数太大;于是想了奇奇怪怪的贪心,但是都能找到反例。

这道题的关键是要发现一个性质:同一位置上连续三个瓷砖匹配不会超过\(2\)个。因为如果凑够了\(3\)个就可以分别单独匹配了。这样一来状态数就少了:设\(f[i][j][k]\)表示\(DP\)到编号为\(i\)的瓷砖,以\(i-1\)结尾的连续匹配进行了\(j\)次,以\(i\)结尾的连续匹配进行了\(k\)次的最大三元组数。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define N 1000005 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int n,m;
int f[N][3][3],sum[N];
int main() {
n=Get(),m=Get();
int a;
for(int i=1;i<=n;i++) {
a=Get();
sum[a]++;
}
memset(f,-0x3f,sizeof(f));
f[2][0][0]=0;
for(int i=2;i<m;i++) {
for(int j=0;j<3;j++) {
for(int k=0;k<3;k++) {
if(f[i][j][k]<0) continue ;
for(int q=0;q<3;q++) {
if(sum[i+1]<q) break;
if(sum[i]<k+q) break;
if(sum[i-1]<j+k+q) break;
f[i+1][k][q]=max(f[i+1][k][q],f[i][j][k]+(sum[i-1]-j-k-q)/3+q);
}
}
}
}
int ans=0;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
ans=max(ans,f[m][i][j]+(sum[m]-j)/3+(sum[m-1]-i-j)/3);
cout<<ans;
return 0;
}

总结:发现这种非一般套路的\(DP\)或者贪心题时要去发现题目的特殊性质,往往特殊性质是解题的关键。


CF 1110 E. Magic Stones

题目大意:给你两个长度为\(n\)的序列\(c\)和\(t\)。你可以对\(c\)进行任意次操作,每次操作选取位置\(i(2\leq i\leq n-1)\),然后将\(c_i\)变成\(c_{i-1}+c_{i+1}-c_i\)。

这题太神了,不过好像比赛时也被A穿了。

我们设\(d_i=c_{i+1}-c_i(1\leq i \leq n-1)\)。我们会发现,对\(c_i\)进行上述操作后,交换了\(d_{i-1}\)与\(d_i\)。

所以我们将两个数列的\(d\)数组求出来,排序后直接比较就行了。还有要判断\(c_1==t_1\)。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define N 200005 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int n;
int c[N],t[N];
int dc[N],dt[N];
int main() {
n=Get();
for(int i=1;i<=n;i++) c[i]=Get();
for(int i=1;i<=n;i++) t[i]=Get();
for(int i=1;i<n;i++) dc[i]=c[i+1]-c[i];
for(int i=1;i<n;i++) dt[i]=t[i+1]-t[i];
if(c[1]!=t[1]) {cout<<"No";return 0;}
sort(dc+1,dc+n);
sort(dt+1,dt+n);
for(int i=0;i<=n;i++) {
if(dc[i]!=dt[i]) {cout<<"No";return 0;}
}
cout<<"Yes";
return 0;
}

CF 1110 D/E的更多相关文章

  1. cf 1110 D

    哇真难啊,没注意到 可以开 dp[N][3][3]这种性质,也就是三个相同的顺子可以变成三个刻子,所以我们维护顺子的数目就不用超过三了,又因为每张牌i,只会被i-1,i-2,影响,所以额外开两维记录( ...

  2. CF 1110 E. Magic Stones

    E. Magic Stones 链接 题意: 给定两个数组,每次可以对一个数组选一个位置i($2 \leq i \leq n - 1$),让a[i]=a[i-1]+a[i+1]-a[i],或者b[i] ...

  3. CF 1110 D. Jongmah

    D. Jongmah 链接 题意: 一些数字,有两种方式组成一个三元组,[x,x,x],[x,x+1,x+2],每个数字只能用一次,求最多组成多少三元组. 分析: 因为每三个[x,x+1,x+2]是可 ...

  4. CF - 1110 C Meaningless Operations

    题目传送门 题解: 首先根据观察,很容易发的是: x != (1<<k) - 1 时候 答案就是, 将x二进制下再最高位后的0都变成1. 然后就是考虑 x == (1<<k) ...

  5. CodeForces Contest #1110: Global Round 1

    比赛传送门:CF #1110. 比赛记录:点我. 涨了挺多分,希望下次还能涨. [A]Parity 题意简述: 问 \(k\) 位 \(b\) 进制数 \(\overline{a_1a_2\cdots ...

  6. 做题记录 To 2019.2.13

    2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...

  7. CF 553A 组合DP

    http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...

  8. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. C#基础知识总结(五)

    摘要 其他的数据类型:常量.枚举(enum).结构(struct).数组一.常量 语法:const 类型 变量名 = 变量值 常量称之为值不可变的变量! 在定义的地方赋值,其他的地方不能赋值. 常量变 ...

  2. [angularjs] angularjs系列笔记(五)Service

    AngularJs中你可以使用自己的服务或使用内建服务,服务是一个函数或对象,以下代码试验$location服务,$http服务,$timeout服务,$intverval服务,创建自定义服务 < ...

  3. nginx配置反向代理和负载均衡

    一.反向代理 说明:应该有一个nginx服务器有多个应用服务器(可以是tomcat),本文使用一台虚拟机,安装一个nginx,多个tomcat,来模拟 upstream tomcats{ server ...

  4. java——初识

    java是现在最火的高级编程语言之一,功能强,应用广. java可以做什么? 1. 开发桌面应用程序 2. 开发面向Internet的应用程序 开发java程序的基本步骤: 1. 编写源程序:mypr ...

  5. python爬虫scrapy项目详解(关注、持续更新)

    python爬虫scrapy项目(一) 爬取目标:腾讯招聘网站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&st ...

  6. Java中的匿名内部类及内部类的二三事

    匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...

  7. php环境安装

    Windows安装 下载php压缩包, http://php.net/downloads.php, 一定要下载Windows版本的呦 将压缩包解压到指定目录下: 创建配置文件, 其中有两个配置文件在根 ...

  8. hihoCoder编程练习赛52

    题目1 : 字符串排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一般我们在对字符串排序时,都会按照字典序排序.当字符串只包含小写字母时,相当于按字母表" ...

  9. 小tips:JS数值之间的转换,JS中最大的Number是多少?,JS == 与 === 的区别

    JS数值之间的转换 Number(), parseInt(),parseFloat() Number()函数的转换规则如下: 1.如果boolean值,true和false将分别被转换为1和02.如果 ...

  10. 2018-11-04 在线代码离线翻译Chrome插件"一马"v0.0.14

    续前文: 在线代码离线翻译Chrome插件"一马"v0.0.8. 主要改进如下. 项目源码库: program-in-chinese/webextension_github_cod ...