Full_of_Boys训练2总结

题目来源::西安电子科技大学第16届程序设计竞赛网络同步赛

A, B, C: easy problem

D. 另一个另一个简单题

做法是加起来,除n。希望会推导的聚聚指点。

#include <bits/stdc++.h>
const int inf =0x3f3f3f3f;
using namespace std;
int T;
int ans;
int main(){
    scanf("%d",&T);
    while(T--){int n;
        scanf("%d",&n);ans=0;
        for(int i=1;i<=n;++i){int x;
            scanf("%d",&x);
            ans+=x;
        }
        printf("%d
",ans/n);
    }
}

F. Operating System

贪心,每次替换掉该元素下一个出现的最远的元素。原题:BZOJ1826

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
typedef long long ll;
const int maxn = 70000+700;
using namespace std;
int n,m;
int a[maxn],pr[maxn],pos[maxn],in[maxn],cnt=0;
ll b[maxn],v[maxn];
struct node{
    int w;
    node(){}
    node(int x){w=x;}
    bool operator < (node a)const {
        return pos[a.w] > pos[w];
    }
};
priority_queue<node>q;
int main()
{
    int qq;
    while(scanf("%d%d%d",&n,&m,&qq)!=EOF){
        cnt=0;
        memset(in,0,sizeof(in));
        memset(pos,0,sizeof(pos));
        memset(pr,0,sizeof(pr));
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(v,0,sizeof(v));
        while(!q.empty())q.pop();

        for(int i=1;i<=qq;++i) scanf("%lld",&b[i]),v[cnt++]=(b[i]);
        sort(v,v+cnt);
        cnt = unique(v,v+cnt)-v;
        for(int i=1;i<=qq;++i){
            a[i]= lower_bound(v,v+cnt,b[i])-v+1;
        }
        for(int i=0;i<maxn;++i) pr[i]=qq+1;
        for(int i=qq;i>=1;--i){
            pos[i]=pr[a[i]];
            pr[a[i]]=i;
        }
        pos[qq+1]=qq+1;
        int ans=0,sz=0;
        for(int i=1;i<=qq;++i){
            if(in[a[i]]){
                q.push(node{i});
                continue;
            }
            if(sz==n){
                while(!q.empty()){
                    int u=q.top().w;q.pop();
                    if(in[a[u]]){
                        in[a[u]]=0;
                        break;
                    }
                }
            }
            else ++sz;
            in[a[i]]=1;
            ++ans;
            q.push(node{i});
        }
        printf("%d
",ans);
    }
    return 0;
}

E.Xieldy And His Password

dp[i][j]表示以i这一位为最高位,模3等于j的方法数。那么转移就是:t=(j*2+a[i])%3 ,dp[i][t] = dp[i-1][j]; 还有一个转移是只包含第i位的方案所以dp[a[i]]]++;

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
char s[1000007];
ll dp[1000007][3];
int main(){
    while(~scanf(" %s",s)) {int len=strlen(s);
        memset(dp,0,sizeof(dp));
        ++dp[0][s[0]-'0'];
        for(int i=1;i<len;++i){
            for(int j=0;j<3;++j){
                int t = (2*j%3+s[i]-'0')%3;
                dp[i][t]=dp[i-1][j];
            }
            ++dp[i][s[i]-'0'];
        }
        ll ans = 0;
        for(int i=0;i<len;++i)ans+=dp[i][0];
        printf("%lld
",ans);
    }
}

 J. Database

大模拟。。。仰慕zyc巨神的200+代码,不贴了

反思:完全没有罚时意识,自我放弃罚时。。。导致6题倒数。对于有明显确定思路的题,必须过手造数据,才能交。中文题感觉很良好,这题要是英文估计凉一半。对于没思路题的难度可以跟自己做出的其他相同他人数的题对比一下,确定是找规律还是推公式。dp状态确定极其不熟练,很简单的状态就是没思路,需要加强。但是,zyc码力惊人!!!orz

原文地址:https://www.cnblogs.com/RRRR-wys/p/8904593.html