[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; ...
随机推荐
- XMLHttpRequest 整理
看了SF 上的一篇文章感触颇深:你真的会使用XMLHttpRequest吗? 在这我写上我读后的笔记: <!DOCTYPE html> <html lang="en&quo ...
- 56、isinstance作用以及应用场景?
isinstance作用:来判断一个对象是否是一个已知的类型: 其第一个参数(object)为对象,第二个参数为类型名(int...)或类型名的一个列表((int,list,float)是一个列表). ...
- 自己看之区间DP
//菜鸡制作,看的时候可能三目运算符略烦;;; 区间DP入门题:Brackets 地址:http://59.77.139.92/Problem.jsp?pid=1463 分析(对区间DP的代码原理进行 ...
- linux的主题与图标
我先在使用arch跟xfce, 速度没得说,偶尔用一下openbox 有一天将xfce的声音给搞没了,完全不知道哪里配置错了,只好将用户文件夹下的所有配置删除,然后重启进入一切又ok啦 说一下主题,小 ...
- Linux SCIM/fcitx/ibus 输入法
现在很多发行版linux一般都是装好scim scim-tables-zh 重启就行 但有时重启后还是不能调用 可以用如下方法: 添加文件: sudo gedit /etc/X11/xinit/xin ...
- python使用unittest模块selenium访问斗鱼获取直播信息
import unittest from selenium import webdriver from bs4 import BeautifulSoup as bs class douyu(unitt ...
- HDU 1560 DNA sequence(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题目大意:给出n个字符串,让你找一个字符串使得这n个字符串都是它的子串,求最小长度. 解题思路: ...
- LeetCode862. Shortest Subarray with Sum at Least K
Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...
- CVE-2012-0158个人分析
CVE-2012-0158是一个比较有名的老漏洞了,这次从论坛上找到一个poc文件,利用这个poc来分析CVE-2012-0158漏洞的形成. http://bbs.pediy.com/showthr ...
- 用户代码未处理EntityCommandExecutionmException报错解决方案
原因可能是(1)没有编译好,清理解决方案,重新生成解决方案. (2)可能是WebSiteConfiguration.DbProviderName;中为DbProviderName属性 ...