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. composer 上提交自己的包

    先在github上复制自己的地址在 https://packagist.org/packages/submit ->check->submit

  2. 在Unity中实现屏幕空间阴影(1)

    接着上篇文章,我们实现了SSR效果. 其中的在屏幕空间进行光线追踪的方法是通用的.借此我们再实现一种屏幕空间的效果,即屏幕空间阴影. 文中的图片来自Catlike coding http://catl ...

  3. 基于canvas实现的fontawesome动态图标

    由于还没有全部实现,实现了一些demo,demo地址在 https://github.com/jiangzhenfei/canvas-fontawesome 实现了动态loading 实现动态电池充电 ...

  4. unity3d 资源文件从MAX或者MAYA中导出的注意事项

    unity3d 资源文件从MAX或者MAYA中导出的注意事项     1.首先,Unity3d 中,导出带动画的资源有2种导出方式可以选择:    1) 导出资源时,只导出一个文件,保留模型,骨骼和所 ...

  5. Xcode 获取本地IP

    // // // #define MAXADDRS 32 extern char *ip_names[MAXADDRS]; void InitAddresses(); void GetIPAddres ...

  6. javascript复习笔记

    /* Javascript:用来在页面中编写特效,和HTML.CSS一样都是有浏览器解析 Javascript语言: 一.JS如何运行(javascript,jscript,vbscript,appl ...

  7. KKT条件和拉格朗日乘子法详解

    \(\frac{以梦为马}{晨凫追风}\) 最优化问题的最优性条件,最优化问题的解的必要条件和充分条件 无约束问题的解的必要条件 \(f(x)\)在\(x\)处的梯度向量是0 有约束问题的最优性条件 ...

  8. java并发-同步容器类

    java平台类库包含了丰富的并发基础构建模块,如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类. 同步容器类 同步容器类包括Vector和Hashtable,是早期JDK的一部分 ...

  9. 设计模式(一)工厂模式Factory(创建型)(转)

    原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符 ...

  10. [ python ] 练习作业 - 2

    1.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. lic = [0, 1, 2, 3, 4, 5] def func(l): return l[1::2 ...