西南科技大学 信息工程学院 院赛 部分题题解,持续更新.

【萌萌院赛之A】

【题目链接】点击打开链接

【题意】由于中文题目,就不说题意!

【解题思路】简单求根公式的应用!

【AC代码】

#include 
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 
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 
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=m){
                    continue;
                }else{
                    temp+=a[j]*b[i-j];
                }
            }
            ans[i]=temp;
        }
        int pos;
        for(int i=0; i


【萌萌哒院赛之K】

【题目链接】点击打开链接

【题意】中文题目。

【分析&解题思路】1000长度的字符串,暴力即可!要是长度更大,可以考虑kmp!

【AC代码之暴力】

#include 
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
#include
#include
#include
#include
 
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)
        {
            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 
#include 
#include 
#include 
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=0&&i=0&&jque;
    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

【萌萌哒院赛之G】

【题目链接】点击打开链接

【解题思路】贪心,虽然赛场上完全没想到!但是确实是贪心!

【PS】看到题解好蒙逼!

【AC代码】

#include 
#include 
#include 
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】后面的题还没搞定,持续更新。


你可能感兴趣的:(ACM/ICPC_SWUST,OJ)