zoukankan      html  css  js  c++  java
  • 2014浙大校赛

    ZOJ 3767 Elevator

    求和,签到题

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    #define pb(a) push(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    int main()
    {
        int n,m;
        int t;
        scanf("%d",&t);
        for(int ca=1;ca<=t;ca++)
        {
            scanf("%d%d",&n,&m);
            int res=0;
            for(int i=0;i<n;i++)
            {
                int x;scanf("%d",&x);
                res+=x;
            }
            printf("%s
    ",res<=m?"Safe":"Warning");
        }
        return 0;
    }
    View Code

    ZOJ 3775 ?(>_o)!

    题意中一大堆无用信息,其实就是判断源码和输出是否一样。简单字符串处理,string很方便

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    #define pb(a) push(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    int main()
    {
        int t;
        cin>>t;
        getchar();
        for(int ca=1;ca<=t;ca++)
        {
            string s1;
            getline(cin,s1);
            string s2;
            for(int i=0;i<s1.length();i++)
            {
                if(s1[i]=='_')
                    s2+=s1;
                if(s1[i]=='!')
                    s2+="Hello, world!";
            }
           // cout<<s1<<endl<<s2<<endl;
            cout<<(s1==s2?"Yes":"No")<<endl;
        }
        return 0;
    }
    View Code

    ZOJ 3770 Ranking System

    按比例分等级,排序

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    #define pb(a) push(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    struct number
    {
        int id;
        string date;
        int score;
        int order;
        int lv;
        bool operator < (const number &ant) const
        {
            if(score!=ant.score)return score>ant.score;
            else if(date!=ant.date) return date<ant.date;
            else return id<ant.id;
        }
    }da[2005];
    
    bool cmp(const number &a,const number &b)
    {
        return a.order<b.order;
    }
    int main()
    {
        int t;
        cin>>t;
        for(int ca=1;ca<=t;ca++)
        {
            int n;cin>>n;
            for(int i=0;i<n;i++)
            {
                cin>>da[i].id>>da[i].date>>da[i].score;
                da[i].order=i;
            }
    
            sort(da,da+n);
            int num=0;
            while(num<n&&da[num].score>0)num++;
    
            int pre=0;
            int x=(int)(num*0.03);
            for(int i=pre;i<pre+x;i++)
                da[i].lv=6;
            pre=pre+x;
    
            x=(int)(num*0.07);
            for(int i=pre;i<pre+x;i++)
                da[i].lv=5;
            pre=pre+x;
    
            x=(int)(num*0.2);
            for(int i=pre;i<pre+x;i++)
                da[i].lv=4;
            pre=pre+x;
    
            x=(int)(num*0.3);
            for(int i=pre;i<pre+x;i++)
                da[i].lv=3;
            pre=pre+x;
    
            for(;pre<n&&da[pre].score>0;pre++)
                da[pre].lv=2;
    
            for(;pre<n;pre++)
                da[pre].lv=1;
    
            sort(da,da+n,cmp);
            for(int i=0;i<n;i++)
                printf("LV%d
    ",da[i].lv);
        }
        return 0;
    }
    View Code

    ZOJ 3768 Continuous Login

     将n分解为尽量少个前缀和,搜索,暴力出奇迹,我用的是迭代加深

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    #define pb(a) push(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    const int maxn=40000;
    int f[maxn];
    int ans[maxn];
    
    int cal(int n)
    {
        int k=(int)(sqrt(n*2)+1);
        while(f[k]>n)k--;
        return k;
    }
    
    int dfs(int d,int n,int k)
    {
        if(k==1)
        {
            ans[k]=cal(n);
            if(n==f[cal(n)])return true;
        }else
        {
            for(int x=min(d,cal(n));x>=1;x--)
            {
                ans[k]=x;
                if(dfs(x,n-f[x],k-1))return true;
            }
        }
        return 0;
    }
    int main()
    {
        for(int i=1;i<maxn;i++)
            f[i]=i*(i+1)/2;
        int t;
        scanf("%d",&t);
        for(int ca=1;ca<=t;ca++)
        {
            int n;
            scanf("%d",&n);
    
            int res;
            for(int i=1;;i++)
            {
                if(dfs(cal(n),n,i))
                {
                    res=i;break;
                }
            }
            for(int i=1;i<=res;i++)
                printf("%d%c",ans[i],i==res?'
    ':' ');
        }
        return 0;
    }
    View Code

    ZOJ 3772 Calculate the Function

    做法1:线段树维护区间矩阵乘积,注意是左乘还是右乘

    做法2:预处理出全部前缀矩阵乘积和全部前缀逆矩阵乘积(就跟区间和sum(b)-sum(a-1)一样)

    线段树:

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    #define pb(a) push(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    const int mod=1000000007;
    
    struct Matrix
    {
        ll a[2][2];
        Matrix(){memset(a,0,sizeof(a));}
        void set(ll A)
        {
            a[0][0]=a[1][0]=1;
            a[0][1]=A;
            a[1][1]=0;
        }
        void setI()
        {
            a[0][0]=a[1][1]=1;
            a[0][1]=a[1][0]=0;
        }
    };
    Matrix operator * (const Matrix &a,const Matrix &b)
    {
        Matrix res;
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
                for(int k=0;k<2;k++)
                    res.a[i][j]=(res.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
        return res;
    }
    
    const int  maxn=100005;
    ll A[maxn];
    Matrix v[maxn<<2];
    void PushUp(int idx)
    {
        v[idx]=v[idx<<1|1]*v[idx<<1];
    }
    void build(int idx,int l,int r)
    {
        if(l==r)
        {
            v[idx].set(A[r]);
        }else
        {
            int mid=(r+l)>>1;
            build(lson); build(rson);
            PushUp(idx);
        }
    }
    Matrix query(int idx,int l,int r,int tl,int tr)
    {
        if(tl<=l&&tr>=r)
            return v[idx];
        Matrix res;
        res.setI();
        int mid=(r+l)>>1;
        if(tl<=mid) res=res*query(lson,tl,tr);
        if(tr>mid)  res=query(rson,tl,tr)*res;
        return res;
    }
    ll cal(const Matrix &x,int a,int b)
    {
        return (x.a[0][0]*a+x.a[0][1]*b)%mod;
    }
    int main()
    {
        int t; scanf("%d",&t);
        for(int ca=1;ca<=t;ca++)
        {
            int n,q; scanf("%d%d",&n,&q);
            for(int i=1;i<=n;i++) scanf("%lld",&A[i]);
            build(1,1,n);
    
            for(int Q=1;Q<=q;Q++)
            {
                int l,r; scanf("%d%d",&l,&r);
                ll res=0;
                if(r-l<2) res=A[r];
                else
                {
                    Matrix x=query(1,1,n,l+2,r);
                    res=cal(x,A[l+1],A[l]);
                }
                printf("%lld
    ",res);
            }
        }
        return 0;
    }
    View Code

    ZOJ 3769 Diablo III

    背包,先把特殊的装备处理了,把任意一对Finger当成一件装备还有把Weapon 和Shield 的任意组合当成Two-Handed

    然后就是普通的背包了,dp[i][j]表示装备前i类装备防御力为j的最大攻击力(j>=m的情况都当成是m)

    需要优化:把攻击力和防御力都低的舍掉。

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    #define pb(a) push(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    struct attri
    {
        int a,b;
    };
    map<string,int> id;
    int ecnt;
    int ID(string s)
    {
        if(id.find(s)==id.end())
            id[s]=++ecnt;
        return id[s];
    }
    
    vector<attri> da[15];
    void deal()
    {
        //combine weapon and shield
        int a=ID(string("Weapon"));
        da[a].push_back((attri){0,0});
    
        int b=ID(string("Shield"));
        da[b].push_back((attri){0,0});
    
        int c=ID(string("Two-Handed"));
        for(int i=0;i<da[a].size();i++)
            for(int j=0;j<da[b].size();j++)
                da[c].push_back((attri){
                                da[a][i].a+da[b][j].a,
                                da[a][i].b+da[b][j].b
                                });
        da[a].clear();
        da[b].clear();
    
        //combine two finger
        int d=ID(string("Finger"));
        da[d].push_back((attri){0,0});
    
        vector<attri> buf;
        for(int i=0;i<da[d].size();i++)
            for(int j=i+1;j<da[d].size();j++)
                buf.push_back((attri){
                              da[d][i].a+da[d][j].a,
                              da[d][i].b+da[d][j].b});
        da[d]=buf;
        for(int i=1;i<=13;i++)
            da[i].push_back((attri){0,0});
    }
    
    
    int dp[15][50005];
    
    int main()
    {
        std::ios::sync_with_stdio(false);
        int t;
        cin>>t;
        for(int ca=1;ca<=t;ca++)
        {
            int n,m;
            cin>>n>>m;
            ecnt=0;
            id.clear();
            for(int i=1;i<=13;i++)
                da[i].clear();
    
            for(int i=1;i<=n;i++)
            {
                string s;
                int a,b;
                cin>>s>>a>>b;
    
                int id=ID(s);
    
                da[id].push_back((attri){a,b});
            }
    
            deal();
    
            memset(dp,-1,sizeof(dp));
            dp[0][0]=0;
    //        for(int i=1;i<=13;i++)
    //        {
    //            cout<<"ID:"<<i<<endl;
    //            for(int j=0;j<da[i].size();j++)
    //                cout<<da[i][j].a<<' '<<da[i][j].b<<endl;
    //
    //        }
            for(int i=1;i<=13;i++)
            {
                int maxa=0,maxb=0;
                for(int j=0;j<da[i].size();j++)
                {
                    if(da[i][j].a<maxa&&da[i][j].b<maxb)continue;
                    if(da[i][j].a>maxa&&da[i][j].b>maxb)
                    {
                        maxa=da[i][j].a;maxb=da[i][j].b;
                    }
                    for(int d=0;d<=m;d++)if(dp[i-1][d]!=-1)
                    {
                        int b=d+da[i][j].b;
                        if(b>=m)b=m;
                        dp[i][b]=max(dp[i][b],dp[i-1][d]+da[i][j].a);
                    }
                }
            }
    
            cout<<dp[13][m]<<endl;
        }
        return 0;
    }
    View Code

     目前会做的只有这6题了。。

  • 相关阅读:
    下载并使用ASP.NET MVC v1.0 Futures
    关于DataGridView的数据源两个值得注意的小问题
    C++网络编程(二)客户端服务器程序
    C++多态、继承的简单分析
    XML文件解析器TXml
    数组
    CTS类型系统
    光阴不会虚度
    软件的大规模生产
    微创新和山寨的关系
  • 原文地址:https://www.cnblogs.com/BMan/p/3649859.html
Copyright © 2011-2022 走看看