2017暑训入门摸底(HDU4500,HDU2190,HDU2111,HDU3787,HDU2108)

43 篇文章 0 订阅
30 篇文章 0 订阅
博主分享了暑训期间的刷题经历,回顾了入门班的几道题目,包括语言模拟、排序问题、进一步的排序挑战、字符串处理、高中数学中的向量题以及简单的模拟题目。在解决这些问题时,博主运用了枚举、STL sort函数、贪心策略、字符串操作和向量叉积判断凸多边形的方法。
摘要由CSDN通过智能技术生成

好久都没写博客了,不知不觉暑训都快过半了呢,专心刷题的日子还是很快乐的,今日放假,来赶紧补一发

 

先从放假前的开始吧,悄悄潜入入门班跟一波榜,回忆起一年前自己似乎还什么都不会呢,感慨万千

 

A - 这是测试你会不会语言的模拟

 

思路:典型的模拟暴搜,枚举每个位置,找出最大值即可

 

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 30;

int n,m;

int k[maxn][maxn];

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(m==0&&n==0)
        {
            break;
        }
        for(int j=0;j<=m+1;j++)
        {
            k[0][j]=0;
            k[n+1][j] = 0;
        }
        for(int i=1;i<=n;i++)
        {
            k[i][0] = 0;
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&k[i][j]);
            }
            k[i][m+1] = 0;
        }
        int maxk = -10000,maxi = 0,maxj = 0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int sum = k[i+1][j] + k[i-1][j] + k[i][j+1] + k[i][j-1];
                if(k[i][j]>0)
                {
                    sum *= (-1);
                }
                if(sum > maxk)
                {
                    maxk = sum;
                    maxi = i;
                    maxj = j;
                }
            }
        }
        printf("%d %d %d\n",maxi,maxj,maxk);
    }
    return 0;
}

 

 

 

 

 

B - 这是测试你会不会排序

 

思路:STL sort函数的运用

 

 

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1000;

int n;

int a[maxn],b[maxn];

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
        {
            break;
        }
        int aw=0,bw=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=0;i<n;i++)
        {
            scanf("%d",&b[i]);
        }
        sort(a,a+n);
        sort(b,b+n);
        for(int i=0;i<n;i++)
        {
            if(a[i]>b[i])
            {
                aw += 2;
            }
            else if(a[i]<b[i])
            {
                bw += 2;
            }
            else
            {
                aw++;
                bw++;
            }
        }
        printf("%d vs %d\n",aw,bw);
    }
    return 0;
}

 

 

 

 

 

 

 

 

C - 进一步排序

思路:一开始考虑会不会是背包,后来发现物品可分割,果断排序,贪心

 

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 110;

int v,n;

typedef struct jewellery
{
    int p;
    int m;
}Jewellery;

Jewellery j[maxn];

bool cmp(const Jewellery a, const Jewellery b)
{
    return a.p>b.p;
}

int main()
{
    while(scanf("%d",&v)!=EOF)
    {
       if(v==0)
       {
           break;
       }
       scanf("%d",&n);
       for(int i=0;i<n;i++)
       {
           scanf("%d%d",&j[i].p,&j[i].m);
       }
       sort(j,j+n,cmp);
       int sum = 0;
       for(int i=0;i<n;i++)
       {
           if(v>j[i].m)
           {
               v -= j[i].m;
               sum += j[i].p * j[i].m;
           }
           else
           {
               sum += v * j[i].p;
               break;
           }
       }
       printf("%d\n",sum);
    }
    return 0;
}

 

 

 

 

 


D - 测试你会不会字符串

 思路:基础的字符串读取,并转化为十进制数,40min4题确实爽歪歪

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 100;

long long p = 1l;
long long num = 0l;
long long a = 0l;
long long b = 0l;

char in[maxn];

int main()
{
    while(scanf("%s",in)!=EOF)
    {
        p = 1l;
        a = 0l;
        b = 0l;
        int inlen = strlen(in);
        for(int i=0;i<inlen;i++)
        {
            if(in[i] == '-')
            {
                p *= (-1l);
                continue;
            }
            if(in[i] == ',')
            {
                continue;
            }
            a *= 10l;
            a += (long long)(in[i] - '0');
        }
        a *= p;
        scanf("%s",in);
        p = 1l;
        inlen = strlen(in);
        for(int i=0;i<inlen;i++)
        {
            if(in[i] == '-')
            {
                p *= (-1l);
                continue;
            }
            if(in[i] == ',')
            {
                continue;
            }
            b *= 10l;
            b += (long long)(in[i] - '0');
        }
        b *= p;
        num = a + b;
        printf("%lld\n",num);
    }
    return 0;
}

 

 

 

 

 

 

 

E - 这是高中数学向量题

思路:判断凸多边形,终于有点难度了

 

判断凸多边形的方法有很多,主要有以下几种:

1.角度法:判断每个顶点对应的内角,若均小于180度,则为凸多边形

2.凸包法:计算该多边形的凸包,若凸包对应的顶点数与该多边形相等,则为凸多边形

3.顶点凹凸性法:利用以当前顶点为中心的矢量叉乘或者计算三角形的有符号面积判断多边形的方向以及当前顶点的凹凸性。

4.辛普森面积法:利用待判别的顶点以及前后两个顶点所组成的三角形,利用辛普森公式计算其面积,如果此三角形面积与整个多边形面积符号相同,那么这个顶点是凸的;如果此三角形面积与整个多边形面积符号不同,那么这个顶点是凹的,即整个多边形也是凹多边形。

 

本题由于知道了顶点公式,当然选择根据顶点相邻边向量(p1p2和p2p3)叉积来判断,若均大于0则为凸多边形

 

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1001;

int x[maxn],y[maxn];

int n;

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
        {
            break;
        }
        bool convex = true;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&x[i],&y[i]);
        }
        int x1=x[0],y1=y[0],x2=x[1],y2=y[1],x3=x[2],y3=y[2];
        for(int i=0;i<n;i++)
        {
            int xx1=x2-x1,yy1=y2-y1,xx2=x3-x2,yy2=y3-y2;
            int cj=xx1*yy2-xx2*yy1;
            if(cj<=0)
            {
                convex = false;
                break;
            }
            x1=x[(i+1)%n],y1=y[(i+1)%n],x2=x[(i+2)%n],y2=y[(i+2)%n],x3=x[(i+3)%n],y3=y[(i+3)%n];
        }
        if(convex)
        {
            printf("convex\n");
        }
        else
        {
            printf("concave\n");
        }
    }
    return 0;
}

 

 

 

 

 

F - 比前面更简单的模拟

 

 

 

思路:模拟,统计字符串并按要求重排。

 

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1010;

char a[maxn];

int main()
{
    while(scanf("%s",a)!=EOF)
    {
        if(strcmp(a,"E")==0)
        {
            break;
        }
        int alen = strlen(a);
        int z=0;
        int o=0;
        int j=0;
        for(int i=0;i<alen;i++)
        {
            if(a[i]=='Z')
            {
                z++;
            }
            else if(a[i]=='O')
            {
                o++;
            }
            else
            {
                j++;
            }
        }
        while(z>0||o>0||j>0)
        {
            if(z>0)
            {
                printf("Z");
                z--;
            }
            if(o>0)
            {
                printf("O");
                o--;
            }
            if(j>0)
            {
                printf("J");
                j--;
            }
        }
        printf("\n");
    }
    return 0;
}

 


好了,差不多了,不做了。很快正式的摸底就要来了

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值