排序周赛(no stl)

这次排序禁用STL....代码写的纠结死了。不过还是因为代码功底不行


Problem A    hdu 1029

此题算是数据水了点,我用100W数组来记录,然后就水过了......

#include <iostream>
#include <cstring>
using namespace std;

int ind[1000005];

int main()
{
    int n,a;
    while(cin >> n)
    {
        int ans;
        memset(ind,0,sizeof(ind));
        for(int i=0; i<n; i++)
        {
            cin >> a;
            ind[a] ++;
            if(ind[a] *2 >=  n + 1)
            {
                ans = a;
            }
        }
        cout << ans << endl;
    }
    return 0;
}


Problem B  hdu 1040

这题写了个冒泡......


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[1005];

int main()
{

    int t,i,j,n;
    cin >> t;
    while(t--)
    {
        cin >> n;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(j=0; j<n-1; j++)
            for(i=0; i<n-1-j; i++)
            {
                int t;
                if(a[i] > a[i+1])
                {
                    t = a[i+1];
                    a[i+1] = a[i];
                    a[i] = t;
                }
            }
        for(i=0; i<n-1; i++)
        {
            printf("%d ",a[i]);
        }
        printf("%d\n",a[n-1]);
    }
    return 0;
}

Problem C hdu 1106

字符串先处理一下,然后冒个泡排序


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

char a[1005];
int num[1005];
int main()
{
    while(cin >> a)
    {
        int len = strlen(a);
        int ok = 0,sum = 0,j=0;
        int n;
        for(int i=0; i<len; i++)
        {
            if(a[i] == '5' && a[i-1] != '5' && i != 0)
            {
                num[j] = sum;
                j++;
                sum = 0;
                continue;
            }
            if(a[i] != '5')
            {
                int t = a[i] - '0';
                sum = sum * 10 + t;
            }
            if(i == len-1 && a[i] != '5')
            {
                num[j] = sum;
                j++;
            }
        }
        n = j;
        for(j=0; j<n-1; j++)
            for(int i=0; i<n-1-j; i++)
            {
                if(num[i] > num[i+1])
                {
                    int t;
                    t = num[i+1];
                    num[i+1] = num[i];
                    num[i] = t;
                }
            }
        for(int i=0; i<n-1; i++)
        {
            //if(num[i] != num[i+1])
                printf("%d ",num[i]);
        }
        printf("%d\n",num[n-1]);
    }
    return 0;
}

Problem D  hdu 1209

计算时钟角度得注意分钟移动后,时钟也会移动一定角度。

用结构体,然后冒泡模拟结构体排序

还有要注意的就是角度相同,按照时间由早到晚排序


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

struct Time
{
    int h,m;
    double ang;
} tim[6];

int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        for(int i=0; i<5; i++)
        {
            scanf("%d:%d",&tim[i].h,&tim[i].m);
            double angle1,angle2;
            double hh = double(tim[i].h % 12);
            double mm = double(tim[i].m);
            angle1 = (360.0 * hh) / 12.0 + mm*1.0 / 2.0 ;
            angle2 = (360.0 * mm) / 60.0;
            double aps = fabs(angle1 - angle2);
            aps = min(aps,360.0 - aps);
            tim[i].ang = aps;
        }
        for(int j=0; j<4; j++)
            for(int i=0; i<4-j; i++)
            {
                if(tim[i].ang > tim[i+1].ang)
                {
                    double an;
                    int hh,mm;
                    an = tim[i+1].ang;
                    tim[i+1].ang = tim[i].ang;
                    tim[i].ang = an;

                    hh = tim[i+1].h;
                    tim[i+1].h = tim[i].h;
                    tim[i].h = hh;

                    mm = tim[i+1].m;
                    tim[i+1].m = tim[i].m;
                    tim[i].m = mm;
                }
                if(tim[i].ang == tim[i+1].ang)
                {
                    if(tim[i].h *60 +tim[i].m > tim[i+1].h*60 +tim[i+1].m)
                    {
                        double an;
                        int hh,mm;
                        an = tim[i+1].ang;
                        tim[i+1].ang = tim[i].ang;
                        tim[i].ang = an;

                        hh = tim[i+1].h;
                        tim[i+1].h = tim[i].h;
                        tim[i].h = hh;

                        mm = tim[i+1].m;
                        tim[i+1].m = tim[i].m;
                        tim[i].m = mm;
                    }
                }
            }
        /*for(int i=0; i<5; i++)
        {
            printf("%.3f %d:%d\n",tim[i].ang,tim[i].h,tim[i].m);
        }*/
        if(tim[2].h >= 10)
            printf("%d:",tim[2].h);
        else
            printf("0%d:",tim[2].h);
        if(tim[2].m >= 10)
            printf("%d\n",tim[2].m);
        else
            printf("0%d\n",tim[2].m);
    }
    return 0;
}



