能力有限,好多题没A出来
L3-001 凑零钱
#include<bits/stdc++.h>
using namespace std;
int a[10003];
int dp[10003][103]={0};
vector<int>res;
int N;
void dfs(int i,int j)
{
if(i==N+1) return ;
if(j-a[i]>=0&&dp[i+1][j-a[i]]==1)
{
res.push_back(a[i]);
dfs(i+1,j-a[i]);
return ;
}
if(dp[i+1][j]==1)
{
dfs(i+1,j);
}
}
int main()
{
int M;
cin>>N>>M;
for(int i=1;i<=N;i++)
cin>>a[i];
sort(a+1,a+N+1);
dp[N+1][0]=1;
for(int i=N;i>=1;i--)
{
for(int j=0;j<=M;j++)
{
if(j<a[i])
dp[i][j]=dp[i+1][j];
else
{
dp[i][j]=dp[i+1][j]||dp[i+1][j-a[i]];
}
}
}
if(dp[1][M]==0)
cout<<"No Solution"<<endl;
else
{
dfs(1,M);
for(int i=0;i<res.size()-1;i++)
cout<<res[i]<<" ";
cout<<res[res.size()-1];
}
return 0;
}
L3-002 特殊堆栈
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N;
cin>>N;
string s;
stack<int>sk;
vector<int>skk;
while(N--)
{
cin>>s;
if(s=="Pop")
{
if(sk.empty())
cout<<"Invalid"<<endl;
else
{
int k=sk.top();
cout<<sk.top()<<endl;
sk.pop();
// skk.erase()
auto i =lower_bound(skk.begin(),skk.end(),k);
skk.erase(i);
}
}else if(s=="PeekMedian")
{
if(sk.empty())
{
cout<<"Invalid"<<endl;
continue;
}
if(sk.size()%2==0)
{
int n=skk.size()/2;
cout<<skk[n-1]<<endl;
}
else
{
int n=(skk.size()+1)/2;
cout<<skk[n-1]<<endl;
}
}
else if(s=="Push")
{
int x;
cin>>x;
sk.push(x);
auto i = upper_bound(skk.begin(),skk.end(),x);
skk.insert(i,x);
}
}
return 0;
}
L3-003 社交集群
#include<bits/stdc++.h>
using namespace std;
int f[10000];
int Find(int x)//查找它的祖先是谁
{
if(f[x]==x)
return x;
else
return f[x]=Find(f[x]);
}
void Ban(int x,int y)//合并
{
int tx=Find(x);
int ty=Find(y);
if(tx!=ty)
{
f[ty]=tx;
}
}
int main()
{
int N;
cin>>N;
for(int i=1;i<=N;i++)
f[i]=i;
int vis[10000]={0};
int K;
char c;
for(int i=1;i<=N;i++)
{
cin>>K>>c;
for(int j=0;j<K;j++)
{
int x;
cin>>x;
if(!vis[x])
{
vis[x]=i;
}
else
{
Ban(i,vis[x]);
}
}
}
unordered_map<int,int>ans;
for(int i=1;i<=N;i++)
{
int x=Find(i);
ans[x]++;
}
vector<int>res;
for(auto i : ans)
res.push_back(i.second);
sort(res.rbegin(),res.rend());
cout<<res.size()<<endl;
for(int i=0;i<res.size()-1;i++)
cout<<res[i]<<" ";
cout<<res[res.size()-1];
return 0;
}
L3-004 肿瘤诊断
//通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点
#include<bits/stdc++.h>
using namespace std;
int G[1300][130][70];
int vis[1300][130][71]={0};
int dir[6][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
int M,N,L,T;
// long long cnt;
// void dfs(int x,int y,int z)
// {
// cnt++;
// vis[x][y][z]=1;
// for(int i=0;i<6;i++)
// {
// int tx=x+dir[i][0];
// int ty=y+dir[i][1];
// int tz=z+dir[i][2];
// if(tx>=0&&ty>=0&&tz>=0&&tx<M&&ty<N&&tz<L&&!vis[tx][ty][tz]&&G[tx][ty][tz])
// {
// dfs(tx,ty,tz);
// }
// }
// }
struct Node
{
int x;
int y;
int z;
Node(int x,int y,int z){
this->x=x;
this->y=y;
this->z=z;
}
};
long long int bfs(int x,int y,int z)
{
queue<Node>Q;
Q.push(Node(x,y,z));
vis[x][y][z]=1;
long long sum=0;
while(!Q.empty())
{
Node head=Q.front();
Q.pop();
sum++;
for(int i=0;i<6;i++)
{
int tx=head.x+dir[i][0];
int ty=head.y+dir[i][1];
int tz=head.z+dir[i][2];
if(tx>=0&&ty>=0&&tz>=0&&tx<M&&ty<N&&tz<L&&!vis[tx][ty][tz]&&G[tx][ty][tz])
{
Q.push(Node(tx,ty,tz));
vis[tx][ty][tz]=1;
}
}
}
return sum>=T?sum:0;
}
int main()
{
cin>>M>>N>>L>>T;
long long int res=0;
for(int k=0;k<L;k++)
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
cin>>G[i][j][k];
}
}
}
for(int k=0;k<L;k++)
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
if((G[i][j][k]==1)&&(vis[i][j][k]==0))
{
res=res+bfs(i,j,k);
// cout<<bfs(i,j,k)<<" ";
}
}
}
}
cout<<res;
return 0;
}
L3-005 垃圾箱分布
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,int>bm;
vector<pair<int,int>>G[100005];
int vis[100005];
ll dis[100005];
int main()
{
int N,M,K,D;
cin>>N>>M>>K>>D;
int cnt=N+1;
while(K--)
{
string s1,s2;
int w;
cin>>s1>>s2>>w;
int u,v;
if(s1[0]=='G')
{
if(bm.count(s1))
u=bm[s1];
else
{
bm[s1]=cnt++;
u=bm[s1];
}
}
else
u=atoi(s1.data());
if(s2[0]=='G')
{
if(bm.count(s2))
v=bm[s2];
else
{
bm[s2]=cnt++;
v=bm[s2];
}
}
else
v=atoi(s2.data());
G[u].push_back({v,w});
G[v].push_back({u,w});
}
//枚举所有垃圾桶 10
//单元最短
string res_name="-1";
double res_Min=-1;
double res_age=0x3f3f3f3f;
for(auto it : bm)
{
int u=it.second;
string name=it.first;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>Q;
Q.push({0,u});
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[u]=0;
while(!Q.empty())
{
int u=Q.top().second;
int d=Q.top().first;
Q.pop();
if(vis[u])
continue;
vis[u]=1;
for(auto it : G[u])
{
int v=it.first;
int w=it.second;
if(dis[v]>d+w)
{
dis[v]=d+w;
Q.push({dis[v],v});
}
}
}
int judge=1;
double sum=0;
ll Min=0x3f3f3f3f;
for(int i=1;i<=N;i++)
{
if(dis[i]>D)
{
judge=0;
break;
}
Min=min(Min,dis[i]);
sum+=dis[i];
}//
if(!judge)
continue;
if(res_Min<Min)
{
res_name=name;
res_Min=Min;
res_age=sum;
}else if(res_Min==Min)
{
if(res_age>sum)
{
res_name=name;
res_Min=Min;
res_age=sum;
}
}
// cout<<name<<" "<<Min<<" "<<sum<<endl;
}
if(res_name=="-1")
{
cout<<"No Solution";
}
else
{
cout<<res_name<<endl;
double res=res_age*1.0/N;
printf("%.1f %.1f",res_Min,res);
}
return 0;
}
L3-006 迎风一刀斩
L3-007 天梯地图
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node
{
int u;
ll t,w;
Node(int u,ll t,ll w){
this->u=u;
this->t=t;
this->w=w;
}
};
vector<Node>G[10005];
ll dis[10005];
ll sum[10005];
int vis[10005];
int path[10005];
vector<int>ans1,ans2;
void print(vector<int>&ans,int x,int s)
{
if(x==s)
{
ans.push_back(x);
return ;
}
print(ans,path[x],s);
ans.push_back(x);
}
int dj1(int s,int e)
{
priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>>Q;
Q.push({0,s});
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(sum,0,sizeof(sum));
dis[s]=0;
while(!Q.empty())
{
int u=Q.top().second;
int d=Q.top().first;
Q.pop();
if(vis[u])
continue;
vis[u]=1;
for(auto it : G[u])
{
ll t=it.t;
int v=it.u;
ll w=it.w;
if(dis[v]>d+t)
{
dis[v]=d+t;
path[v]=u;
sum[v]=sum[u]+w;
Q.push({dis[v],v});
}else if(dis[v]==d+t)
{
if(sum[v]>sum[u]+w)
{
sum[v]=sum[u]+w;
path[v]=u;
}
}
}
}
print(ans1,e,s);
return dis[e];
}
int dj2(int s,int e)
{
priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>>Q;
Q.push({0,s});
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(sum,0,sizeof(sum));
dis[s]=0;
while(!Q.empty())
{
int u=Q.top().second;
int d=Q.top().first;
Q.pop();
if(vis[u])
continue;
vis[u]=1;
for(auto it : G[u])
{
ll t=it.t;
int v=it.u;
ll w=it.w;
if(dis[v]>d+w)
{
dis[v]=d+w;
path[v]=u;
sum[v]=sum[u]+1;
Q.push({dis[v],v});
}else if(dis[v]==d+w)
{
if(sum[v]>sum[u]+1)
{
sum[v]=sum[u]+1;
path[v]=u;
}
}
}
}
print(ans2,e,s);
return dis[e];
}
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int x,y,type,t,w;
cin>>x>>y>>type>>w>>t;
G[x].push_back(Node(y,t,w));
if(!type)
G[y].push_back(Node(x,t,w));
}
int s,e;
cin>>s>>e;
ll res1=dj1(s,e);
ll res2=dj2(s,e);
if(ans1==ans2)
{
printf("Time = %d; Distance = %d: ",res1,res2);
for(int i=0;i<ans1.size();i++)
{
if(i==0)
cout<<ans1[i];
else
cout<<" => "<<ans1[i];
}
}
else
{
printf("Time = %d: ",res1);
for(int i=0;i<ans1.size();i++)
{
if(i==0)
cout<<ans1[i];
else
cout<<" => "<<ans1[i];
}
cout<<endl;
printf("Distance = %d: ",res2);
for(int i=0;i<ans2.size();i++)
{
if(i==0)
cout<<ans2[i];
else
cout<<" => "<<ans2[i];
}
}
return 0;
}
L3-008 喊山
#include<bits/stdc++.h>
using namespace std;
vector<int>G[10001];
int maxk=0;
int minn=10001;
int dis[10001];
int vis[10001];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=0;i<k;i++)
{
int x;
cin>>x;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>> >Q;
//10000
memset(vis,0,sizeof(vis));
memset(dis,0x3f3f3f3f,sizeof(dis));
Q.push({0,x});
dis[x]=0;
while(!Q.empty())
{
int u=Q.top().second;
int d=Q.top().first;
Q.pop();
if(vis[u])
continue;
vis[u]=1;
for(auto v : G[u])
{
if(dis[v]>d+1)
{
dis[v]=d+1;
Q.push({dis[v],v});
}
}
}
int Max=-1;
int ans=0;
for(int i=1;i<=n;i++)
{
if(dis[i]==0x3f3f3f3f)
continue;
if(Max<dis[i])
{
Max=dis[i];
ans=i;
}
}
if(Max==0)
{
cout<<0<<endl;
}
else
cout<<ans<<endl;
}
return 0;
}
L3-009 长城
L3-010 是否完全二叉搜索树
#include<bits/stdc++.h>
using namespace std;
int ok=1;
int maxn=INT_MAX;
struct Node
{
long long val;
Node *l;
Node *r;
Node(long long val,Node *l,Node *r){
this->val=val;
this->l=l;
this->r=r;
}
};
vector<int>res;
void dfs(Node *head,int k)
{
if(!ok)
return ;
if(head==NULL)
{
res.push_back(k);
return ;
}
dfs(head->l,k+1);
dfs(head->r,k+1);
}
void create(Node *&root,long long val)
{
if(root==NULL)
{
root=new Node(val,NULL,NULL);
return ;
}
if(root->val>val)
create(root->r,val);
else
create(root->l,val);
}
int main()
{
int N;
cin>>N;
Node *root=NULL;
while(N--)
{
long long x;
cin>>x;
create(root,x);
}
queue<Node*>Q;
Q.push(root);
vector<long long>ans;
while(!Q.empty())
{
Node *head=Q.front();
Q.pop();
ans.push_back(head->val);
if(head->l!=NULL) Q.push(head->l);
if(head->r!=NULL) Q.push(head->r);
}
for(int i=0;i<ans.size();i++)
{
if(i!=0)
cout<<" "<<ans[i];
else cout<<ans[i];
}
cout<<endl;
dfs(root,0);
unordered_set<int>se;
int per=0x3f3f3f3f;
for(int i=0;i<res.size();i++)
{
se.insert(res[i]);
if(res[i]>per)
{
ok=0;
break;
}
per=res[i];
}
if(ok==1&&se.size()<=2)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
L3-011 直捣黄龙
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int d;
string u;
bool operator<( const Node &n1) const
{
return this->d > n1.d;
}
Node(string u,int d){
this->u=u;
this->d=d;
}
Node(){}
};
int main()
{
int N,M;
string S,E;
cin>>N>>M>>S>>E;
unordered_map<string,vector< pair<string,int> > >G;
unordered_map<string,int>w;//
w[S]=0;
unordered_map<string,int>d;//初始化完毕
unordered_map<string,int>vis;
unordered_map<string,int>Maxsum;
unordered_map<string,int>Maxlj;
Maxlj[S]=1;
unordered_map<string,int>sumlj;
sumlj[S]=1;
unordered_map<string,string>path;
unordered_map<string,int>usum;
for(int i=1;i<N;i++)//每行给出除了己方大本营外的一个城镇的代号和驻守的敌军数量
{
string s;
int val;
cin>>s>>val;
w[s]=val;
d[s]=0x3f3f3f3f;
}
d[S]=0;
while(M--)
{
string u,v;
int val;
cin>>u>>v>>val;
G[u].push_back({v,val});
G[v].push_back({u,val});
}
priority_queue<Node>Q;
Q.push(Node(S,0));
while(!Q.empty())
{
Node head=Q.top();
Q.pop();
if(vis.count(head.u))
continue ;
vis[head.u]=1;
if(!G.count(head.u))
continue ;
for(int i=0;i<G[head.u].size();i++)
{
string next=G[head.u][i].first;
int Val=G[head.u][i].second;
if(d[next]>d[head.u]+Val)
{
d[next]=d[head.u]+Val;
sumlj[next]=sumlj[head.u];
Maxlj[next]=Maxlj[head.u]+1;
usum[next]=usum[head.u]+w[next];
path[next]=head.u;
Q.push(Node(next,d[next]));
}
else if(d[next]==d[head.u]+Val)
{
sumlj[next]+=sumlj[head.u];//路径总和
if(Maxlj[head.u]+1>Maxlj[next])//最长路径
{
path[next]=head.u;
Maxlj[next]=Maxlj[head.u]+1;
usum[next]=usum[head.u]+w[next];
}
else if(Maxlj[next]==Maxlj[head.u]+1)//
{
if(usum[next]<usum[head.u]+w[next])//顶点最大和
{
path[next]=head.u;
usum[next]=usum[head.u]+w[next];
}
}
}
}
}
// cout<<d["DBY"];
stack<string>sk;
sk.push(E);
string t=path[E];
while(t!=S)
{
sk.push(t);
t=path[t];
}
cout<<S;
while(!sk.empty())
{
cout<<"->"<<sk.top();
sk.pop();
}
cout<<endl;
cout<<sumlj[E]<<" "<<d[E]<<" "<<usum[E];
// cout<<d[E]<<" "<<sumlj[E]<<" ";
return 0;
}
L3-012 水果忍者
L3-013 非常弹的球
#include<bits/stdc++.h>
using namespace std;
int main()
{
double m,p;
cin>>m>>p;
double e=1000;
m/=100;
double v=sqrt(2*e/m);
double x=0.0;
double g=9.8;
while(v>0.00001)
{
x+=e/(m*g/2);
e=(1-p/100)*e;
v=sqrt(2*e/m);
}
printf("%.3f",x);
return 0;
}
L3-014 周游世界
L3-015 球队“食物链
#include<bits/stdc++.h>
using namespace std;
int vis[21]={0};
int a[22];
int G[21][21]={0};
int ok=0;
void dfs(int s,int u,int k,int N)
{
if(ok==1)
return;
if(k==N)
{
if(G[u][s]==1)
{
ok=1;
return ;
}
return ;
}
int ye=0;
for(int i=1;i<=N;i++)
{
if(vis[i]==0&&G[i][s]==1)
ye=1;
}
if(ye==0)
return ;
for(int i=1;i<=N;i++)
{
if(ok==1)
return;
if(vis[i]==0&&G[u][i]==1)
{
vis[i]=1;
a[k]=i;
dfs(s,i,k+1,N);
vis[i]=0;
}
}
}
int main()
{
int N;
cin>>N;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
char c;
cin>>c;
if(c=='W')
G[i][j]=1;
if(c=='L')
G[j][i]=1;
}
}
for(int i=1;i<=N;i++)
{
memset(vis,0,sizeof(vis));
vis[i]=1;
dfs(i,i,1,N);
if(ok==1)
{
cout<<i<<" ";
for(int j=1;j<N;j++)
{
if(j==1)
cout<<a[j];
else cout<<" "<<a[j];
}
break;
}
}
if(ok==0)
cout<<"No Solution";
return 0;
}
L3-016 二叉搜索树的结构
#include<bits/stdc++.h>
using namespace std;
int cnt=0;
long long dp[1000001][4];
int main()
{
string s;
cin>>s;
int n=s.length();
s='0'+s;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=3;j++)
{
if(j>0)
dp[i][j]+=dp[i-1][j-1];
dp[i][j]+=dp[i-1][j];
for(int k=i-1;k>=1&&(j-(i-k)>=0);k--)
{
if(s[k]==s[i])
{
dp[i][j]-=dp[k-1][j-(i-k)];
break;
}
}
}
}
long long sum=0;
for(int i=0;i<=3;i++)
{
sum+=dp[n][i];
}
cout<<sum;
return 0;
}
L3-017 森森快递
L3-018 森森美图
L3-019 代码排版
L3-020 至多删三个字符
#include<bits/stdc++.h>
using namespace std;
int cnt=0;
long long dp[1000001][4];
int main()
{
string s;
cin>>s;
int n=s.length();
s='0'+s;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=3;j++)
{
if(j>0)
dp[i][j]+=dp[i-1][j-1];
dp[i][j]+=dp[i-1][j];
for(int k=i-1;k>=1&&(j-(i-k)>=0);k--)
{
if(s[k]==s[i])
{
dp[i][j]-=dp[k-1][j-(i-k)];
break;
}
}
}
}
long long sum=0;
for(int i=0;i<=3;i++)
{
sum+=dp[n][i];
}
cout<<sum;
return 0;
}
L3-021 神坛
L3-022 地铁一日游
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int vis[210];
int G[210][210];
int ed[210]={0};
vector<int>st[201];
void dfs(int u)
{
for(int i=0;i<st[u].size();i++)
{
if(vis[st[u][i]]==0)
{
vis[st[u][i]]=1;
dfs(st[u][i]);
}
}
}
int main()
{
int N,M,K;
memset(G,inf,sizeof(G));
cin>>N>>M>>K;
for(int i=1;i<=M;i++)
{
int a,b,w;
cin>>a;
ed[a]=1;
while(cin>>w>>b)
{
G[a][b]=min(G[a][b],w);
G[b][a]=min(G[b][a],w);
a=b;
if(getchar()=='\n') break;
}
ed[a]=1;
}
// cout<<"2";
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(i!=j)
G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
}
}
// cout<<"1";
for(int i=1;i<=N;i++)
{
unordered_map<int,int>cost_dis;
for(int j=1;j<=N;j++)
{
if(G[i][j]!=inf)
{
int cost=G[i][j]/K+2;
cost_dis[cost]=max(cost_dis[cost],G[i][j]);//这个花费能跑多远
}
}
for(int j=1;j<=N;j++)
{
if(G[i][j]==cost_dis[G[i][j]/K+2]||(G[i][j]!=inf&&ed[j]&&i!=j))
st[i].push_back(j);
}
}
// cout<<"3";
int p;
cin>>p;
while(p--)
{
int x;
cin>>x;
memset(vis,0,sizeof(vis));
vis[x]=1;
dfs(x);
set<int>ans;
for(int i=1;i<=N;i++)
{
if(vis[i])
ans.insert(i);
}
vector<int>res;
for(auto i : ans)
res.push_back(i);
for(int i=0;i<res.size();i++)
{
if(i==0)
cout<<res[i];
else cout<<" "<<res[i];
}
cout<<endl;
}
return 0;
}
L3-023 计算图
L3-024 Oriol和David
L3-025 那就别担心了
#include<bits/stdc++.h>
using namespace std;
vector<int>G[10000];
int dp[100000];
int cnt=0;
int ok=0;
int dfs(int u,int e)
{
if(u==e)
{
return 1;
}
int &ans=dp[u];
if(ans!=-1) return dp[u];
ans=0;
for(int i=0;i<G[u].size();i++)
{
ans+=dfs(G[u][i],e);
}
if(ans==0)
ok=1;
return ans;
}
int main()
{
memset(dp,-1,sizeof(dp));
int N,M;
cin>>N>>M;
while(M--)
{
int x,y;
cin>>x>>y;
G[x].push_back(y);
}
int x,y;
cin>>x>>y;
cout<<dfs(x,y)<<" ";
if(ok==1)
cout<<"No";
else cout<<"Yes";
// cout<<"Yes";
return 0;
}