A-天使果冻
链接:https://ac.nowcoder.com/acm/contest/11161/A
来源:牛客网
题意:一个数组包含n个数,求前i个数的次大值是多少(倘若最大值有两个,则次大值即为最大值)?
思路:使用两个变量,记录最大值、第二大值即可,在遍历过程中不断维护,代码中使用了dp[i]数组存下来了前i个第二大值的数值,此外当时还想到了一种做法,就是使用优先队列,下面贴上代码:
方法一:两个变量维持
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int main()
{
int n,q,x;
int deg[100006];
int dp[100006];
scanf("%d",&n);
int maxx=0;
int second_maxx;
for(int i=0;i<n;i++)
{
scanf("%d",°[i]);
}
maxx=deg[0];
second_maxx=0;
for(int i=1;i<n;i++)
{
if(deg[i]>=maxx)
{
second_maxx=maxx;
maxx=deg[i];
dp[i]=second_maxx;
//cout<<i<<"结果"<<dp[i]<<endl;
}else{
if(deg[i]>second_maxx){
second_maxx = deg[i];
dp[i]=second_maxx;
// cout<<i<<"结果"<<dp[i]<<endl;
}else{
dp[i]=second_maxx;
}
}
}
scanf("%d",&q);
while (q--)
{
scanf("%d",&x);
cout<<dp[x-1]<<endl;
}
system("pause");
return 0;
}
方法二:优先队列(优先队列一个拥有权值观念的queue,自动依照元素的权值排列,权值最高排在前面)
#include<bits/stdc++.h>
using namespace std;
priority_queue<int> q;
const int maxn = 1e6;
int a[maxn];
int ans[maxn];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
q.push(a[i]);
int tmp = q.top();
q.pop();
ans[i] = q.top();
q.push(tmp);
}
int q;
cin>>q;
while(q--)
{
int x;
cin>>x;
cout<<ans[x]<<endl;
}
return 0;
}
B-心跳调试
链接:https://ac.nowcoder.com/acm/contest/11161/B
来源:牛客网
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=1e6+5;
ll a[N];
ll sum[N];
ll poww(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)
{
res=res*a%mod;
}
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=n;i>=1;i--)
{
sum[i]=(sum[i+1]+a[i])%mod;
}
ll ans=1;
for(int i=2;i<=n;i++)
{
ans=ans*poww(sum[i],mod-2)%mod*a[i]%mod;
}
cout << (ans%mod+mod)%mod << endl;
}