最初の質問
[タイトル]与えることを目的としているお父さんをbとして、<A、B>、今あなたがそれぞれの父親の息子のすべての出力、辞書順ソートの間の息子をオンにする必要があり、理解することができます
[思考]アイデアは数に父親の名前をマップするためのマップで、難しいことではない、その後、2次元ベクトル、対応する父親の背中に息子の一backを構築し、その後、出力を並べ替えることができます。
[ピット]は、実際にはほとんどのピットああを見つけるために、最後の3分の重複!それは父が何度も、その後、ベクトルは要素に繰り返されるBの発言である、あなたはエンファシスを解除する必要があり、もちろん、直接自動的に設定ライン上で再
[コード]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
const int maxn=1005;
const int INF=0x3f3f3f3f;
const ll mod=998244353;
int n;
int a[maxn];
string s,tmp;
map<string,int>mp;
vector<string>ans[maxn];
vector<string>vec;
set<string>S[maxn];
int main()
{
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
cin>>s>>tmp;
if(mp[tmp]==0) mp[tmp]=++cnt,vec.push_back(tmp);
S[mp[tmp]].insert(s);
}
for(int i=0;i<cnt;i++)
{
cout<<vec[i];
//sort(ans[i+1].begin(),ans[i+1].end());
//for(int j=0;j<ans[i+1].size();j++) cout<<" "<<ans[i+1][j];
set<string>::iterator it;
for(it=S[i+1].begin();it!=S[i+1].end();it++) cout<<" "<<*it;
puts("");
}
}
2番目の質問
明らかに貪欲に使用する、燃料補給の最小数を作ることなど[思考]は、すべての時間は、油が、現在のガソリンスタンドに到達するのに十分でない場合には、前述の説明は、単語を追加するために、オイルもう一度払う必要があり、最大の石油の前にガソリンスタンドに追加する必要がありますそのプライオリティキューと、それを維持するたびに最大値をポップアップ表示します
[コード]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
const int maxn=1005;
const int INF=0x3f3f3f3f;
const ll mod=998244353;
int n,d,w;
int a[maxn];
string s;
int dis[maxn];
int main()
{
scanf("%d%d",&d,&w);
getchar();
getline(cin,s);
int len=s.size();
int n=1,cnt=0;
for(int i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9') cnt=cnt*10+s[i]-'0';
else
{
dis[n++]=cnt;
cnt=0;
}
}
dis[n++]=cnt;
//printf("%d\n",n);
dis[0]=0;
dis[n+1]=d;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int ans=0;
priority_queue<int,vector<int>,less<int> >q;
for(int i=1;i<=n+1;i++)
{
if(w>=dis[i]) q.push(a[i]);
else
{
while(q.size())
{
int x=q.top();
w+=x;
ans++;
q.pop();
if(w>=dis[i])
{
q.push(a[i]);
break;
}
}
}
}
if(w>=d) printf("%d\n",ans);
else puts("-1");
}
3番目の質問
[思考]古典的な迷路、唯一のより多くのポータル、2つのポータル間を接続することができます何かを使用すること自由に感じ、その後、全体の検索をBFS、毎回プログラムは、周囲に行くためにポータルサイトです、そこには、ポータルの反対側に歩いています
しかし、それは87.5回出てきたいくつかの理由のために、長い時間のためのチェックがQAQをチェックアウトしませんでした
[PS]は裁判官VIS何のチャンネルがない場合ので、私は行く必要があり、dalaoは思い出してい...
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
const int maxn=205;
const int INF=0x3f3f3f3f;
const ll mod=998244353;
int n,m;
int mp[maxn][maxn];
int vis[maxn][maxn];
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
vector<pair<int,int> >vec[maxn*maxn];
map<int,int>kk;
struct node
{
int x,y,step;
}now,nex;
int bfs(int sx,int sy)
{
vis[sx][sy]=1;
queue<node>q;
q.push({sx,sy,0});
//printf("%d\n",mp[0][0]);
while(q.size())
{
now=q.front();
q.pop();
//printf("%d %d %d %d\n",now.x,now.y,now.step,mp[now.x][now.y]);
if(mp[now.x][now.y]==-3) return now.step;
if(mp[now.x][now.y]>0)
{
//puts("**");
int x=kk[mp[now.x][now.y]];
if(vec[x][0].first==now.x&&vec[x][0].second==now.y)
{
nex.x=vec[x][1].first;
nex.y=vec[x][1].second;
nex.step=now.step+1;
q.push(nex);
vis[nex.x][nex.y]=1;
}
else
{
nex.x=vec[x][0].first;
nex.y=vec[x][0].second;
nex.step=now.step+1;
q.push(nex);
vis[nex.x][nex.y]=1;
}
//printf("@@%d %d\n",nex.x,nex.y);
}
for(int i=0;i<4;i++)
{
nex.x=now.x+dir[i][0];
nex.y=now.y+dir[i][1];
nex.step=now.step+1;
if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&mp[nex.x][nex.y]!=-1&&vis[nex.x][nex.y]==0)
{
q.push(nex);
vis[nex.x][nex.y]=1;
}
}
}
return -1;
}
int main()
{
scanf("%d%d",&m,&n);
int sx,sy;
int cnt=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&mp[i][j]);
vis[i][j]=0;
if(mp[i][j]==-2) sx=i,sy=j;
if(mp[i][j]>0)
{
if(kk[mp[i][j]]==0) kk[mp[i][j]]=cnt++;
vec[kk[mp[i][j]]].push_back(make_pair(i,j));
}
}
}
//printf("%d %d\n",sx,sy);
printf("%d\n",bfs(sx,sy));
}
第四に質問
タイトルアイデアは、2つのエッジ点との間の関係の主題に直接接続された依存関係ツリーモデルDP(バックパック)を有することであるが、(粒子のツリー複数の分散)ダミー・ノードの導入をツリーを形成しなくてもよいです(点0の依存性は、偶数のようにこの点0とするとき)の根として、それが分散され、他方が木の根がツリーDPすることができる構成に接続され
DPとの[I] [j]はiがボトムアップおよび更新から、j番目のノードの最大値と、根において発現されます
最終的な答えは、DP [0] [M + 1]であります
[コード]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
const int maxn=205;
const int INF=0x3f3f3f3f;
const ll mod=998244353;
int n,m;
int val[maxn];
int dp[maxn][maxn];
vector<int>vec[maxn];
void dfs(int u)
{
for(int i=0;i<vec[u].size();i++)
{
int v=vec[u][i];
dfs(v);
for(int j=m-1;j>=0;j--)
for(int k=0;k<=j;k++)
{
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); //这里是还没算当前树根u,所以总和是m-1
}
}
for(int i=m;i>=1;i--) dp[u][i]=dp[u][i-1]+val[u];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d%d",&x,&val[i]);
vec[x].push_back(i);
}
m++;
mst(dp,0);
dfs(0);
printf("%d\n",dp[0][m]);
}