关闭

SWUST大二周赛 之农夫山泉有点甜

标签: x
453人阅读 评论(0) 收藏 举报
分类:

第一题:  codeforces 485b

题意:给定一些点,要用尽量小的正方形框住所有的点,输出矩形的大小。

解题思路:维护x的最大值和最小值。同理y。然后取差值中的最大值作为变成,注意用long long

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;

#define ll long long
int main()
{
    int n;
    ll xmi,xma,ymi,yma;
    while(~scanf("%d",&n))
    {
        ll x,y;
        scanf("%lld%lld",&x,&y);
        xmi=x; xma=x; ymi=y; yma=y;
        while(--n)
        {
            scanf("%lld%lld",&x,&y);
            xmi=min(xmi,x);
            xma=max(xma,x);
            ymi=min(ymi,y);
            yma=max(yma,y);
        }
        ll ans=max(xma-xmi,yma-ymi);
        printf("%lld\n",ans*ans);
    }
    return 0;
}

第二题:UVA12627

题意:按照题目的规律 问第K天的时候,A到B行一共有多少个红色气球。

思路:先找规律,规律在于对于第k个小时的来说,总是可以分成右下角全是蓝色气球,右上角,左下角与左上角三个一模一样的k-1个小时的气球。这样的话,规律就很清晰了,然后用递归做比较方便。。。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std;

#define ll long long
ll f[33];
ll solve(ll x)
{
    if(x==0) return 0;
    ll z=1,sum=1;
    while(x>=z)
    {
        sum*=3;
        z*=2;
    }
    return sum/3+2*solve(x-z/2);
}

void init()
{
    int i;
    f[0]=1;
    for(int i=1;i<=30;i++)
        f[i]=f[i-1]*2;
}
int main()
{
    ll n,t,ans,k,a,b,num=0;
    scanf("%lld",&t);
    init();
    while(t--)
    {
        scanf("%lld%lld%lld",&k,&a,&b);
        num++;
        a=f[k]-a+1;
        b=f[k]-b+1;
        ans=solve(a)-solve(b-1);
        printf("Case %lld: %lld\n",num,ans);
    }
    return 0;
}

第三题:UVA11488

题意:给你一些01串,某个前缀的pg为:此前缀长度*拥有此前缀的串的数量。求最大的pg值。

思路:先建一颗字典树,按照输入的顺序插入到字典树,每个插入的字符进行统计,并记录深度,最后,枚举所有节点,计算出最大的pg值即可。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std;

#define ll long long
#define nn 500500
struct node
{
    int next[2];
    int num,len;
    void init()
    {
        memset(next,-1,sizeof(next));
        num=len=0;
    }
}tree[nn];
char s[220];
int tot,t,n;

void insert(char *s)
{
    int p=0;
    int l=strlen(s);
    int id;
    for(int i=0;i<l;i++)
    {
        id=s[i]-'0';
        if(tree[p].next[id]==-1)
        {
            tree[p].next[id]=t;
            tree[t].init();
            tree[t++].len=tree[p].len+1;
        }
        p=tree[p].next[id];
        tree[p].num++;
    }
}
int query()
{
    int ans=0;
    queue<int>q;
    q.push(0);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        ans=max(ans,tree[x].num*tree[x].len);
        for(int i=0;i<2;i++)
        {
            if(tree[x].next[i]!=-1)
                q.push(tree[x].next[i]);
        }
    }
    return ans;
}
int main()
{
    scanf("%d",&tot);
    while(tot--)
    {
        scanf("%d",&n);
        t=0;
        tree[t++].init();
        for(int i=0;i<n;i++)
        {
            scanf("%s",s);
            insert(s);
        }
        int ans=query();
        printf("%d\n",ans);
    }
    return 0;
}

第四题:codeforces 495b

题意:给出a,b的值,找出满足a%x = b中x的个数。

思路:根据题意我们可以列出方程(a-b)%x == 0,我们只需枚举满足(a-b)%i == 0&&i> b的个数即可。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;

#define ll long long
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        a-=b;
        if(a==0)
        {
            puts("infinity");
            continue;
        }
        int ans=0,i;
        for(i=1;i*i<a;i++)
        {
            if(a%i==0)
            {
                if(i>b) ans++;
                if(a/i>b) ans++;
            }
        }
        if(i*i==a && i>b) ans++;
        printf("%d\n",ans);
    }
    return 0;
}

第五题:codeforces 379a

题意:有a根蜡烛,每根能燃1小时,蜡烛灭了后剩下一个烛头,b个烛头可以组成一个新的蜡烛点燃蜡烛的最长的时间。

思路:。。。。这个就是纯暴力。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;

#define ll long long
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        int ans=0,c=0;
        while(a>0||c>=b)
        {
            ans+=a;
            c+=a;
            a=c/b;
            c-=a*b;
        }
        printf("%d\n",ans);
    }
    return 0;
}





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13553次
    • 积分:831
    • 等级:
    • 排名:千里之外
    • 原创:73篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类