Link:

传送门

代码量很少的一套思维题

A:

试一试发现最后状态一定是所有$min,max$间$gcd$的倍数

直接判断数量的奇偶性即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
int n,mx,x,gcd; int GCD(int x,int y){return !y?x:GCD(y,x%y);}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&x),mx=max(mx,x),gcd=GCD(gcd,x);
if(!gcd) gcd=;
puts((mx/gcd-n)%?"Alice":"Bob");
return ;
}

Problem A

感觉现在自己开始瞎猜结论了……

看完样例就直接觉得最终状态应该是$[1,max]$……

猜结论一定要手造数据试一试!

B:

$LCS+KMP$

只要在$dp$状态上多记录一维当前子序列匹配到的位置就能做了

输出方案的话可以用$map$记录前驱方案各维的值,不过从前向后记忆化搜索可以不用$map$

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
struct Tri{int x,y,z;};
const int MAXN=,INF=<<;
map<Tri,Tri> pre;
char a[MAXN],b[MAXN],c[MAXN],ans[MAXN];
int la,lb,lc,dp[MAXN][MAXN][MAXN],nxt[MAXN],val[MAXN],tot;
//重载要写全!
bool operator < (const Tri &a,const Tri &b)
{
if(a.x==b.x&&a.y==b.y) return a.z<b.z;
else if(a.x==b.x) return a.y<b.y;
else return a.x<b.x;
} void kmp()
{
int k=;nxt[]=;
for(int i=;i<=lc;i++)
{
while(k&&c[k+]!=c[i]) k=nxt[k];
if(c[k+]==c[i]) k++;nxt[i]=k;
}
}
int cal_nxt(int x,int y)
{
while(y&&c[y+]!=a[x]) y=nxt[y];
if(c[y+]==a[x]) y++;
return y;
}
void modify(Tri x,Tri y,int val)
{
if(x.x>la||x.y>lb) return;
int &t1=dp[x.x][x.y][x.z];
int &t2=dp[y.x][y.y][y.z];
if(t1<t2+val)
t1=t2+val,pre[x]=y;
}
//可以不记录pre,从前往后记忆化搜索
void print(Tri t)
{
int lst=;
while(t.x&&t.y)
{
if(a[t.x]==b[t.y])
ans[++tot]=a[t.x],val[tot]=dp[t.x][t.y][t.z];
t=pre[t];
}
while(tot)
if(val[tot]!=val[tot+]) printf("%c",ans[tot--]);
else tot--;
}
int main()
{
scanf("%s%s%s",a+,b+,c+);
la=strlen(a+);lb=strlen(b+);lc=strlen(c+);
kmp(); for(int i=;i<=la;i++)
for(int j=;j<=lb;j++)
for(int k=;k<lc;k++)
{
modify((Tri){i+,j,k},(Tri){i,j,k},);
modify((Tri){i,j+,k},(Tri){i,j,k},);
if(a[i+]!=b[j+]) continue;
int Nxt=cal_nxt(i+,k);
if(Nxt==lc) continue;
modify((Tri){i+,j+,Nxt},(Tri){i,j,k},);
} int res=,t;
for(int i=;i<lc;i++)
if(res<dp[la][lb][i]) res=dp[la][lb][i],t=i;
if(!res) return puts(""),;
print((Tri){la,lb,t});
return ;
}

Problem B

如果$map$里存结构体一定要把小于号重载写全,否则第一维相等就不插入了!

bool operator < (const Tri &a,const Tri &b)
{
if(a.x==b.x&&a.y==b.y) return a.z<b.z;
else if(a.x==b.x) return a.y<b.y;
else return a.x<b.x;
}

C:

设$dp[i]$表示从$b+i$到$b$的步数,明显$dp[i]$是单调增的

