A. 搬家
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
int n;
stack<string> st;
string op,name;
int main() {
cin>>n;
for(int i=0;i<n;++i) {
cin>>op;
if(op=="Down") {
cin>>name;
st.push(name);
} else if(op=="Up") {
if(st.empty()) cout<<"?"<<endl;
else {
cout<<st.top()<<endl;
st.pop();
}
}
}
return 0;
}
B. 平衡素数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <unordered_map>
using namespace std;
const int N = 10001000;
bool isprime[N];
int ans[N],cnt,n,num,bns[N],pos;
unordered_map<int,int> mp;
void prime() {
fill(isprime,isprime+N,true);
isprime[0]=isprime[1]=false;
for(int i=2;i<N;++i) {
if(isprime[i]) {
for(int j=i*2;j<N;j+=i) {
isprime[j]=false;
}
ans[cnt]=i;
mp.insert(make_pair(i,cnt));
++cnt;
}
}
for(int i=1;i<cnt-1;++i) {
if((ans[i-1]+ans[i+1])==ans[i]*2) {
bns[pos++]=ans[i];
}
}
return;
}
int main() {
prime();
scanf("%d",&n);
for(int i=0;i<n;++i) {
bool flag=true;
scanf("%d",&num);
if(isprime[num]==false) {
flag=false;
} else {
int b=mp[num];
if(b==0||b==cnt-1) {
flag=false;
} else {
int a=(ans[b-1]+ans[b+1]);
if(a!=num*2) flag=false;
}
}
if(flag) printf("Yes\n");
else {
int l=0,r=pos-1;
while(l<r) {
int mid=l+r>>1;
if(bns[mid]>=num) r=mid;
else l=mid+1;
}
printf("No %d\n",bns[l]);
}
}
return 0;
}
C. 二叉树的最小带权路径长度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
const int N = 110;
struct node {
int id,val,lc,rc,level;
};
vector<node> res;
queue<node> Q;
bool cmp(node &a, node &b) {
return a.val>b.val;
}
int n,cnt,sum;
node ans[2*N];
int main() {
scanf("%d",&n);
int num;
for(int i=0;i<n;++i) {
scanf("%d",&num);
res.push_back(node{i,num,-1,-1,0});
ans[i]=node{i,num,-1,-1,0};
}
cnt=n;
while(res.size()!=1) {
sort(res.begin(),res.end(),cmp);
node p=res[res.size()-1];
res.pop_back();
node q=res[res.size()-1];
res.pop_back();
int num=p.val+q.val;
res.push_back(node{cnt,num,p.id,q.id,0});
ans[cnt]=node{cnt,num,p.id,q.id,0};
++cnt;
}
node root=res[0];
Q.push(root);
while(!Q.empty()) {
root=Q.front();
Q.pop();
if(root.lc!=-1) {
ans[root.lc].level=root.level+1;
Q.push(ans[root.lc]);
}
if(root.rc!=-1) {
ans[root.rc].level=root.level+1;
Q.push(ans[root.rc]);
}
if(root.lc==-1&&root.rc==-1) sum+=root.level*root.val;
}
printf("%d",sum);
return 0;
}
D. 紫金之火,在于丹阳
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int N = 510;
const int INF = 0x3f3f3f3f;
int n,m,p,k;
int s,t,d,b;
int dist[N],vis[N],G[N][N],res[N];
int cnt;
void dij() {
fill(dist,dist+N,INF);
dist[p]=0;
fill(vis,vis+N,false);
for(int i=0;i<n;++i) {
int v=-1,mindis=INF;
for(int j=0;j<n;++j) {
if(!vis[j]&&dist[j]<mindis) {
v=j;
mindis=dist[j];
}
}
if(v==-1) break;
vis[v]=true;
for(int u=0;u<n;++u) {
if(v!=u&&!vis[u]&&G[v][u]!=INF&&dist[v]+G[v][u]<dist[u]) {
dist[u]=dist[v]+G[v][u];
}
}
}
}
int main() {
scanf("%d %d %d",&n,&m,&p);
fill(G[0],G[0]+N*N,INF);
for(int i=0;i<n;++i) G[i][i]=0;
for(int i=0;i<m;++i) {
scanf("%d %d %d %d",&s,&t,&d,&b);
G[t][s]=d;
if(b==1) G[s][t]=d;
}
dij();
scanf("%d",&k);
for(int i=0;i<k;++i) {
scanf("%d",&s);
res[cnt++]=dist[s];
}
for(int i=0;i<cnt;++i) {
if(res[i]!=INF) printf("%d",res[i]);
else printf("-1");
if(i!=cnt-1) printf(" ");
}
return 0;
}