现在的位置: 首页 > 综合 > 正文

20130317

2019年02月09日 ⁄ 综合 ⁄ 共 3820字 ⁄ 字号 评论关闭

这次的周赛不能用stl,开始不知道,全是用stl写滴,最后写了下快排,貌似快排写的不是很熟练,下面还是小结下。

快排代码:

void sort(int begin,int end)
{
    if(begin>=end)
        return ;
    int i=begin,j=end,key=a[i];
    while(i<j)
    {
        while(a[j]>=key&&i<j)
        {
            j--;
        }
        a[i]=a[j];
        while(i<j&&a[i]<=key)
        {
            i++;
        }
        if(i<j)
        {
            a[j]=a[i];
        }
    }
    a[i]=key;

    sort(begin,i-1);
    sort(i+1,end);
}

1001:这题值得深思。其实用数组标记次数就行,不过不能找最多的,只能找个数>n/2的,这样很花时间吧。用快排超时。

hdu1029

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<vector>
#define INF 10000000
#define MAXN 1000000
#define MAXL 1000
using namespace std;
bool cmp(int x,int y)
{
    return x<y;
}
int a[MAXN];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        int count=1,ans=-1,m=a[0];
        for(int i=1; i<n; i++)
        {
            if(a[i]==a[i-1])
            {
                count++;
            }
            else
            {
                count=1;
            }
            if(count>=(n+1)/2)
            {
                m=a[i];
            }
        }
        printf("%d\n",m);
    }
    return 0;
}

1002:水题,直接快排。

hdu1040

1003

hdu 1106

水题,注意下字符串的处理,然后快排。

1004:注意时钟可能出现小数,还有时钟并不是整的角度,分钟转的时候会有小的角度。

hdu 1209

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 100
using namespace std;
struct T
{
    int h,m;
    float n;
};
T tim[5];
bool cmp(T x, T y)
{
    if(x.n!=y.n)
    return x.n<y.n;
    else
    {
        if(x.h!=y.h)
        {
            return x.h<y.h;
        }
        else
        {
            return x.m<y.m;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    float tmp;
    while(t--)
    {
        for(int i=0;i<5;i++)
        {
            scanf("%d:%d",&tim[i].h,&tim[i].m);
            tmp=fabs((tim[i].h%12)*30.0+30.0*tim[i].m/60-tim[i].m*6);
            if(tmp<=180.0)
            tim[i].n=tmp;
            else
            tim[i].n=360.0-tmp;
        }
        sort(tim,tim+5,cmp);

        for(int i=0;i<5;i++)
        printf("%02d:%02d %f\n",tim[i].h,tim[i].m,tim[i].n);       
    }
    return 0;
}

1005:结构体排序,如果不用sort,就排两次就行。

hdu 1236

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct ST
{
    string name;
    int goal;
}st[1005];
bool cmp(ST x,ST y)
{
    if(x.goal!=y.goal)
    {
        return x.goal>y.goal;
    }
    else
    {
        return x.name<y.name;
    }
}
int fenshu[15];
int main()
{
    int n,m,g,num,nn;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        scanf("%d%d",&m,&g);
        nn=0;
        for(int i=1;i<=m;i++)
        scanf("%d",&fenshu[i]);
        for(int i=1;i<=n;i++)
        {
            cin>>st[i].name>>num;
            int agoal=0,k;
            for(int j=1;j<=num;j++)
            {
                scanf("%d",&k);
                agoal+=fenshu[k];
                
            }
            st[i].goal=agoal;
            if(agoal>=g)
            nn++;
        }
        sort(st+1,st+n+1,cmp);
        printf("%d\n",nn);
        for(int i=1;i<=nn;i++)
        {
         
            cout<<st[i].name<<' '<<st[i].goal<<endl;
        }
    }
    return 0;
}

1006:用了个priotity_queue这个写的不是很熟练。

hdu 1280

用stl的代码:

#include<cstdio>
#include<iostream>
#include<queue>
#define maxn 3005
using namespace std;
priority_queue<int> q;
int n,m;
int a[maxn];
int main()
{
    int tmp;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=0; i<n; i++)
        {
            for(int j=i+1; j<n; j++)
            {
                tmp=a[i]+a[j];
                q.push(tmp);
            }
        }
        for(int i=0; i<m-1; i++)
        {
            tmp=q.top();
            q.pop();
            printf("%d ",tmp);
        }
        tmp=q.top();
        q.pop();
        printf("%d",tmp);
        putchar('\n');
    }
    return 0;
}

不用stl的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define MAXN 1111
#define INF 1011111111
using namespace std;
int n, m;
int a[3333];
int partition(int a[], int low, int high)
{//快速排序中的一趟
    int key;//作为枢轴来使用
    key = a[low];
    while(low < high)
    {
        while(low < high && a[high] >= key)
        --high;
        a[low] = a[high];
        while(low < high && a[low] <= key)
        ++low;
        a[high] = a[low];
    }
    a[low] = key;
    return low;
}
void qsort(int a[], int low, int high)
{//快速排序的递归形式
    int loc;
    if(low < high)
    {
        loc = partition(a, low, high);//一趟排序结果的调用
        qsort(a, low, loc - 1);
        qsort(a, loc + 1, high);
    }
}
int q[1111];
int r;
void up(int i)
{
    int j;
    while(i > 1)
    {
        j = i / 2;
        if(q[j] > q[i]) swap(q[i], q[j]);
        else break;
        i = j;
    }
}
void down(int i)
{
    int j;
    while(i * 2 <= r)
    {
        j = i * 2;
        if(j + 1 <= r && q[j] > q[j + 1]) j++;
        if(q[i] > q[j]) swap(q[i], q[j]);
        else break;
        i = j;
    }
}
void del()
{
    swap(q[1], q[r]);
    r--;
    down(1);
}
void insert(int x)
{
    q[++r] = x;
    up(r);
}
int ans[1111];
int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        r = 0;
        for(int i = 0; i < n; i++) scanf("%d", &a[i]);
        qsort(a, 0, n - 1);
        for(int i = n - 1; i >= 0; i--)
        {
            int flag = 0;
            for(int j = i - 1; j >= 0 && j >= i - m; j--)
            {
                int x = a[i] + a[j];
                if(r < m)
                {
                    flag = 1;
                    insert(x);
                }
                else if(x > q[1])
                {
                    flag = 1;
                    del();
                    insert(x);
                }
            }
            if(!flag) break;
        }
        for(int i = 0; i < m; i++)
        {
            ans[i] = q[1];
            del();
        }
        for(int i = m - 1; i > 0; i--) printf("%d ", ans[i]);
        printf("%d\n", ans[0]);
    }
    return 0;
}

1007:水题,找规律,没用排序。

hdu 1391

1008:水题,排个序,然后输出。

hdu 2673

抱歉!评论已关闭.