桂林電子科学技術大学第3回ACMプログラム設計コンテスト部分題解(i,j,c)
3421 ワード
i題リンク:https://ac.nowcoder.com/acm/contest/558/I出典:牛客網
子猫が序列を研究している.子猫は選択を研究している.長さNのシーケンスa 1,a 2,...,aNを与えて、このNの要素の中からいくつか(選択しなくてもよい、選択しなくてもよい)を選んでください.任意の1≦iの典型的なdp問題に対する制限の条件は、選択時に隣接する2つの数を選択できないことです.dp【i】を現在のi番目のシーケンス列の最大値とすると、a[i]に対して2つの状態選択または選択しないことになります.
dp[i]=max(dp[i-2]+a[i],dp[i-1])/選んだらdp[i-2]しか継承できない、選ばないならdp[i-1]
コードは以下の通りです.
j題リンク:https://ac.nowcoder.com/acm/contest/558/J出典:牛客網
子猫がグリッド図を研究しています.子猫は連通性を研究している.Nを1枚与える×Mのグリッド図は、文字0と1しか含まれていません.1で形成されたインターフェースブロックはいくつありますか.2つの1は連通しており、そのうちの1つが別の上、下、左、右の4つの方向の1つに位置し、1つの点bfsに対してこの点が1であれば、その点bfsに隣接する点に対して再アクセスがマークされている場合、1とマークされている点が他の連通ブロックで異なる場合、アクセスコードは以下の通りである.
cリンク:https://ac.nowcoder.com/acm/contest/558/C出典:牛客網
子猫は二元グループを研究している.子猫は最大値を研究している.N個の二元群(a 1,b 1),(a 2,b 2),...,(aN,bN)を与えて、aiの最小値とbiの最小値の和が最大になるように適切なK個を選択してください.aiの最小値とbiの最小値の和を出力してくださいaに対して先にソートしてから優先キューの中の小根スタックメンテナンスbでk個の出入りキューごとに最小値をメンテナンスする最大値コードは以下の通りです.
子猫が序列を研究している.子猫は選択を研究している.長さNのシーケンスa 1,a 2,...,aNを与えて、このNの要素の中からいくつか(選択しなくてもよい、選択しなくてもよい)を選んでください.任意の1≦iの典型的なdp問題に対する制限の条件は、選択時に隣接する2つの数を選択できないことです.dp【i】を現在のi番目のシーケンス列の最大値とすると、a[i]に対して2つの状態選択または選択しないことになります.
dp[i]=max(dp[i-2]+a[i],dp[i-1])/選んだらdp[i-2]しか継承できない、選ばないならdp[i-1]
コードは以下の通りです.
#include
using namespace std;
const int maxn = 200;
int dp[maxn];
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>a[i];
}
dp[0] = a[0];
dp[1] = max(a[0],a[1]);//
for(int i = 2; i < n; i++)
{
dp[i] = max(dp[i-2]+a[i],dp[i-1]);
}
cout<
j題リンク:https://ac.nowcoder.com/acm/contest/558/J出典:牛客網
子猫がグリッド図を研究しています.子猫は連通性を研究している.Nを1枚与える×Mのグリッド図は、文字0と1しか含まれていません.1で形成されたインターフェースブロックはいくつありますか.2つの1は連通しており、そのうちの1つが別の上、下、左、右の4つの方向の1つに位置し、1つの点bfsに対してこの点が1であれば、その点bfsに隣接する点に対して再アクセスがマークされている場合、1とマークされている点が他の連通ブロックで異なる場合、アクセスコードは以下の通りである.
#include//
using namespace std;
const int maxn = 100;
int n,m;
int x[4] = {0,0,1,-1};
int y[4] = {1,-1,0,0};
char mp[maxn][maxn];
int vis[maxn][maxn];
void bfs(int x1,int y1)
{
for(int i = 0; i < 4; i++)//
{
if(x1+x[i]=0&&y1+y[i]=0&&vis[x1+x[i]][y1+y[i]]==0&&mp[x1+x[i]][y1+y[i]]=='1')
{
vis[x1+x[i]][y1+y[i]] = 1;
//cout<>t;
while(t--)
{
int sum = 0;
cin>>n>>m;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cin>>mp[i][j];
vis[i][j] = 0;
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(mp[i][j]=='1'&&vis[i][j]==0)
{
sum++;
bfs(i,j);
}
}
}
cout<
cリンク:https://ac.nowcoder.com/acm/contest/558/C出典:牛客網
子猫は二元グループを研究している.子猫は最大値を研究している.N個の二元群(a 1,b 1),(a 2,b 2),...,(aN,bN)を与えて、aiの最小値とbiの最小値の和が最大になるように適切なK個を選択してください.aiの最小値とbiの最小値の和を出力してくださいaに対して先にソートしてから優先キューの中の小根スタックメンテナンスbでk個の出入りキューごとに最小値をメンテナンスする最大値コードは以下の通りです.
#include//
#include
#include
using namespace std;
const int maxn = 100000+10;
typedef long long ll;
struct node{
ll a;
ll b;
}num[maxn];// a
bool cmp(node x, node y)
{
return x.a>y.a;
}
priority_queue, greater > q; //
int main()
{
int n,k;
cin>>n>>k;
for(int i = 0; i < n; i++)
cin>>num[i].a>>num[i].b;
sort(num,num+n,cmp);
for(int i = 0; i < k; i++)
{
q.push(num[i].b);
}
ll ans = num[k-1].a+q.top();
for(int i = k; i < n; i++)
{
q.pop();
q.push(num[i].b);
if(num[i].a+q.top()>ans)// i b a b
ans = num[i].a+q.top();
}
cout<