[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; ...
随机推荐
- 天梯赛 L1-006 连续因子 (模拟)
一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为356*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列. 输入格式 ...
- 使用vscode实现git同步
用了git最方便的就是项目同步管理,回到家打开vscode只需要点击一下pull就能全部同步过来.是不是很方便....毕竟之前我都是拿u盘拷贝回家或者存到云盘再下载下来.. 我这里之前用的是国内的 ...
- window10_使用技巧
1.系统关机文件 @echo offshutdown -s -t 0 2.终端常用命令 notepad 3.解决浏览器跨域 --disable-web-security --user-data-dir ...
- SQLite3使用详解
sqlite常量的定义(SQLite3返回值的意思): SQLITE_OK = 0; 返回成功 SQLITE_ERROR = 1; SQL错误或错误的数据库 SQ ...
- 15个你不得不知道的Chrome dev tools的小技巧
转载自:https://www.imooc.com/article/2559 谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器.伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chro ...
- maven工程的建立
/* 我曾经接触过一个Java web项目,在进行部署时,发现这个项目涉及了maven 没有接触过maven项目的我,发现了如果需要导入maven工程,需要先在eclipse里面对maven进行配置, ...
- java版云笔记(九)之动态sql
SQL 首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程. 静态S ...
- 洛谷 P2036 Perket 题解
题目传送门 这道题可以使用dfs深搜实现,在每次递归深搜时要更新ans. #include<bits/stdc++.h> using namespace std; ,s=,b; ]; st ...
- 洛谷 P1897电梯里的爱情 题解
题目传送门 对于每个输入的第i个人,直接使用桶,但注意范围要开大一些. #include<bits/stdc++.h> using namespace std; ],x,sum,h,Max ...
- (转)粒子编辑器Particle designer属性的介绍
转载:http://blog.csdn.net/ym19860303/article/details/9210539 Particle designer粒子编辑器可到这里下载(包含授权码):http: ...