Light OJ Basic Math

题目:Basic Math

一共19道题

其中8道:1008 1010 1116 1214 1214 1311 1354 1414 已经在Beginners Problems做过了,详见Light OJ Beginners Problems

剩下的11道,除却A Question of Time这道之外,另外10道已解决:

1020 A Childhood Game

简单博弈

// 博弈 每次和对手拿的石子和为3
// 对3取余之外的再讨论
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    for(int cases=1;cases<=t;cases++)
    {
        string s;
        int n;
        scanf("%d",&n);
        cin>>s;
        int tag;
        if(s=="Alice")
            tag=1;
        else
            tag=0;
        printf("Case %d: ",cases);
        if(tag) // last lose  Alice first
        {
            n--;
            if(n%3==0)
                printf("Bob\n");
            else
                printf("Alice\n");
        }
        else // last win Bob first
        {
            if(n%3==0)
                printf("Alice\n");
            else
                printf("Bob\n");
        }
    }
    return 0;
}


1078 Integer Divisibility

// 只需要记录模n范围内能否整除
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        int n,a,ans=0,cnt=1;
        scanf("%d%d",&n,&a);
        ans+=a;
        while(ans%n!=0)
        {
            cnt++;
            ans*=10;
            ans+=a;
            ans%=n;
        }
        printf("Case %d: %d\n",i,cnt);
    }
    return 0;
}

// 开始的时候sb了,写了这么个鬼代码TLE
/*
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
bool is_ok(vector<long long>a,int b)
{
    for(int i=a.size()-1;i>=0;i--)
    {
        long long cnt=(a[i]%b)*10;
        if(cnt!=0&&i==0)
            return false;
        if(i!=0)
            a[i-1]+=cnt;
    }
    return true;
}
void solve()
{
    int b,num;
    scanf("%d%d",&b,&num);
    vector<long long>a;
    a.push_back(num);
    while(!is_ok(a,b))
        a.push_back(num);
    printf("%d\n",a.size());
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int ii=1;ii<=t;ii++)
    {
        printf("Case %d: ",ii);
        solve();
    }
    return 0;
}
*/


1148  Mad Counting

考察map

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
map<int,int>m;
int main()
{
    int t,a;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        int n;
        scanf("%d",&n);
        m.clear();
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&a);
            m[a]++;
        }
        map<int,int>::iterator it;
        int ans=0;
        for(it=m.begin();it!=m.end();it++)
        {
            ans+=(it->first+it->second)/(it->first+1)*(it->first+1);
        }
        printf("Case %d: %d\n",i,ans);
    }
    return 0;
}


1179 Josephus Problem

约瑟夫经典问题

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
int josephus(int n,int m)
{
    if(n==2)
        return (m%2)?2:1;
    int v=(m+josephus(n-1,m))%n;
    if(v==0)
        v=n;
    return v;
}
int solve(int n,int m)
{
    if(m==1)
        return n;
    if(n==1)
        return 1;
    if(m>=n)
        return josephus(n,m);
    int l=(n/m)*m;
    int j=josephus((n-(n/m)),m);
    if(j<=n-1)
        return l+j;
    j-=n-1;
    int t=(j/(m-1))*m;
    if((j%(m-1))==0)
        return t-1;
    return t+(j%(m-1));
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        int m,n;
        scanf("%d%d",&n,&m);
        printf("Case %d: %d\n",i,solve(n,m));
    }
    return 0;
}


1275 Internet Service Providers

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        int n,c;
        scanf("%d%d",&n,&c);
        printf("Case %d: ",i);
        // t*c-n*t^2
        // n=0  t=1;
        // -n*(t^2-(c/n)*t+...)+...
        if(n==0)
            printf("0\n");
        else
        {
            int a=c/(2*n);
            if(a*2*n<=c)
            {
                int b=a+1;
                if(b*c-n*b*b>a*c-n*a*a)
                    a=b;
            }
            else
            {
                int b=a-1;
                if(b*c-n*b*b>a*c-n*a*a)
                    a=b;
            }
            printf("%d\n",a);
        }
    }
    return 0;
}


