贪心入门

 zstu2511-Delete Number

题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2511

View Code
#include<stdio.h>
#include<string.h>
int main()
{
    int n,num,T,i;
    char s[1001];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%s",&n,s);
        num=strlen(s);
        int cnt=0,x=0,y=1;//x,y表示比较的两个数的位置下标。
        while(cnt<n&&y<=num)
        {
            if(s[y]<s[x]&&x>=0)
            {
                s[x]='0'-1; //'0'-1是删除标记
                while(s[x]=='0'-1&&x>=0)x--;
                cnt++;//cnt用来记录删了几个数
            }
            else x=y++;
        }
        int w=0,g=1;
        while(s[w]=='0'-1||s[w]=='0')w++;//清除结果前面多余的0;
        for(i=w;i<num;i++)
        if(s[i]!='0'-1){printf("%c",s[i]);g=0;}//g是为了修正 结果为0时无输出,反之如果无输出,答案就是0,g来检验是否有结果输出
        if(g)printf("0");
        printf("\n");
    }
    return 0;
}

zstu2512-均分纸牌

题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2512

View Code
#include<stdio.h>    //太水了,不解释
int main()
{
    int n,a[101],i;
    while(scanf("%d",&n)!=EOF&&n)
    {
        int ave=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            ave+=a[i];
        }
        ave/=n;
        int cnt=0;
        for(i=1;i<n;i++)
        if(ave!=a[i]){a[i+1]+=a[i]-ave;cnt++;}
        printf("%d\n",cnt);
    }
    return 0;
}

 zstu2513-连数问题

 题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2513

 解题报告:

这个题目意思应该很好理解,至少会想有两种解题思路,
         一、把数组从大到小排列,这样是最大吗?  显然不是,例如:123 9,应该输出9123;
         二、把数组按字符串排序,这样是最大吗?这问题可能会然我们困惑,但是这也是错的,例如:120,12;应该输出12120;
这个题目不知道毒害了多少人(当然我指的是ACM新人),尤其是第二种思路去写代码的。。这只是一个悲剧的开始,你把一条弯路在直走!
其实这个题目应该是属于动态规划的最简单应用!子问题,给你两个数,让你连成最大数,一定非常简单,只能组成两个数,比较一下大小就成!这就是解题思路!
如果给你三个数呢?一直递推下去!悲剧啊,尽然怎么简单!

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int n,i,j,l,k;
    char s[1000][100],s1[100],s2[100];
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        for(i=0;i<n;i++)
        {
            k=0;
            scanf("%s",s[i]);
            while(s[i][k]=='0'&&k<strlen(s[i])-1) k++;//删去“000001”等数之前的“0”
             strcpy(s[i],s[i]+k);
        }
    for(i=0;i<n-1;i++)
    for(j=i+1;j<n;j++)
    {
        strcpy(s1,s[i]);
        strcat(s1,s[j]);
        strcpy(s2,s[j]);
        strcat(s2,s[i]);
        if(strcmp(s1,s2)<0)
        {strcpy(s1,s[i]);strcpy(s[i],s[j]);strcpy(s[j],s1);}
    }
    for(i=0;i<n;i++)
    if(s[0][0]=='0'){printf("0");break;}//判断输入是否都为0,只要判断第一个是不是0;
    else printf("%s",s[i]);
    printf("\n");
    }
    return 0;
}

 zstu2514-computer arrangment

题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2514

解题报告:输入的每组开始结束时间 以结束时间进行从小到大排序,我这里用了sort对结构体进行排序,也可以写最朴素的冒泡。

View Code
#include<stdio.h>
#include<algorithm> //STL
using namespace std;
struct node
{
    int s,e;//s start ,e end
}a[1001];
bool cmp(node a,node b)
{
    return a.e<b.e;
}
int main()
{
    int T,i,j,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        scanf("%d",&a[i].s);
        for(i=0;i<n;i++)
        scanf("%d",&a[i].e);
        sort(a,a+n,cmp);  //sort排序
        int cnt=1,x=0,k=0;
        for(i=1;i<n;i++)
        {
        if(a[k].e<=a[i].s){cnt++;k=i;}
        }
        printf("%d\n",cnt);
    }
}

 

Hdu1009-FatMouse' Trade

 

View Code
#include<stdio.h>
#define maxn 1002
int F[maxn],J[maxn];
int main()
{
    int m,n,i,j;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        if(m==-1&&n==-1)break;
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&J[i],&F[i]);
        }
        for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
        if(J[i]*F[j]<J[j]*F[i])
        {
        int temp=J[i];J[i]=J[j];J[j]=temp;
            temp=F[j];F[j]=F[i];F[i]=temp;
        }
        double cnt=0;
        for(i=0;i<n;i++)
        {
            if(m<=F[i]){cnt+=(double)J[i]/F[i]*m;break;}
            else {cnt+=J[i];m-=F[i];}
        }
        printf("%.3f\n",cnt);
    }
    return 0;
}

 

 

 

 

posted @ 2012-05-31 23:07  To be an ACMan  Views(344)  Comments(0)    收藏  举报