这样每次贪心选取最小能达到的$a-amodc[i]$即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
int n,dat[MAXN],a,b,res; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
sort(dat+,dat+n+);
//必须离散化才能保证线性复杂度
n=unique(dat+,dat+n+)-dat-;
scanf("%d%d",&a,&b); while(a>b)
{
int mn=a-;
for(int i=;i<=n;i++)
if(a-a%dat[i]>=b) mn=min(mn,a-a%dat[i]);
a=mn;res++;
while(n&&a-a%dat[n]<b) n--;//一定要优化
}
printf("%d",res);
return ;
}

Problem C

注意一定要离散化+去除过大的$c[i]$进行优化!!

D:

E:

[Codeforces #201] Tutorial的更多相关文章

  1. [Codeforces #172] Tutorial

    Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...

  2. [Codeforces #514] Tutorial

    Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...

  3. [Codeforces #210] Tutorial

    Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...

  4. [Codeforces #196] Tutorial

    Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...

  5. [Codeforces #174] Tutorial

    Link: Codeforces #174 传送门 A: 求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质 如果要确定哪些是原根的话还是要枚举,不过对于每个数不 ...

  6. [Codeforces #190] Tutorial

    Link: Codeforces #190 传送门 A: 明显答案为$n+m-1$且能构造出来 #include <bits/stdc++.h> using namespace std; ...

  7. [Codeforces #211] Tutorial

    Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...

  8. [Codeforces #192] Tutorial

    Link: Codeforces #192 传送门 前两天由于食物中毒现在还要每天挂一天的水 只好晚上回来随便找套题做做找找感觉了o(╯□╰)o A: 看到直接大力模拟了 但有一个更简便的方法,复杂度 ...

  9. [Codeforces #188] Tutorial

    Link: Codeoforces #188 传送门 A: 先全转为正数,后面就全是指数级增长了 #include <bits/stdc++.h> using namespace std; ...

随机推荐

  1. 【leetcode 简单】 第五十三题 删除重复的电子邮箱

    编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+------------------+ | Id | Email | +-- ...

  2. An impassioned circulation of affection(尺取+预处理)

    题目链接:http://codeforces.com/contest/814/problem/C 题目: 题意:给你一个长度为n的字符串,m次查询,每次查询:最多进行k步修改,求字符c(要输入的字符) ...

  3. JS 检测客户端断网情况

    常用方法 1 navigator.onLine 2 window.addEventListener() 3 获取网络资源 4 ajax请求 1. navigator.onLine 只会在机器未连上路由 ...

  4. 【IDEA】与Eclipse "Link with Editor"等价功能设置

    Link With Editor是Eclipse内置功能中十分小巧,但却异常实用的一个功能.这个开关按钮 (Toggle Button) 出现在各式导航器视图 ( 例如 Resource Explor ...

  5. RTM,RTW,GA等软件版本号详解

    一直以来,对于新手而言,软件的版本号都是个比较困扰人的问题,什么Beta.RC,再来个RTM.RTW....头大了吧?RTM和RTW有什么区别?借此机会,就给大家介绍一下这方面的小知识吧. 1.软件开 ...

  6. cookie 跨域的问题

    今天研究一天发现cookie无法设置除当前域名或者其父域名之外的其他domain. 这个是浏览器出于对cookie的保护造成的,也就是cookie无法跨域设置. 对于子域名也有如下规则,当前域名只能设 ...

  7. MongoDB之安装和基本使用(一)

    环境 ubuntu16.04 mongodb基本特点 MongoDB 是一个基于分布式 文件存储的NoSQL数据库;可以把MongoDB想象成一个大py字典. 模式自由 :可以把不同结构的文档存储在同 ...

  8. Python 正则表达式、re模块

    一.正则表达式 对字符串的操作的需求几乎无处不在,比如网站注册时输入的手机号.邮箱判断是否合法.虽然可以使用python中的字符串内置函数,但是操作起来非常麻烦,代码冗余不利于重复使用. 正则表达式是 ...

  9. Myeclipse编辑jsp文件很卡是什么原因?

    可能是配置问题,配置的时候不要把myeclipse连接到网络.否则每次编辑的时候要在网上查找,所以照成很卡.window->perferences->java->Installed ...

  10. linux下C语言编程,include的默认搜索路径

    C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:incl ...