这两天几个比赛都在一起,谁顶的住啊,打(签到)了6场,结果还有没有中奖,太真实了ヽ(`Д´)ノ︵ ┻━┻ ┻━┻
A-串串
https://ac.nowcoder.com/acm/contest/558/A
思路:除了暴力,没思路。。。
B-重复
https://ac.nowcoder.com/acm/contest/558/B
思路:签到,用map去重即可。。
#include
#include
C-二元
https://ac.nowcoder.com/acm/contest/558/C
思路:优先队列,遍历a_i的最小值,再从中找最大b_i.
先将(a_i,b_i)按照a_i由小到大排序,在将前k大a_i对应的b_i加入优先队列Q(小的先出队),这样遍历a_i时,将b_i加入队列Q,再出队列将最小的b_i淘汰,更新ans即可
Code:
#include
#include
#include
using namespace std;
typedef pair pr;
const int MAX_N=1e5+5;
int n,m;
pr a[MAX_N];
priority_queue,greater > Q;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=0;i>a[i].first>>a[i].second;
sort(a,a+n);
int r=n-1,M1,M2=a[n-1].second;
while(r>=0&&n-r<=m){
Q.push(a[r].second);
M1=a[r].first; M2=min(M2,a[r].second);
--r;
}
int ans=M1+M2;
while(r>=0){
Q.push(a[r].second); Q.pop();
ans=max(ans,a[r].first+Q.top());
--r;
}
cout<
D-寻找
不会-.-
E-区间
https://ac.nowcoder.com/acm/contest/558/E
链接:https://ac.nowcoder.com/acm/contest/558/E
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
小猫在研究序列。
小猫在研究单调性。
给定一个长度为N的序列a1,a2,…,aN,请你选出一个最长的区间[l,r](1≤l≤r≤N),满足al≤al+1≤…≤ar。
如果有多个,请输出l最小的。
第一行一个正整数T,表示数据组数。 每组数据的第一行一个正整数N。 接下来一行N个正整数a1,a2,…,aN。
T行,每行两个正整数l,r,表示选出的区间。
示例1
复制
4 5 1 2 3 4 5 5 5 4 3 2 1 5 5 3 4 1 2 5 3 4 5 1 2
复制
1 5 1 1 2 3 1 3
1≤T,N,ai≤1000
思路:按题目要求遍历一遍即可
Code:
#include
using namespace std;
typedef long long LL;
const int MAX_N=1e3+5;
int n,T;
int dp[MAX_N];
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
cin>>n;
int Max=0,Sum=1,p=n,pre=-1;
for(int i=1,x;i<=n;++i)
{
cin>>x;
if(pre!=-1){
if(x>=pre){
++Sum;
}else{
if(Sum>Max){
Max=Sum;
p=i-1;
}
Sum=1;
}
}
pre=x;
}
if(Max
F-点对
https://ac.nowcoder.com/acm/contest/558/F
思路:Flody..
Code :
#include
using namespace std;
typedef long long LL;
const int MAX_N=1e3+5;
int n,m;
int G[MAX_N][MAX_N];
void Flody();
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
int u,v;
for(int i=1;i<=m;++i)
{
cin>>u>>v;
G[u][v]=1;
}
Flody();
int ans=0;
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
if(G[i][j]&&G[j][i]) ++ans;
cout<
G-路径
https://ac.nowcoder.com/acm/contest/558/G
思路:树形dp,输入u,v,w的v我一直默认为根节点,结果坑了我无数遍,一直想不通哪里错了。。。
M1[u],M2[u]分别记录以u为树节点的边数分别为奇数和偶数的最大价值
ans=max{M1[u]+M2[v]+w,M2[u]+M1[v]+w};
Code:
#include
#include
using namespace std;
typedef long long LL;
typedef pair pr;
const int MAX_N=1e5+5;
int n;
LL ans;
LL M1[MAX_N],M2[MAX_N];
vector e[MAX_N];
void DFS(int u,int pre);
int main()
{
ios::sync_with_stdio(false);
cin>>n;
int u,v,w;
for(int i=1;i>u>>v>>w;
e[u].push_back({v,w});
e[v].push_back({u,w});
}
DFS(1,0);
cout<
H-分离
https://ac.nowcoder.com/acm/contest/558/H
思路:签到题。
Code:
#include
#include
I-选择
https://ac.nowcoder.com/acm/contest/558/I
思路:简单DP,对当前x有选和不选则,很明显dp[i]=max(dp[i-1],dp[i-2]+x);
Code:
#include
#include
using namespace std;
const int MAX_N=105;
int n,T;
int dp[MAX_N];
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
memset(dp,0,sizeof(dp));
cin>>n;
for(int i=2,x;i<=n+1;++i)
{
cin>>x;
dp[i]=max(dp[i-1],dp[i-2]+x);
}
cout<
J-相聚
https://ac.nowcoder.com/acm/contest/558/J
思路:基础的DFS
Code:
#include
#include
using namespace std;
typedef long long LL;
const int MAX_N=1e2+5;
const int MAX_M=1e2+5;
const int f[][2]={-1,0, 1,0, 0,-1, 0,1};
int n,m,T;
char G[MAX_N][MAX_M];
int boo[MAX_N][MAX_M];
void DFS(int x,int y);
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
memset(boo,0,sizeof(boo));
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>G[i][j];
int ans=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(G[i][j]=='1'&&!boo[i][j]){
DFS(i,j); ++ans;
}
cout<=1&&xi<=n&&yi>=1&&yi<=m&&G[xi][yi]=='1'&&!boo[xi][yi]){
boo[xi][yi]=true;
DFS(xi,yi);
}
}
}