最近AC的一部分题目(水题一堆啊)

hdu1029,一个简单的dp问题(虽然这个问题貌似不用do唉,囧)


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAXN 500000
using namespace std;

int main()
{
    int num,n,index,max;
    while(scanf("%d",&num)!=EOF)
    {
        index=0;
        for(int i=0;i<num;i++)
        {
            scanf("%d",&n);
            if(index==0)
            {
                max=n;
                index++;
            }
            else
            {
                max==n?index++:index--;
            }
        }
        printf("%d\n",max);
    }
    return 0;
}
开始MAXN开小了,WA了,然后就没什么了


hdu1007,无脑模板题。。。。


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>

using namespace std;

const int N=100005;
const double MAX=10e100,eps=0.00001;
struct Point{double x,y;int index;};
Point a[N],b[N],c[N];
double closest(Point *,Point *,Point *,int ,int );
double dis(Point,Point);
int cmp_x(const void *,const void *);
int cmp_y(const void *,const void *);
int merge(Point *,Point *,int ,int ,int );
int main()
{
    int n,i;
    double d;
    while(scanf("%d",&n)!=EOF,n)
    {
        for(i=0;i<n;i++)
            scanf("%lf %lf",&a[i].x,&a[i].y);
        qsort(a,n,sizeof(a[0]),cmp_x);
        for(i=0;i<n;i++)
            a[i].index = i;
        memcpy(b,a,n*sizeof(a[0]));
        qsort(b,n,sizeof(b[0]),cmp_y);
        d=closest(a,b,c,0,n-1);
        printf("%.2lf\n",d/2);
    }
    return 0;
}

double closest(Point a[],Point b[],Point c[],int p,int q)
{
    if(q-p==1) return dis(a[p],a[q]);
    if(q-p==2)
    {
        double x1=dis(a[p],a[q]);
        double x2=dis(a[p+1],a[q]);
        double x3=dis(a[p],a[q+1]);
        if(x1<x2&&x1<x3) return x1;
        else if(x2<x3) return x2;
        else return x3;
    }
    int i,j,k,m=(p+q)/2;
    double d1,d2;
    for(i=p,j=p,k=m+1;i<=q;i++)
        if(b[i].index<=m) c[j++]=b[i];
    else c[k++]=b[i];
    d1=closest(a,c,b,p,m);
    d2=closest(a,c,b,m+1,q);
    double dm=min(d1,d2);
    merge(b,c,p,m,q);
    for(i=p,k=p;i<=q;i++)
        if(fabs(b[i].x-b[m].x)<dm) c[k++]=b[i];
    for(i=p;i<k;i++)
        for(j=i+1;j<k&&c[j].y-c[i].y<dm;j++)
    {
        double temp=dis(c[i],c[j]);
        if(temp<dm) dm=temp;
    }
    return dm;
}
double dis(Point p,Point q)
{
    double x1=p.x-q.x,y1=p.y-q.y;
    return sqrt(x1*x1+y1*y1);
}
int merge(Point p[],Point q[],int s,int m,int t)
{
    int i,j,k;
    for(i=s,j=m+1,k=s;i<=m&&j<=t;)
    {
        if(q[i].y>q[j].y) p[k++]=q[j],j++;
        else p[k++]=q[i],i++;
    }
    while(i<=m) p[k++]=q[i++];
    while(j<=t) p[k++]=q[j++];
    memcpy(q+s,p+s,(t-s+1)*sizeof(p[0]));
    return 0;
}
int cmp_x(const void *p,const void *q)
{
    double temp=((Point*)p)->x - ((Point*)q)->x;
    if(temp>0) return 1;
    else if(fabs(temp)<eps) return 0;
    else return -1;
}
int cmp_y(const void *p,const void *q)
{
    double temp=((Point*)p)->y - ((Point*)q)->y;
    if(temp>0) return 1;
    else if(fabs(temp)<eps) return 0;
    else return -1;
}

hdu1282,回文数,复习了一下strrev,strcpy,itoa,atoi几个字符串常用函数、

说实话,弄得还挺烦的。。。。估计是我太弱人的原因

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


int main()
{
    int m[10000],time,i;
    char str1[100],str2[100];
    while(cin>>str1)
    {
        time=0;
        memset(m,0,sizeof(m));
        m[0]=atoi(str1);
        strcpy(str2,str1);
        strrev(str2);
        while(strcmp(str1,str2)!=0)
        {
               time++;
            m[time]=atoi(str1)+atoi(str2);
            itoa(m[time],str1,10);
            strcpy(str2,str1);
            strrev(str2);
        }
        cout<<time<<endl;
        cout<<m[0];
        for(i=1;i<=time;i++)
        {
            cout<<"--->"<<m[i];
        }
        cout<<endl;
    }
    return 0;
}


hdu 1022 ,很无脑的栈应用。。。我做完逆波兰之后做这个没遇到什么压力


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

int main()
{
    int num;
    string str1,str2;
    while(cin>>num>>str1>>str2)
    {
        int i,j;
        i=j=0;
        stack <char> sta;
        while(i<num)
        {
            if(str1[i]==str2[j])
            {
                i++;j++;
                while(!sta.empty() && str2[j]==sta.top())
                {
                    j++;sta.pop();
                }
            }
            else
            {
                sta.push(str1[i++]);
            }
        }
        if(sta.empty())
            {
            cout<<"Yes."<<endl;
        i=j=0;
        stack <char> sta;
        while(i<num)
        {
            if(str1[i]==str2[j])
            {
                i++;j++;
                cout<<"in"<<endl<<"out"<<endl;
                while(!sta.empty() && str2[j]==sta.top())
                {
                    j++;sta.pop();
                    cout<<"out"<<endl;
                }
            }
            else
            {
                sta.push(str1[i++]);cout<<"in"<<endl;
            }
        }
        cout<<"FINISH"<<endl;
        }
        else
        {
            cout<<"No."<<endl<<"FINISH"<<endl;
        }
    }
    return 0;
}

hdu1584 深搜的一道入门题


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

int x,ans,arr[11];
bool dir[11];
void dfs(int i,int sum)
{
    if(sum>ans) return;
    if(i==10)
    {
        ans=sum;
        return;
    }
    else
    {
        for(int m=1;m<=10;m++)
        {
            if(!dir[m])
                {
                    for(int j=m+1;j<=10;j++)
                    {
                        if(!dir[j])
                        {
                            dir[m]=1;
                            dfs(i+1,sum+abs(arr[m]-arr[j]));
                            dir[m]=0;
                            break;
                        }
                    }
                }
        }
    }

}


int main()
{
    int num;cin>>num;
    while(num--)
    {
    for(int i=1;i<=10;i++)
    {
        cin>>x;
        arr[x]=i;
    }
    ans=1000;
    dfs(1,0);
    cout<<ans<<endl;
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值