1297 Largest Box

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        double w,l;
        scanf("%lf%lf",&w,&l);
        double x=w*w+l*l-w*l;
        x=sqrt(x);
        double y=w+l;
        double ans=(y-x)/6.0;
        ans=(w-2*ans)*(l-2*ans)*ans;
        printf("Case %d: %lf\n",i,ans);
    }
    return 0;
}


1323 Billiard Balls

//根据题图提示,每次碰撞之后可以看做是两球或多球互相交换
//实质上最终球的坐标与交换过程无关,仅考虑1000个球各自与桌壁的碰撞即可
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int l,w,n,tt;
struct dir
{
    int x,y;
};
dir d[8];
struct Ball
{
    dir dd;
    int x,y;
};
Ball ball[1001];
void init_direction()
{
    d[0].x=1,d[0].y=0;
    d[1].x=1,d[1].y=1;
    d[2].x=0,d[2].y=1;
    d[3].x=-1,d[3].y=1;
    d[4].x=-1,d[4].y=0;
    d[5].x=-1,d[5].y=-1;
    d[6].x=0,d[6].y=-1;
    d[7].x=1,d[7].y=-1;
}
void bounce(Ball &bb)
{
    int dx,dy;
    dx=tt%(2*l);
    dy=tt%(2*w);
    if(bb.dd.x==1&&bb.dd.y==1)// NE
    {
        if(dx<l-bb.x)
            bb.x+=dx;
        else if(dx<2*l-bb.x)
        {
            bb.x+=dx;
            bb.x=2*l-bb.x;
        }
        else
            bb.x=dx-(2*l-bb.x);
        if(dy<w-bb.y)
            bb.y+=dy;
        else if(dy<2*w-bb.y)
        {
            bb.y+=dy;
            bb.y=2*w-bb.y;
        }
        else
            bb.y=dy-(2*w-bb.y);
    }
    else if(bb.dd.x==1&&bb.dd.y==-1) // SE
    {
        if(dx<l-bb.x)
            bb.x+=dx;
        else if(dx<2*l-bb.x)
        {
            bb.x+=dx;
            bb.x=2*l-bb.x;
        }
        else
            bb.x=dx-(2*l-bb.x);
        if(dy<w+bb.y)
        {
            bb.y-=dy;
            if(bb.y<0)
                bb.y=bb.y*(-1);
        }
        else
            bb.y=w-(dy-(bb.y+w));
    }
    else if(bb.dd.x==-1&&bb.dd.y==1)// NW
    {
        if(dx<bb.x)
            bb.x-=dx;
        else if(dx<bb.x+l)
        {
            bb.x-=dx;
            bb.x*=(-1);
        }
        else
        {
            dx-=(bb.x+l);
            bb.x=l-dx;
        }
        if(dy<w-bb.y)
            bb.y+=dy;
        else if(dy<2*w-bb.y)
        {
            bb.y+=dy;
            bb.y=2*w-bb.y;
        }
        else
            bb.y=dy-(2*w-bb.y);
    }
    else if(bb.dd.x==-1&&bb.dd.y==-1)
    {
        if(bb.x>dx)
            bb.x-=dx;
        else if(dx<bb.x+l)
        {
            bb.x-=dx;
            bb.x*=(-1);
        }
        else
        {
            dx-=(bb.x+l);
            bb.x=l-dx;
        }
        if(dy<w+bb.y)
        {
            bb.y-=dy;
            if(bb.y<0)
                bb.y=bb.y*(-1);
        }
        else
            bb.y=w-(dy-(bb.y+w));
    }
}
bool cmp(Ball a,Ball b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
void solve()
{
    scanf("%d%d%d%d",&l,&w,&n,&tt);
    string str;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&ball[i].x,&ball[i].y);
        cin>>str;
        if(str=="NW")
            ball[i].dd=d[3];
        else if(str=="NE")
            ball[i].dd=d[1];
        else if(str=="SE")
            ball[i].dd=d[7];
        else if(str=="SW")
            ball[i].dd=d[5];
        bounce(ball[i]);
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    init_direction();
    for(int i=1;i<=t;i++)
    {
        solve();
        printf("Case %d:\n",i);
        sort(ball+1,ball+n+1,cmp);
        for(int ii=1;ii<=n;ii++)
        {
            printf("%d %d\n",ball[ii].x,ball[ii].y);
        }
    }
    return 0;
}


1349 Aladdin and the Optimal Invitation

