[HDU] week2

杭电链接

1004.Let the Balloon Rise

#include<stdio.h>
#include<string.h>

int main(void)
{
    
    
    char color[1001][25];
    int max, count[1001], i, j, n, k;
    while (scanf("%d", &n) && n != 0)
    {
    
    
        for (i = 0; i < n; i++)
            scanf("%s", &color[i]);//把字符串存进数组
        for (i = 0; i < n; i++)
            count[i] = 0;
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                if (strcmp(color[i], color[j]) == 0)//简单的俩俩比对
                    count[i]++;//统计出现次数
        max = 0, k = 0;
        for (i = 0; i < n; i++)//找最大
            if (max < count[i])
            {
    
    
                max = count[i];
                k = i;
            }
        printf("%s\n", color[k]);
    }
    return   0;
}

C语言输入比较字符串
getchar()

C++的vector的用法,动态数组,容器
参考

Time Limit : 2000/1000ms (Java/Other) ,一组测试数据计算加减乘除的次数不能超过10^8

1008.Elevator

#include <stdio.h>
#include <stdlib.h>

int main()
{
    
    
    int i,sum,n=0;
    int a[100];
    while(scanf("%d",&n)!=0&&n!=0){
    
    
        a[0]=0;
        sum=0;
        for(i=1;i<=n;i++){
    
    
            scanf("%d",&a[i]);
            if(a[i]>a[i-1]){
    
    
                sum=sum+(a[i]-a[i-1])*6+5;
            }else{
    
    
                sum=sum+(a[i-1]-a[i])*4+5;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

1009.FatMouse’ Trade

贪心算法:

#include<stdio.h>
#include<stdlib.h>

const int MAXN = 1010;
struct node
{
    
    
    double j,f;
    double r;
}a[MAXN];
int cmp(const void *a,const void *b)//从大到小排序 
{
    
    
    struct node *c=(node *)a;
    struct node *d=(node *)b;
    if(c->r > d->r) return -1;
    else return 1;
}    
int main()
{
    
    
    int N;
    double M;
    double ans;
    while(scanf("%lf%d",&M,&N))
    {
    
    
        if(M==-1&&N==-1) break;
        for(int i=0;i<N;i++)
        {
    
    
           scanf("%lf%lf",&a[i].j,&a[i].f);
           a[i].r=(double)a[i].j/a[i].f;
        }    
        qsort(a,N,sizeof(a[0]),cmp);
        ans=0;
        for(int i=0;i<N;i++)
        {
    
    
            if(M>=a[i].f)
            {
    
    
                ans+=a[i].j;
                M-=a[i].f;
            }    
            else 
            {
    
    
                ans+=(a[i].j/a[i].f)*M;
                break;
            }    
        }   
        printf("%.3lf\n",ans); 
    }    
    return 0;
}    

1711.Number Sequence

KMP算法:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define  N 1000005
char S[N],T[N];
int nex[N],slen,tlen,a[N],b[N];
void getnext()
{
    
    
    int i=-1,j=0;
    nex[0]=-1;
    while(j<tlen)
    {
    
    
        if(i==-1||b[i]==b[j]) nex[++j]=++i;
        else i=nex[i];
    }
}
int KMP_index()
{
    
    
    int i=0,j=0;
    while(i<slen&&j<tlen)
    {
    
    
        if(j==-1||a[i]==b[j]) {
    
    i++;j++;}
        else j=nex[j];
    }
    if(j==tlen) return i-tlen+1;
    return -1;
}
int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--)
    {
    
    
        scanf("%d%d",&slen,&tlen);
        for(int i=0;i<slen;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<tlen;i++)
            scanf("%d",&b[i]);
        memset(nex,0,sizeof(nex));
        getnext();
        printf("%d\n",KMP_index());
    }
    return 0;
}

1071.The area

定积分:公式解答

#include<stdio.h>
int main()
{
    
    
	double x1,x2,x3,y1,y2,y3;
	double k,t,a,b,c,s1,s2;
	int n;
	while(scanf("%d",&n)!=EOF)
	{
    
    
		while(n--)
		{
    
    
			scanf("%lf %lf %lf %lf %lf %lf",&x1,
		           &y1,&x2,&y2,&x3,&y3);
			k=(y3-y2)/(x3-x2);
			t=y3-k*x3;
			a=(y2-y1)/((x1-x2)*(x1-x2));
			b=-2*x1*a;
			c=y1-a*x1*x1-b*x1;
			s1=1.0/3*a*x2*x2*x2+1.0/2*(b-k)*x2*x2+(c-t)*x2;
			s2=1.0/3*a*x3*x3*x3+1.0/2*(b-k)*x3*x3+(c-t)*x3;
			printf("%.2f\n",s2-s1);
		}
	}
	return 0;
}

1060.Leftmost Digit

参考
考察数学思维:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    
    
    int t,n;
    double m,dec;
    scanf("%d",&t);
    while(t--){
    
    
        scanf("%d",&n);
        m=n*log10(n);
        dec=m-(long long int)m;//指数的小数部分
        printf("%d\n",(int)pow(10.0,dec));//10^dec
    }
    return 0;
}

1030.Delta-wave

参考1
参考2

参考2代码:

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

int main(){
    
    
    int a,b;
    int aLayer,bLayer;
    int aX,aY,bX,bY;
    int distance;

    while(cin >> a >> b){
    
    
        aLayer = ceil(sqrt(a));
        bLayer = ceil(sqrt(b));

        if(aLayer == bLayer)
            distance = b - a;
        else{
    
    
            aX = (aLayer * aLayer - a) / 2;
            aY = aLayer - (aLayer * aLayer - a + 1) / 2 - 1;
            bX = (bLayer * bLayer - b) / 2;
            bY = bLayer - (bLayer * bLayer - b + 1) / 2 - 1;

            distance = abs(aX - bX) + abs(aY - bY) + abs(aLayer - bLayer);
        }

        cout << distance << endl;
    }
}

1178.Heritage from father

题目解析:
在这里插入图片描述

#include<stdio.h>
#include<math.h>
int main()
{
    
    
    int n, m;
    double sum, result;
    while(scanf("%d",&n)== 1 && n)
    {
    
    
        sum = 1.0 * n * (n+1) * (n+2) / 6;
        m = (int)log10(sum);
        result = sum/pow(10,m);
        printf("%.2lfE%d\n", result, m);
        //printf("%.3e",result);
    }
    return 0;
}

C语言输出双精度数
科学计数法:%e
保留有效数字:若规定整数p位,小数部分q位 用%p.qf 输出

猜你喜欢

转载自blog.csdn.net/Jingle_dog/article/details/120298814
今日推荐