ZZU暑期快乐集训

学长们又在vj上拉比赛了,菜鸡的我补一补学长们说的水题。QAQ

第十届山东省ACM省赛

A - Calandar

有点类似于2050的一道题,就是因为是以5为周期的,所以年数和月数都对于最后的结果没有影响,有可以想到定义的是一个月有30天,所以每个月的同一天的星期数是一样的,可以搞一个数组存下一个月所有的的天数对应的星期数,然后直接查询就可以了

# include <bits/stdc++.h>
using namespace std;

int m[40];
int main()
{
    int T;
    scanf("%d",&T);

    while(T--){
        int y1,y2,m1,m2,d1,d2;
        string s1;
        scanf("%d %d %d",&y1,&m1,&d1);
        cin>>s1;
        scanf("%d %d %d",&y2,&m2,&d2);

        int M;

        if(s1=="Monday") M=1;
        else if(s1=="Tuesday") M=2;
        else if(s1=="Wednesday") M=3;
        else if(s1=="Thursday") M=4;
        else if(s1=="Friday") M=0;

        int y=d1%5;
        for(int i=1;i<=30;i++){
            int y1=i%5;
            int c=(y1-y)%5;
            m[i]=(M+c+5)%5;
        }
        /*
        for(int i=1;i<=30;i++){
            printf("%d ",m[i]);
            if(i%5==0) printf("\n");
        }
        */
        if(m[d2]==1) printf("Monday\n");
        else if(m[d2]==2) printf("Tuesday\n");
        else if(m[d2]==3) printf("Wednesday\n");
        else if(m[d2]==4) printf("Thursday\n");
        else if(m[d2]==0) printf("Friday\n");

        for(int i=1;i<=30;i++) m[i]=0;
    }

    return 0;
}

F - Stones in the Bucket

j就是将石子移成每一瓶都一样就就可以了,可以想到,先求出平均数,然后用和比平均数大的求差就可以了,注意会爆int

# include <bits/stdc++.h>
using namespace std;

const int MAXN=1e5+100;
typedef long long LL;
LL a[MAXN];
int main()
{
    int T;
    scanf("%d",&T);

    while(T--){
        LL n;
        LL sum=0;
        LL cnt=0;
        LL ans=0;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            sum+=a[i];
        }
        if(n==1){
            printf("0\n");
        }else{
            cnt=sum/n;
            for(int i=1;i<=n;i++){
                if(a[i]>cnt){
                    ans+=(a[i]-cnt);
                }
            }
            printf("%lld\n",ans);
        }
    }

    return 0;
}

M - Sekiro

就是暴力模拟每一次,然后模拟就可以了,注意如果超过就要跳出来,然后对于向上取整和向下取整最好还是手动模拟,用奇偶分类就可以

# include <bits/stdc++.h>
using namespace std;

int  main()
{
    int T;
    scanf("%d",&T);

    while(T--){
        int n,k;
        scanf("%d %d",&n,&k);
        for(int i=1;i<=k;i++){
            if(i>=40) break;
            if(n%2){
                n=n+1;
                n=n/2;
            }else{
                n=n/2;
            }
        }
        printf("%d\n",n);
    }

    return 0;
}

第九届福建省大学生程序设计竞赛

A - Uint47 calculator

加法减法记得取余,因为乘法会爆ll,所以用快速乘就可以

#include <iostream>
#include <string>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const LL MODD=1LL<<47;
map<string,LL> MAP;
LL qmul(LL a,LL b,LL m)
{
    LL ans=0;
    LL k=a;

    LL f=1;
    if(k<0){ f=-1; k=-k; }
    if(b<0){ f*=-1; b=-b; }
    while(b){
        if(b&1) ans=(ans+k)%m;
        k=(k+k)%m;
        b>>=1;
    }
    return ans*f;
}
int main()
{
    string name;
    LL ans=0;
    while(cin>>name){
        string a,b;
        if(name=="def"){
            cin>>a;
            cin>>MAP[a];
        }else{
            cin>>a>>b;
            if(name=="add") MAP[a]=(MAP[a]+MAP[b])%MODD;
            if(name=="sub") MAP[a]=((MAP[a]-MAP[b])+MODD)%MODD;
            if(name=="mul") MAP[a]=qmul(MAP[a],MAP[b],MODD);
            if(name=="div") MAP[a]=MAP[a]/MAP[b];
            if(name=="mod") MAP[a]=MAP[a]%MAP[b];
        }
        cout<<a<<" = "<<MAP[a]<<endl;
    }

    return 0;
}

F - IoU

计算出相交的区域,一般就解决了

计算相交区域代码 (手动画个图就可以理解了,大概就是因为重复的那一段加了两次,然后减去总的长度就可以了)

    double x1,y1,x2,y2,x3,y3,x4,y4;
    double x[4],y[4];
    double s,l,h;
    while(cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4)
    {
        x[0]=x1;x[1]=x2;x[2]=x3;x[3]=x4;
        y[0]=y1;y[1]=y2;y[2]=y3;y[3]=y4;
        sort(x,x+4);
        sort(y,y+4);
        l=fabs(x2-x1)+fabs(x4-x3)-(x[3]-x[0]);
        h=fabs(y2-y1)+fabs(y4-y3)-(y[3]-y[0]);
        s=l*h;
        if(l<=0 || h<=0)s=0.00;
        printf("%.2f\n",s);

    }

AC代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        double x1,y1,w1,h1;
        double x2,y2,w2,h2;
        cin>>x1>>y1>>w1>>h1>>x2>>y2>>w2>>h2;
        double xa,ya,xb,yb,xc,yc,xd,yd;
        xa=x1,ya=y1,xb=x1+w1,yb=y1+h1,xc=x2,yc=y2,xd=x2+w2,yd=y2+h2;
        double x[4],y[4];
        double s1,s2,l,h;
        x[0]=xa;x[1]=xb;x[2]=xc;x[3]=xd;
        y[0]=ya;y[1]=yb;y[2]=yc;y[3]=yd;
        /*
        for(int i=0;i<4;i++){
            printf("%f %f\n",x[i],y[i]);
        }*/
        sort(x,x+4);
        sort(y,y+4);
        l=fabs(xb-xa)+fabs(xd-xc)-(x[3]-x[0]);
        h=fabs(yb-ya)+fabs(yd-yc)-(y[3]-y[0]);
        s1=l*h;
        if(l<=0.0 || h<=0.0)s1=0.00;
        s2=w1*h1+w2*h2-s1;
        double k;
        k=s1/s2;
        //printf("@@@ %f %f\n",s1,s2);
        printf("%.2f\n",k);

    }

    return 0;
}

posted @   fengzlj  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示