【萌萌院赛之A】
【题目链接】点击打开链接
【题意】由于中文题目,就不说题意!
【解题思路】简单求根公式的应用!
【AC代码】
#include <bits/stdc++.h>
typedef long long LL;
const int N=10010;
const int M=10010;
const LL MOD=1e9+7;
int main(){
double x,v,a;
while(~scanf("%lf%lf%lf",&x,&v,&a)){
double t1=((-v)+sqrt(v*v-2*a*(-x)))/a;
double t2=((-v)-sqrt(v*v-2*a*(-x)))/a;
if(t1>0.0000000) printf("%.5f\n",t1);
if(t2>0.0000000) printf("%.5f\n",t2);
}
return 0;
}
【萌萌哒院赛之C】
【题目链接】点击打开链接
【解题思路】对于(L,R)里面的任意一个i,每次更新之后,值都会变成 a+(i-l+1)*d==i*d+(a+d-l*d);用线段树维护d和(a+d-l*d)就行了。
【AC代码---线段树版本】很清晰,简单区段更新。
#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
#define ll long long
const ll INF=0x7f7f7f7f7f7f;
struct node{
ll l,r;
ll d,sum,lazy;
}Tree[maxn*4];
void pushdown(ll rt)
{
Tree[rt*2].d+=Tree[rt].d,Tree[rt*2+1].d+=Tree[rt].d;
Tree[rt*2].sum+=Tree[rt].sum,Tree[rt*2+1].sum+=Tree[rt].sum;
Tree[rt*2].lazy=Tree[rt*2+1].lazy=1;
Tree[rt].lazy=Tree[rt].d=Tree[rt].sum=0;
}
void Build(ll l,ll r,ll rt){
Tree[rt].l=l,Tree[rt].r=r,Tree[rt].lazy=0,Tree[rt].d=0,Tree[rt].sum=0;
if(l==r){return;}
ll m=(l+r)/2;
Build(l,m,rt*2);
Build(m+1,r,rt*2+1);
}
void update(ll rt,ll l,ll r,ll d,ll val)
{
if(l<=Tree[rt].l&&Tree[rt].r<=r)
{
Tree[rt].d+=d;
Tree[rt].sum+=val;
Tree[rt].lazy=1;
return ;
}
ll mid=(Tree[rt].l+Tree[rt].r)/2;
if(Tree[rt].lazy) pushdown(rt);
if(r<=mid) update(rt*2,l,r,d,val);
else if(l>mid) update(rt*2+1,l,r,d,val);
else
{
update(rt*2,l,r,d,val);
update(rt*2+1,l,r,d,val);
}
}
node queryans(ll rt,ll x)
{
if(Tree[rt].l==Tree[rt].r)
{
return Tree[rt];
}
ll mid=(Tree[rt].l+Tree[rt].r)/2;
if(Tree[rt].lazy) pushdown(rt);
if(x<=mid) return queryans(rt*2,x);
else return queryans(rt*2+1,x);
}
int main(){
ll n,m;
scanf("%lld%lld",&n,&m);
Build(1,n,1);
//puts("Build successful!");
while(m--)
{
ll l,r,a,d;
scanf("%lld%lld%lld%lld",&l,&r,&a,&d);
ll val=a+d-l*d;
update(1,l,r,d,val);
}
ll ans=-INF,id;
for(ll i=1; i<=n; i++)
{
node curans=queryans(1,i);
ll temp=curans.sum+curans.d*i;
if(temp>ans)
{
ans=temp;
id=i;
}
}
printf("%lld %lld\n",id,ans);
return 0;
}
【萌萌哒院赛之D】
【题目链接】点击打开链接
【分析&解题思路】水题,模拟即可!
【AC代码】
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=10010;
const int M=10010;
const LL MOD=1e9+7;
int n,m;
int a[1100],b[1100];
int ans[1100];
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=0; i<n; i++) scanf("%d",&a[i]);
for(int i=0; i<m; i++) scanf("%d",&b[i]);
memset(ans,0,sizeof(ans));
for(int i=0; i<n+m+1; i++){
int temp=0;
for(int j=0; j<n; j++){
if((i-j)<0||(i-j)>=m){
continue;
}else{
temp+=a[j]*b[i-j];
}
}
ans[i]=temp;
}
int pos;
for(int i=0; i<n+m+1; i++){
if(ans[i]!=0) pos=i;
}
for(int i=0; i<n+m+1; i++){
if(i == pos)
{
printf("%d\n",ans[i]);
break;
}
if(ans[i]!=0)printf("%d ",ans[i]);
}
// printf("\n");
}
return 0;
}
【萌萌哒院赛之K】
【题目链接】点击打开链接
【题意】中文题目。
【分析&解题思路】1000长度的字符串,暴力即可!要是长度更大,可以考虑kmp!
【AC代码之暴力】
#include <bits/stdc++.h>
typedef long long LL;
const int N=10010;
const int M=10010;
const LL MOD=1e9+7;
char s1[10100],s2[10010];
int main()
{
gets(s1);
gets(s2);
int le1=strlen(s1);
int le2=strlen(s2);
int cnt = 0;
for(int i=0; i<=le1-le2; i++)
{
if(s1[i] == s2[0])
{
int flag = 0;
for(int j = 0; j < le2; j++)
{
if(s1[i+j] != s2[j])
{
flag = 1;
break;
}
}
if(!flag)
{
cnt++;
}
}
}
printf("%d\n",cnt);
return 0;
}
【AC代码之KMP】
#include<iostream>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<string.h>
using namespace std;
#define LL long long
void kmp_pre(char x[],int m,int Next[])
{
int i,j;
j=Next[0]=-1;
i=0;
while(i<m)
{
while(-1!=j && x[i]!=x[j])
j=Next[j];
Next[++i]=++j;
}
}
void preKMP(char x[],int m,int kmpNext[])
{
int i,j;
j=kmpNext[0]=-1;
i=0;
while(i<m)
{
while(-1!=j && x[i]!=x[j])
j=kmpNext[j];
if(x[++i]==x[++j])
kmpNext[i]=kmpNext[j];
else
kmpNext[i]=j;
}
}
int Next[10010];
int KMP_Count(char x[],int m,char y[],int n)
{
int i,j;
int ans=0;
kmp_pre(x,m,Next);
i=j=0;
while(i<n)
{
while(-1!=j && y[i]!=x[j])
j=Next[j];
i++;
j++;
if(j>=m)
{
ans++;
j=Next[j];
}
}
return ans;
}
char s1[1005],s2[1005];
int main()
{
while(gets(s1))
{
gets(s2);
printf("%d\n",KMP_Count(s2,strlen(s2),s1,strlen(s1)));
}
return 0;
}
【萌萌哒院赛之F】
【题目链接】点击打开链接
【解题思路】BFS+状态机优化转移
根据给出的目标字符串,构建一个和AC自动机类似的状态机,状态机的最后一位只会转移到他本身。当然,用KMP构造这个状态机也可以。
用dis[x][y][s]表示走到坐标为(x,y)的格子,并且在状态机的s状态所需的最少步数。对于这个状态,BFS周围四个方向,得到新的状态。
最后dis[n][m][len]就是答案。
【AC代码】
#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ll long long
const int nn=110;
int dp[nn][nn][nn];
char maze[nn][nn];
char ss[nn];
int n,m,k;
struct node{
int x,y,d;
node(){}
node(int x,int y,int d):x(x),y(y),d(d){}
// bool operator<(const node &rhs) const{
// return d<r
// }
};
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool ok(int i,int j){
if(i>=0&&i<n&&j>=0&&j<m) return true;
return false;
}
int bfs(){
queue<node>que;
dp[0][0][0]=0;
que.push(node(0,0,0));
if(ss[0]==maze[0][0]){
dp[0][0][1]=0;
que.push(node(0,0,1));
}
while(!que.empty()){
node now=que.front();
que.pop();
for(int i=0; i<4; i++){
int dx=now.x+dir[i][0];
int dy=now.y+dir[i][1];
if(ok(dx,dy)&&maze[dx][dy]!='#'){
if(now.d==0&&dp[dx][dy][0]==-1){
dp[dx][dy][0]=dp[now.x][now.y][0]+1;
que.push(node(dx,dy,0));
}
if(ss[now.d]==maze[dx][dy]&&dp[dx][dy][now.d+1]==-1){
dp[dx][dy][now.d+1]=dp[now.x][now.y][now.d]+1;
que.push(node(dx,dy,now.d+1));
}
if(now.d==k&&dp[dx][dy][now.d]==-1){
dp[dx][dy][now.d]=dp[now.x][now.y][now.d]+1;
que.push(node(dx,dy,now.d));
}
}
}
}
return dp[n-1][m-1][k];
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=0; i<n; i++) scanf("%s",maze[i]);
//puts("233");
scanf("%s",ss);
memset(dp,-1,sizeof(dp));
if(maze[0][0]=='#'||maze[n-1][m-1]=='#'){
puts("-1");
return 0;
}
int ans=bfs();
printf("%d\n",ans);
return 0;
}
【萌萌哒院赛之G】
【题目链接】点击打开链接
【解题思路】贪心,虽然赛场上完全没想到!但是确实是贪心!
【PS】看到题解好蒙逼!
【AC代码】
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ll long long
const int maxn = 1000010;
ll a[maxn];
int n;
int main()
{
while(~scanf("%d",&n))
{
ll ans=0;
for(int i=1; i<=n; i++) scanf("%lld",&a[i]);
if(n==1)
{
printf("0\n");
continue;
}
for(int i=1; i<=n; i++)
{
if(i==1){
if(a[i]>=a[i+1]) ans+=a[i];
}
else if(i==n){
if(a[i]>a[i-1]) ans+=a[i];
}
else
{
if(a[i]>a[i-1]) ans+=a[i];
if(a[i]>=a[i+1]) ans+=a[i];
}
}
printf("%lld\n",ans);
}
return 0;
}
【PS】后面的题还没搞定,持续更新。