// http://lbv-pc.blogspot.com/2012/07/aladdin-and-optimal-invitation.html

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;
map<int,int>mx,my;
int dx,dy;
int m,n,q;
void solve()
{
    mx.clear();
    my.clear();
    scanf("%d%d%d",&m,&n,&q);
    __int64 total=0;//5w*1w可能会超
    for(int n_a=1;n_a<=q;n_a++)
    {
        int ii,jj,kk;
        scanf("%d%d%d",&ii,&jj,&kk);
        total+=kk;
        mx[ii]+=kk;
        my[jj]+=kk;
    }
    __int64 tmp=0;
    map<int,int>::iterator it=mx.begin();
    for(;it!=mx.end();it++)
    {
        dx=it->first;
        tmp+=it->second;
        if(tmp>=(total+1)/2)
            break;
    }
    tmp=0;
    it=my.begin();
    for(;it!=my.end();it++)
    {
        dy=it->first;
        tmp+=it->second;
        if(tmp>=(total+1)/2)
            break;
    }
}
int main()
{
    int Cases;
    scanf("%d",&Cases);
    for(int cases=1;cases<=Cases;cases++)
    {
        solve();
        printf("Case %d: %d %d\n",cases,dx,dy);
    }
    return 0;
}


/* 胖子的代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
__int64 x[50050],y[50050];
int main()
{
    int m,n,w,a,b;
    __int64 po;
    int i,j,k,t,p;
    cin>>t;
    for (i=1;i<=t;i++)
    {
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        cin>>m>>n>>w;
        po=0;
        while (w--)
        {
            cin>>a>>b>>p;
            x[a]+=p;
            y[b]+=p;
            po+=p;
        }
        __int64 sum=0;
        j=0;
        while (sum<(po+1)/2)
        {
            j++;
            sum+=x[j];
        }
        cout<<"Case "<<i<<": "<<j<<" ";
        sum=0;
        j=0;
        while (sum<(po+1)/2)
        {
            j++;
            sum+=y[j];
        }
        cout<<j<<endl;
    }
}
*/


1369 Answering Queries

// 我会说这题让我WA死的原因是因为我的__int64的输入输出是%I64d么
// 改成 %lld 就过了 坑死我了
// 直接用他给的公式当然会超时,转换成系数固定的方程
// 每次修改的时候更改ans,查询的时候直接输出ans
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int maxn=100005;
__int64 a[maxn];
__int64 ans=0;
int n,t,q;
__int64 operation()
{
    int tmp=n-1;
    __int64 sum=0;
    for(int i=1;i<=n;i++)
    {
        if(i>n+1-i)
            break;
        else if(i==n+1-i)
        {
            sum+=tmp*a[i];
        }
        else
            sum+=tmp*(a[i]-a[n+1-i]);
        tmp-=2;
    }
    return sum;
}
void Query()
{
    printf("%lld\n",ans);
}
void change(__int64 u,__int64 v)
{
    u++;
    if(u>n)
        return ;
    ans+=(n-1-(u-1)*2)*(v-a[u]);
    a[u]=v;
    return;
}
void solve()
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    ans=operation();
    for(int i=1;i<=q;i++)
    {
        int tag;
        scanf("%d",&tag);
        if(tag==1)
            Query();
        else
        {
            __int64 x,y;
            scanf("%lld%lld",&x,&y);
            change(x,y);
        }
    }
}
int main()
{
    scanf("%d",&t);
    for(int cases=1;cases<=t;cases++)
    {
        printf("Case %d:\n",cases);
        solve();
    }
    return 0;
}


1410 Consistent Verdicts

#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
struct point
{
    int x,y;
};
point p[1010];
vector<__int64>v;
int n,cases;
__int64 dis(point a,point b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void solve()
{
    v.clear();
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&p[i].x,&p[i].y);
        for(int j=0;j<i;j++)
            v.push_back(dis(p[i],p[j]));
    }
    sort(v.begin(),v.end());
    vector<__int64>::iterator it=unique(v.begin(),v.end());
    printf("Case %d: %d\n",cases,it-v.begin()+1);
}
int main()
{
    int t;
    scanf("%d",&t);
    for(cases=1;cases<=t;cases++)
    {
        solve();
    }
    return 0;
}


A Question of Time

     不会

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值