Problem E hdu 1236

这题结构体排序....不用stl还是很纠结的,学号的升序排列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

struct node
{
    char name[30];
    int sco;
} stu[1005];

int que[11];
int main()
{
    int n,i,j,m,g,mm,t;
    while(cin >> n && n)
    {
        int cnt = 0;
        cin >> m >> g;
        for(i=1; i<=m; i++)
            scanf("%d",&que[i]);
        for(i=0; i<n; i++)
        {
            scanf("%s%d",stu[i].name,&mm);
            stu[i].sco = 0;
            for(j=0; j<mm; j++)
            {
                scanf("%d",&t);
                stu[i].sco += que[t];
            }
            if(stu[i].sco >= g)
                cnt++;
        }
        for(j=0; j<n-1; j++)
            for(i=0; i<n-1-j; i++)
            {
                if(stu[i].sco < stu[i+1].sco)
                {
                    t = stu[i+1].sco;
                    stu[i+1].sco = stu[i].sco;
                    stu[i].sco = t;
                    char temp[30];
                    strcpy(temp,stu[i+1].name);
                    strcpy(stu[i+1].name,stu[i].name);
                    strcpy(stu[i].name,temp);
                }
                if(stu[i].sco <= stu[i+1].sco)
                {
                    if(strcmp(stu[i].name,stu[i+1].name) > 0)
                    {
                        char temp[30];
                        strcpy(temp,stu[i+1].name);
                        strcpy(stu[i+1].name,stu[i].name);
                        strcpy(stu[i].name,temp);
                    }
                }
            }
        printf("%d\n",cnt);
        for(i=0; i<cnt; i++)
        {
            printf("%s %d\n",stu[i].name,stu[i].sco);
        }
    }
    return 0;
}

Problem F hdu 1280

这个投机取巧了,1W的数组记录,然后就随意了


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int a[3005],vis[10005];

int main()
{
    int n,m,i,j;
    while(cin >> n >> m)
    {
        memset(vis,0,sizeof(vis));
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=0; i<n; i++)
            for(j=i+1; j<n; j++)
            {
                vis[a[i]+a[j]]++;
            }
        i = 0;
        for(j=10000; j>=0; j--)
        {
            while(vis[j] >= 1)
            {
                if(i == m-1)
                    printf("%d\n",j);
                else
                    printf("%d ",j);
                i++;
                vis[j] --;
                if(i == m)
                    break;
            }
            if(i == m)
                break;
        }

    }
    return 0;
}

Problem G hdu 1391

这题模拟了一下规律就行了


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

short map[5005][5005] = {{0}};

void init()
{
    map[0][0] = 0;
    int ok = 0,cnt = 1;
    while(ok <= 10002)
    {
        if(cnt % 4 == 1)
        {
            ok += 2;
            map[ok/2][ok/2] = cnt;
            cnt++;
        }
        if(cnt % 4 == 2)
        {
            map[ok/2+1][ok/2-1] = cnt;
            cnt++;
        }
        if(cnt % 4 == 3)
        {
            ok += 2;
            map[ok/2+1][ok/2-1] = cnt;
            cnt++;
        }
        if(cnt % 4 == 0)
        {
            map[ok/2][ok/2] = cnt;
            cnt++;
        }
    }
}

int main()
{
    int n,x,y;
    cin >> n;
    init();
    while(n--)
    {
        cin >> x >> y;
        if(map[x][y] == 0 && (x!=0 || y!=0) )
            printf("No Number\n");
        //else if(x > 5000 || y > 5000)
            //printf("No Number\n");
        else
            printf("%d\n",map[x][y]);
    }
    return 0;
}

Problem H hdu 2673

最后一个看数据,冒泡会tle,所以手写了个快排,也没什么说的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int a[10005];

void sort(int a[],int x,int y)
{
    int xx=x,yy=y;
    int k=a[x];
    if(x >= y)
        return ;
    while(xx != yy)
    {
        while(xx < yy && a[yy] >= k)
            yy--;

        a[xx]=a[yy];
        while(xx < yy && a[xx] <= k)
            xx++;

        a[yy]=a[xx];
    }

    a[xx]=k;
    sort(a,x,xx-1);
    sort(a,xx+1,y);
}

int main()
{
    int n;
    while(cin >> n)
    {
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        sort(a,0,n-1);
        printf("%d",a[n-1]);
        for(int i=0,j=n-2; i<=j; i++,j--)
        {
            if(i == j)
                printf(" %d",a[i]);
            else
                printf(" %d %d",a[i],a[j]);
        }
        printf("\n");
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值