P1449 后缀表达式
#include<iostream>
#include<cstdio>
using namespace std;
long long stk[1000];
int main(){
long long i=0,now=0;
char op;
while((op=getchar())!='@'){
if(op>='0'&&op<='9') now*=10,now+=op-'0';
else if(op=='.'){
stk[++i]=now;
now=0;
}
else if(op=='+'){
stk[i-1]=stk[i-1]+stk[i];
stk[i]=0;
i--;
}
else if(op=='-'){
stk[i-1]=stk[i-1]-stk[i];
stk[i]=0;
i--;
}
else if(op=='*'){
stk[i-1]=stk[i-1]*stk[i];
stk[i]=0;
i--;
}
else if(op=='/'){
stk[i-1]=stk[i-1]/stk[i];
stk[i]=0;
i--;
}
}
cout<<stk[1];
return 0;
}
P1044 [NOIP2003 普及组] 栈
#include<iostream>
using namespace std;
int zhan[20][20];
int main()
{
int n;cin>>n;
for(int j=0;j<=n;j++)
for(int i=0;i<=n;i++)
{
if(j==0) zhan[i][0]=1;
else if(i==0) zhan[0][j]=zhan[1][j-1];
else
{
zhan[i][j]=zhan[i-1][j]+zhan[i+1][j-1];
}
}
cout<<zhan[0][n];
return 0;
}
P6033 [NOIP2004 提高组] 合并果子
#include <cstdio>
#include <queue>
#define int long long
using namespace std;
queue <int> q1;
queue <int> q2;
int to[100005];
void read(int &x){
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
}
signed main() {
int n;
read(n);
for (int i = 1; i <= n; ++i) {
int a;
read(a);
to[a] ++;
}
for (int i = 1; i <= 100000; ++i) {
while(to[i]) {
to[i] --;
q1.push(i);
}
}
int ans = 0;
for (int i = 1; i < n; ++i) {
int x , y;
if((q1.front() < q2.front() && !q1.empty()) || q2.empty()) {
x = q1.front();
q1.pop();
}
else {
x = q2.front();
q2.pop();
}
if((q1.front() < q2.front() && !q1.empty()) || q2.empty()) {
y = q1.front();
q1.pop();
}
else {
y = q2.front();
q2.pop();
}
ans += x + y;
q2.push(x + y);
}
printf("%lld" , ans);
return 0;
}
P2168 [NOI2015] 荷马史诗
#include<iostream>
#include<queue>
using namespace std;
using LL=long long;
struct node{
LL w;//weight
int h;//height
//构造函数
node():w(0),h(0){}
node(LL w,int h):w(w),h(h) {
}
//重构运算符~定义小于号<
bool operator < (const node &x) const{
if(x.w!=w) return x.w <w; //权重优先
return x.h < h;
}
};
int n, k;
priority_queue<node> q;//小根堆
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);//达到scanf() printf()的时间效率
cin>>n>>k;
LL w;
for(int i=0;i<n;i++){
cin>>w;
q.push({w,1});
}
//k叉哈夫曼树要求(n-1)%(k-1)=0,须虚增节点w=0
while((q.size()-1)%(k-1)) q.push({0,1});
//构造k叉哈夫曼树
LL wpl = 0;//树的结点权值路径长度
int h=0;//h=-1,h=1
while(true){
w = 0;
for(int i=0;i<k;i++){//取k个结点合并
node x = q.top(); q.pop();
w +=x.w;
if(x.h>h) h=x.h;
}
wpl +=w;
q.push({w,h+1});
if(1==q.size()) break;
}
cout<< wpl <<endl <<h<< endl;
return 0;
}
void list(){
while(!q.empty())
cout <<q.top().w<<'~'<<q.top().h<<endl,q.pop();
}
序列合并1631
#include<bits/stdc++.h>
using namespace std;
int a[100000],b[100000],heap[100000],from[100000],step[100000],n,sum=1;
void swap(int x,int y)//手打swap交换,同时交换来源数组。
{
int k = heap[x];
heap[x] = heap[y];
heap[y] = k;
k = from[x];
from[x] = from[y];
from[y] = k;
}
int main()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
for (int i = 1;i <= n;i++) scanf("%d",&b[i]);
for (int i = 1;i <= n;i++) heap[i] = a[i]+b[1],from[i] = i,step[i] = 1;
//这一步就是优化。把c去掉了,取而代之的是现做现卖的合成。
while (sum <= n)
{
printf("%d ",heap[1]);
int t = from[1];
step[t]++;
heap[1]=a[t] + b[ step[t] ];//现做现卖的合成。
int x = 1,s;
while (x<<1 <= n)//经典的下传
{
s = x<<1;
if (heap[s] > heap[s + 1] && s + 1 <= n) s++;
if (heap[x] > heap[s])
{
swap(x,s);
x = s;
}else break;
}
sum++;
}
return 0;
}
淘汰赛4715
#include<iostream>
#include<queue>
#include<map>
using namespace std;
int main(){
int n;
queue<pair<int,int> > q; //pair是stl中的数据结构,这里用first表示国家号,second表示国家实力
cin>>n;
n=1<<n; //位运算,等价与n=pow(2,n)(位运算更快)
for(int i=1;i<=n;i++){
int x;
cin>>x;
q.push(make_pair(i,x)); //make_pair(i,x)就是建立一个first为i,second为x的pair
}
while(q.size()>2){ //循环将比赛进行至只剩前两名(q.size()为2是时要跳出循环单独判断亚军)
pair<int,int> x,y;
x=q.front();
q.pop();
y=q.front();
q.pop();
if(x.second>y.second){ //从队头取出两个队,进行比较后将较强的队压入队尾
q.push(x);
}else{
q.push(y);
}
}
pair<int,int> x,y;
x=q.front();
q.pop();
y=q.front();
q.pop();
if(x.second>y.second){ //较弱的那队时亚军,将其国家号输出
cout<<y.first<<endl;
}else{
cout<<x.first<<endl;
}
return 0;
}
验证栈序列4387
#include<iostream>
#include<stack>
using namespace std;
stack<int>q;//栈q
int p,n;//p组数据,n为序列长度
int main()
{
cin>>p;
while(p--)
{
cin>>n;
int a[n+1],b[n+1],sum=1;//入栈队列a,待检验队列b,计数器sum
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];//平平无奇的输入
for(int i=1;i<=n;i++)
{
q.push(a[i]);//入栈
while((q.top())==b[sum])//当栈顶元素与b中当前元素相同时出栈
{
q.pop(),sum++;//sum++到b下一个元素
if(q.empty())break;//注意这里,第一次RE就因为当栈空时还用了出栈操作,所以要手动结束循环
}
}
if(q.empty()) cout<<"Yes"<<endl;//如果栈为空说明出栈序列b正确
else cout<<"No"<<endl;
while(!q.empty())q.pop();//清空栈
}
return 0;//谢幕
}
图的遍历3916
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define MAXL 100010
int N, M, A[MAXL];
vector<int> G[MAXL]; //vector存图
void dfs(int x, int d) {
if(A[x]) return; //访问过
A[x] = d;
for(int i=0; i<G[x].size(); i++)
dfs(G[x][i], d);
}
int main() {
int u, v;
scanf("%d%d", &N, &M);
for(int i=1; i<=M; i++) {
scanf("%d%d", &u, &v);
G[v].push_back(u); //反向建边
}
for(int i=N; i; i--) dfs(i, i);
for(int i=1; i<=N; i++) printf("%d ", A[i]);
printf("\n");
return 0;
}
二叉树问题3884
#include<bits/stdc++.h>
#define r read()//偷懒
#define lnf INT_MAX/4
// INT_MAX 是一个常量定义在 limits.h 头文件中 其值就是字面意思
#define Min(a,b) ((a)<(b)?(a):(b))//手打min提高效率
#define Max(a,b) ((a)>(b)?(a):(b))//同上,切记括号千万不能漏
//STL 中的 max 和 min 速度相当慢 用 if 速度也不及条件表达式
using namespace std;
inline int read()//快读不解释
{
char c=getchar();
int x=0,fh=0;
while(c<'0'||c>'9'){fh|=c=='-';c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return fh?-x:x;
}
int n=r;
int a[101][101];//邻接矩阵存图
int b[100000000];
int main()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)a[i][j]=lnf;//预处理
for(int i=1;i<n;i++)
{
int x=r,y=r;
a[x][y]=1;//父亲到孩子距离为1
a[y][x]=2;//孩子到父亲距离为2
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=Min(a[i][j],a[i][k]+a[k][j]);//Floyd算法
int u=r,v=r;
int maxsum=0,maxd=0,maxn=1;
for(int i=2;i<=n;i++)
{
maxsum=Max(maxsum,a[1][i]);//深度
b[a[1][i]]++;//同时统计每一层的节点数
maxn=Max(maxn,a[i][1]);
}
for(int i=1;i<=maxn;i++)
maxd=Max(maxd,b[i]);//宽度
cout<<maxsum+1<<endl;
cout<<maxd<<endl;
cout<<a[u][v]<<endl;//树上距离
return 0;
}
单源最短路径3371
#include<bits/stdc++.h>
const long long inf=2147483647;
const int maxn=10005;
const int maxm=500005;
using namespace std;
int n,m,s,num_edge=0;
int dis[maxn],vis[maxn],head[maxm];
struct Edge
{
int next,to,dis;
}edge[maxm];
void addedge(int from,int to,int dis)
{ /
edge[++num_edge].next=head[from]; edge[num_edge].to=to;
edge[num_edge].dis=dis; head[from]=num_edge;
}
void spfa()
{
queue<int> q; for(int i=1; i<=n; i++)
{
dis[i]=inf;
vis[i]=0; }
q.push(s); dis[s]=0; vis[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop(); vis[u]=0; for(int i=head[u]; i; i=edge[i].next) {
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].dis) {
dis[v]=dis[u]+edge[i].dis;
if(vis[v]==0) {
vis[v]=1; q.push(v);
}
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1; i<=m; i++)
{
int f,g,w;
cin>>f>>g>>w;
addedge(f,g,w);
}
spfa(); for(int i=1; i<=n; i++)
if(s==i) cout<<0<<" "; else cout<<dis[i]<<" "; return 0;
}
最小生成树3366
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define R register int
using namespace std;
int k,n,m,cnt,sum,ai,bi,ci,head[5005],dis[5005],vis[5005];
struct Edge
{
int v,w,next;
}e[400005];
void add(int u,int v,int w)
{
e[++k].v=v;
e[k].w=w;
e[k].next=head[u];
head[u]=k;
}
typedef pair <int,int> pii;
priority_queue <pii,vector<pii>,greater<pii> > q;
void prim()
{
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty()&&cnt<n)
{
int d=q.top().first,u=q.top().second;
q.pop();
if(vis[u]) continue;
cnt++;
sum+=d;
vis[u]=1;
for(R i=head[u];i!=-1;i=e[i].next)
if(e[i].w<dis[e[i].v])
dis[e[i].v]=e[i].w,q.push(make_pair(dis[e[i].v],e[i].v));
}
}
int main()
{
memset(dis,127,sizeof(dis));
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(R i=1;i<=m;i++)
{
scanf("%d%d%d",&ai,&bi,&ci);
add(ai,bi,ci);
add(bi,ai,ci);
}
prim();
if (cnt==n)printf("%d",sum);
else printf("orz");
}
瑞瑞的木板1334
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll> > a;//这里直接调用优先队列
#define in(t) freopen("t.in","r",stdin)
#define out(t) freopen("t.out","w",stdout)
#define m(a) memset(a,0,sizeof(a))
int main(){
long long ans=0,n,t;//ans注意要开long long,不然会爆
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&t);
a.push(t);
}
for(int i=1;i<=n-1;i++){
int c,d;
c=a.top();
a.pop();
d=a.top();
a.pop();//每次取最小的两个数
ans+=c+d;//加上能量
a.push(c+d);
}//和合并果子一样,具体可以参考合并果子题解
printf("%lld",ans);
return 0;
}
队列安排1160
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int mx=1e5+10;
int n,m;
struct T{
int l,r; //每个同学的“左右手”
int d; //表示同学是否输出
}t[mx]={0};
void add(int i,int k,int f) //新增同学
{
if(f==1) //左
{
t[k].r=t[i].r;
t[k].l=i;
t[i].r=k;
t[t[k].r].l=k;
}
else //右
{
t[k].r=i;
t[k].l=t[i].l;
t[i].l=k;
t[t[k].l].r=k;
}
}
int main()
{
int x,k,f;
cin>>n;
t[0].r=0,t[0].l=0;
add(0,1,1);
for (int i=2;i<=n;i++)
{
cin>>x>>f;
add(x,i,f);
}
cin>>m;
while(m--)
{
cin>>x;
t[x].d=1; //将该同学标记为不输出
}
for (int i=t[0].r;i;i=t[i].r)
{
if (t[i].d==0) //输出未标记的
cout<<i<<" ";
}
return 0;
}
合并果子1090
#include <bits/stdc++.h>
using namespace std;
int n,x,ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>x,q.push(x);
while(q.size()>=2){
int a=q.top(); q.pop();
int b=q.top(); q.pop();
ans+=a+b;
q.push(a+b);
}
cout<<ans<<endl;
return 0;
}
完全二叉树的权值8681
#include <bits/stdc++.h>
using namespace std;
int n, a, sum, ans, dep = 1, Max = -1e9;
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a;
sum += a;
if (i == (1 << dep)-1) {
if (sum > Max) {
Max = sum;
ans = dep;
}
++dep;
sum = 0;
}
}
if (sum > Max) {
Max = sum;
ans = dep;
}
cout << ans;
return 0;
}
查找文献5318
#include<iostream> //头文件头文件头文件
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct edge{ //存边结构体
int u,v;
};
vector <int> e[100001]; //两个vector刚才已经详细讲过了
vector <edge> s;
bool vis1[100001]={0},vis2[100001]={0}; //标记数组
bool cmp(edge x,edge y){ //排序规则
if(x.v==y.v)
return x.u<y.u;
else return x.v<y.v;
}
void dfs(int x){ //深度优先遍历
vis1[x]=1;
cout<<x<<" ";
for(int i=0;i<e[x].size();i++){
int point=s[e[x][i]].v;
if(!vis1[point]){
dfs(point);
}
}
}
void bfs(int x){ //广度优先遍历
queue <int> q;
q.push(x);
cout<<x<<" ";
vis2[x]=1;
while(!q.empty()){
int fro=q.front();
for(int i=0;i<e[fro].size();i++){
int point=s[e[fro][i]].v;
if(!vis2[point]){
q.push(point);
cout<<point<<" ";
vis2[point]=1;
}
}
q.pop();
}
}
int main(){
int n,m; //输入,存边
cin>>n>>m;
for(int i=0;i<m;i++){
int uu,vv;
cin>>uu>>vv;
s.push_back((edge){uu,vv});
}
sort(s.begin(),s.end(),cmp); //排序
for(int i=0;i<m;i++)
e[s[i].u].push_back(i);
dfs(1); //从1号顶点开始深搜
cout<<endl;
bfs(1); //广搜亦同理
}
二叉树深度4913
#include <iostream>
#define _for(i, a, b) for (int i=(a); i<=(b); i++)
using namespace std;
const int MAXN = 1e6 + 10;
struct node {
int left, right;
};
node tree[MAXN];//存储结构定义
int n, ans;
void dfs(int id, int deep) {
if (id == 0) return ;//到达叶子节点时返回
ans = max(ans, deep);//更新答案
dfs(tree[id].left, deep+1);//向左遍历
dfs(tree[id].right, deep+1);//向右遍历
}
int main() {
cin >> n;
_for (i, 1, n) cin >> tree[i].left >> tree[i].right;//读入+建树
dfs(1, 1);//从1号节点出发,当前深度为1
cout << ans << endl;//输出答案
return 0;//完结撒花!
}
括号序列1241
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int top,w[110];
string a;
char s[110],c[110];
int main()
{
// freopen("work.in","r",stdin);freopen("work.out","w",stdout);
cin >> a;
int n=a.length();
for(int i=0;i<n;i++)
{
if(a[i] == '(' || a[i] == '[')
{
s[++top]=a[i];
w[top]=i;
if(a[i] == '(') c[i]=')';
else c[i]=']';
}
if(a[i] == ')')
{
if(top && s[top] == '(') {c[w[top]]=' '; top--;}
else c[i]='(';
}
if(a[i] == ']')
{
if(top && s[top] == '[') {c[w[top]]=' '; top--;}
else c[i]='[';
}
}
for(int i=0;i<n;i++)
{
if(c[i] == '(' || c[i] == '[') printf("%c%c",c[i],a[i]);
else if(c[i] == ')' || c[i] == ']') printf("%c%c",a[i],c[i]);
else printf("%c",a[i]);
}
// fclose(stdin);fclose(stdout);
return 0;
}
求先序排列1030
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
void beford(string in,string after){
if (in.size()>0){
char ch=after[after.size()-1];
cout<<ch;//找根输出
int k=in.find(ch);
beford(in.substr(0,k),after.substr(0,k));
beford(in.substr(k+1),after.substr(k,in.size()-k-1));//递归左右子树;
}
}
int main(){
string inord,aftord;
cin>>inord;cin>>aftord;//读入
beford(inord,aftord);cout<<endl;
return 0;
}
图的储存3643
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int g[1001][1001];
vector <int> k[N];
void add1(int a,int b)
{
g[a][b]=1,g[b][a]=1;
}
void add2(int a,int b)
{
k[a].push_back(b);
k[b].push_back(a);
}
int main()
{
int n,m;
cin>>n>>m;
for (int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
add1(a,b);
add2(a,b);
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
cout<<g[i][j]<<" ";
cout<<endl;
}
for (int i=1;i<=n;i++)
{
cout<<k[i].size()<<" ";
sort(k[i].begin(),k[i].end());
for (int j=0;j<k[i].size();j++) cout<<k[i][j]<<" ";
cout<<endl;
}
return 0;
}
图的存储与出边的排序3613
#include<cstdio>
#include<set>//set专属头文件
using namespace std;
const int maxn=5e5+5;
int t,n,m,x,y;
set<int>s[maxn];
inline int read(){//快读
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=s*10+ch-48,ch=getchar();
return s*w;
}
inline void write(int x){//快写
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+48);
}
int main(){
t=read();
while(t--){
n=read();m=read();
for(int i=1;i<=n;i++)s[i].clear();//在一组数据的开始部分进行初始化,将集合清空。
for(int i=1;i<=m;i++){
x=read();y=read();
s[x].insert(y);//使用邻接表的方式存储图。
}
for(int i=1;i<=n;i++){
for(auto it=s[i].begin();it!=s[i].end();it++)
write(*it),putchar(' ');//遍历输出
putchar('\n');//注意:即使一行中没有输出也要换行
}
}return 0;
}
floyd3647
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int Map[105][105];
int main()
{
int n,m,u,v,w;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
Map[i][j]=0;
else
Map[i][j]=inf;
}
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
Map[u][v]=min(Map[u][v],w);
Map[v][u]=Map[u][v]; //题中为无向图
}
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(Map[i][j]>Map[i][k]+Map[k][j])
Map[i][j]=Map[i][k]+Map[k][j];
//输出最终的结果,最终二维数组中存的即使两点之间的最短距离
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ",Map[i][j]);
}
printf("\n");
}
return 0;
}
杨辉三角5732
#include<cstdio>
int a[21][21];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
a[i][1]=a[i][i]=1;//赋初值
for(int i=1;i<=n;i++)
for(int j=2;j<i;j++)//因为a[i][1]、a[i][i]已经赋值过了,所以循环是2~n-1
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
蛇形方针5731
#include<cstdio>
using namespace std;
int read(){//没啥用的快读
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int a[15][15];//记录输出的数组
int pos[4][2]={0,1,1,0,0,-1,-1,0};//改变位置的数组
int main(){//主函数
int n=read(),x=1,y=1,d=0;//初始化
for(int i=1;i<=n*n;i++){//遍历
a[x][y]=i;//赋值
int tx=x+pos[d][0],ty=y+pos[d][1];//核心代码,解释见上
if(tx<1||tx>n||ty<1||ty>n||a[tx][ty]) d=(d+1)%4;
x+=pos[d][0],y+=pos[d][1];
}
for(int i=1;i<=n;i++){//输出
for(int j=1;j<=n;j++) printf("%3d",a[i][j]);//注意%3d
if(i<n) printf("\n");
}
return 0;//华丽结束
}
约瑟夫问题1996#include <iostream>
#include <queue>
using namespace std;
int n,m;
int main(){
cin >> n >>m;
queue<int>q;
for(int i=1; i<=n; i++) q.push(i);
while(n--){
for(int i=1; i<m; i++){
int k=q.front(); q.pop();
q.push(k);
}
cout<< q.front()<< ' ';
q.pop();
}
return 0;
}
回文质数1217
#include<bits/stdc++.h>
using namespace std;
int l, r;
bool check1(int x)//检查位数
{
if((1000 <= x && x <= 9999) || (100000 <= x && x <= 999999)) return 0;//不知道&&和||优先级的可以打个括号
return 1;
}
bool check2(int x)//检查是否回文
{
int a[20], flag = 1;//反正开得下,多开点
while (x > 0)
{
a[flag] = x % 10;
x /= 10;
flag++;
}
for (int i = 1; i <= flag / 2; i++)
if(a[i] != a[flag-i]) return 0;//不符合回文
return 1;
}
bool check3(int x)//检查是否为质数
{
if(x == 2) return 1;
for(int i = 2; i <= sqrt(x); i++)
if(x % i == 0) return 0;
return 1;
}
int main()
{
scanf("%d %d", &l, &r);
if(l == 2) printf("2\n");//一定要注意2!!!
if(l % 2 == 0) l++;
r = min(9999999, r);//再大的数都不可能是回文质数
for(int i = l; i <= r; i = i + 2)//枚举每一个奇数
{
if(check1(i) == 0) continue;
if(check2(i) == 0) continue;
if(check3(i) == 0) continue;
printf("%d\n", i);//printf会比cout快很多
}
return 0;
}
奇怪的电梯1135
#include<bits/stdc++.h>
using namespace std;
int n,a,b,k[201],dis[201];
void dfs(int node,int step){
dis[node]=step;//一定可以更新
int v=node-k[node];
if(1<=v&&step+1<dis[v]/*可以更新在搜索*/)//下
dfs(v,step+1);
v=node+k[node];
if(v<=n&&step+1<dis[v])//上
dfs(v,step+1);
return;
}
int main(){
memset(dis,0x3f,sizeof(dis));
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin>>k[i];
dfs(a,0);
cout<<(dis[b]==0x3f3f3f3f?-1:dis[b]);
return 0;
}