[Codeforces #201] Tutorial
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的更多相关文章
- [Codeforces #172] Tutorial
Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...
- [Codeforces #514] Tutorial
Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...
- [Codeforces #210] Tutorial
Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...
- [Codeforces #196] Tutorial
Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...
- [Codeforces #174] Tutorial
Link: Codeforces #174 传送门 A: 求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质 如果要确定哪些是原根的话还是要枚举,不过对于每个数不 ...
- [Codeforces #190] Tutorial
Link: Codeforces #190 传送门 A: 明显答案为$n+m-1$且能构造出来 #include <bits/stdc++.h> using namespace std; ...
- [Codeforces #211] Tutorial
Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...
- [Codeforces #192] Tutorial
Link: Codeforces #192 传送门 前两天由于食物中毒现在还要每天挂一天的水 只好晚上回来随便找套题做做找找感觉了o(╯□╰)o A: 看到直接大力模拟了 但有一个更简便的方法,复杂度 ...
- [Codeforces #188] Tutorial
Link: Codeoforces #188 传送门 A: 先全转为正数,后面就全是指数级增长了 #include <bits/stdc++.h> using namespace std; ...
随机推荐
- 【leetcode 简单】第三十四题 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...
- 微信小程序rpx单位
rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375p ...
- 1030 大数进制转换(51Nod + JAVA)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1030 题目: 代码实现如下: import java.mat ...
- bzoj 3522 tree-dp 暴力
首先我们知道,这个题可以N^2的做,我们先确定一个根,然后讨论下情况,合法的三个点只可能有三种情况,第一种是三个点有相同的lca,这种情况我们可以用tree-dp来解决,用dis[i][j]表示i为根 ...
- python基础===将Flask用于实现Mock-server
from flask import Flask from flask import request, Response, jsonify import random import string app ...
- atoll()函数使用注意事项及分析
atoll是c99标准加入的函数,在编译的时候可能要打开C99标准的编译选项 -std=c99. 另外,必须包含stdlib.h头文件,否则会出错. ☞ C程序代码如下所示: #include < ...
- jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素)
jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素) $("ul").append("<li cla ...
- 9.Python3标准库--数据压缩与归档
''' 尽管现代计算机系统的存储能力日益增长,但生成数据的增长是永无休止的. 无损(lossless)压缩算法以压缩或解压缩数据花费的时间来换取存储数据所需要的空间,以弥补存储能力的不足. Pytho ...
- Windows 和Linux 误删除后的恢复
ext文件系统上删除文件,可以恢复:extundelete; windows 恢复删除文件: final data v2.0汉化版 和 easyrecovery
- UFT12.续期的操作方法
安装完毕UFT后,页面中报install错误,此时报此错误的原因是因为UFT的许可证过期了,解决方法如下: 方法是找到C:\ProgramData目录下的SafeNet Sentinel文件夹将其删除 ...