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

130921周赛结题报告

2017年11月16日 ⁄ 综合 ⁄ 共 5512字 ⁄ 字号 评论关闭

这是这学期第二次周赛的题目,第一周的题目略坑,还在研究中。

A. The area  

这道题题意是有一个开口向下的抛物线,与一条直线有两个交点,且交点位于抛物线顶点的两段。

给出两交点和顶点的坐标,求围成的面积。

就是一道简单的积分题。我写错了个变量,debug了很久。。sb了。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
    double x;
    double y;
};
double a,b,c;
double K,B;
node p[4];
double gao(double x)
{
    double s=0;
    s=a*x*x*x+b*x*x+c*x;
    return s;
}
int main ()
{
    int t,i;
    cin>>t;
    double area;
    while(t--)
    {
        for (i=1; i<=3; i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
//        for (i=1; i<=3; i++)
//            printf("%lf %lf\n",p[i].x,p[i].y);
        b=p[1].x;
        c=p[1].y;
        a=(p[2].y-c)/((p[2].x-b)*(p[2].x-b));
        c=a*b*b+c;
        b=(-2.0)*a*b;
        K=(p[3].y-p[2].y)/(p[3].x-p[2].x);
        B=p[3].y-K*p[3].x;
        b=b-K;
        c=c-B;
//        cout<<a<<" "<<b<<" "<<c<<" "<<K<<" "<<B<<endl;
        a=a/3;
        b=b/2;
//        cout<<a<<" "<<b<<" "<<c<<endl;
        area=gao(p[3].x)-gao(p[2].x);
        printf("%.2f\n",area);
    }
    return 0;
}

B. AC Me

一道水题,立马体现出了自己基本概念吃的不够透。。

一开始既然T了。。

代码就不贴了。。


C. 回文数猜想

好久没有敲题了,既然没有将用过的字符串清空。。蛋疼。。RE了两次。而且写的很麻烦,一开始思路不清晰

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctype.h>
using namespace std;
int map[1000000];
char a[15],b[15];
int len;
void change()
{
    int i,j=0;
    for (i=len-1; i>=0; i--)
        b[j++]=a[i];
    b[j]='\0';
}
int main ()
{
    int i,j,k,s,num1,num2;
    while(scanf("%s",a)!=EOF)
    {
        s=0;
        len=strlen(a);
        change();
        if (strcmp(a,b)==0)
        {
            sscanf(a,"%d",&num1);
            map[s++]=num1;
        }
        else
        {
            change();
            while(1)
            {
                sscanf(a,"%d",&num1);
                map[s++]=num1;
                if (strcmp(a,b)==0) break;
                sscanf(b,"%d",&num2);
                num1=num2+num1;
                memset(b,0,sizeof(b));
                memset(a,0,sizeof(a));
                i=0;
                while(num1>0)
                {
                    b[i++]=num1%10+'0';
                    num1=num1/10;
                }
                b[i]='\n';
                len=i;
                j=0;
                for (i=len-1; i>=0; i--)
                    a[j++]=b[i];
                a[j]='\n';
//                puts(a);
//                puts(b);
            }
        }
        cout<<s-1<<endl;
        for (i=0; i<s-1; i++)
            cout<<map[i]<<"--->";
        cout<<map[s-1]<<endl;
    }
    return 0;
}

D. Lake Counting

HDU 1282 水题

裸的DFS

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char map[105][105]={0};
int dir[8][2]={{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0}};
int n,m,visit[105][105]={0};
int in(int x, int y)
{
    if (x>=0 && x<n && y>=0 && y<m) return 1;
    return 0;
}
void dfs(int x, int y)
{
    int i,j,k,tx,ty;
    visit[x][y]=1;
    for (i=0; i<8; i++)
    {
        tx=x+dir[i][0];
        ty=y+dir[i][1];
        if (!visit[tx][ty] && in(tx,ty) && map[tx][ty]=='W')
        {
            dfs(tx,ty);
        }
    }
}
int main ()
{
    scanf("%d%d",&n,&m);
    int i,j,s=0;
    for (i=0; i<n; i++)
        for (j=0; j<m; j++)
            cin>>map[i][j];
    for (i=0; i<n; i++)
        for (j=0; j<m; j++)
            if (!visit[i][j] && map[i][j]=='W')
            {
                s++;
                dfs(i,j);
            }
    cout<<s<<endl;
    return 0;
}

E. A Bug's Life
POJ 2492 并查集

这道题还挺有意思的,主要是要建立一个数组来记录性别

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define maxn 2010
using namespace std;
int n,m,f[maxn]={0},sex[maxn]={0};
int find(int x)
{
    if (x==f[x]) return x;
    return (f[x]=find(f[x]));
}
void uni(int x, int y)
{
    x=find(x);
    y=find(y);
    f[x]=f[y];
}
int main ()
{
    int t,i,j,p=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for (i=1; i<=n; i++)
        {
            f[i]=i;
            sex[i]=0;
        }
        int flag=1;
        while(m--)
        {
            scanf("%d%d",&i,&j);
            int a,b;
            if (flag)
            {
                a=find(i);
                b=find(j);
                if (a==b) flag=0;
                else
                {
                    if (!sex[i]) sex[i]=j;
                    else uni(sex[i],j);
                    if (!sex[j]) sex[j]=i;
                    else uni(sex[j],i);
                }
            }
        }
        if (flag) printf("Scenario #%d:\nNo suspicious bugs found!\n",p++);
        else printf("Scenario #%d:\nSuspicious bugs found!\n",p++);
        cout<<endl;
    }
    return 0;
}

F 最短路

hdu 2544 最短路

裸题

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#define MAXN 105
#define INF 1000000
using namespace std;
int map[MAXN][MAXN];
int n,m;
void init()
{
    int i,j,k;
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=n; j++)
            map[i][j]=INF;
        map[i][i]=0;
    }
    while (m--)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if (map[a][b]>c)
        {
            map[a][b]=c;
            map[b][a]=c;
        }
    }
}
void dijkstra(int s, int e)
{
    int i,j,k;
    int dist[MAXN];
    int visited[MAXN];
    memset(visited,0,sizeof(visited));
    visited[s]=1;
    for (i=1; i<=n; i++)
        dist[i]=map[s][i];
    dist[s]=0;
    for (j=1; j<=n-1; j++)
    {
        int temp=INF;
        for (i=1; i<=n; i++)
            if (!visited[i] && dist[i]<temp)
            {
                temp=dist[i];
                k=i;
            }
        visited[k]=1;
        for (i=1; i<=n; i++)
            if (!visited[i] && dist[k]+map[k][i]<dist[i])
                dist[i]=dist[k]+map[k][i];
    }
    printf("%d\n",dist[e]);
}
void spfa(int s, int e)
{
    queue<int> q;
    int i,j,k;
    int dist[MAXN];
    int visited[MAXN];
    for (i=1; i<=n; i++)
        dist[i]=INF;
    dist[s]=0;
    memset(visited,0,sizeof(visited));
    visited[s]=1;
    q.push(s);
    while (!q.empty())
    {
        int x=q.front();
        q.pop();
        visited[x]=0;
        for (i=1; i<=n; i++)
        {
            if (dist[i]>dist[x]+map[x][i])
            {
                dist[i]=dist[x]+map[x][i];
                if (!visited[i])
                {
                    q.push(i);
                    visited[i]=1;
                }
            }
        }
    }
    printf("%d\n",dist[e]);
}
int main ()
{
    while (cin>>n>>m)
    {
        if (n==0 && m==0)
            break;
        init();
        spfa(1,n);
        //dijkstra(1,n);

    }
    return 0;
}

G Crossing Rivers
HDU 3232 数学

这就是一个简单的数学题。每次走到河流岸边时,(河流长度为L),那么分配到每个点的概率为1/(L+1)(因为是从0到L)。而每个点可以向左和向右动,仔细观察发现向左和向右的路径之和为恒定的值(2L)。

然后就很简单了。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main ()
{
    int n,d,i,j,pk=1,p,l,v;
    while(scanf("%d%d",&n,&d)!=EOF)
    {
        if (n==0 && d==0) break;
        double t=0;
        int s=d;
        while(n>0)
        {
            scanf("%d%d%d",&p,&l,&v);
            s-=l;
            t+=1.0*(l*l)/((l)*(v));
            t+=l*1.0/v;
            n--;
        }
        t+=s;
        printf("Case %d: %.3f\n\n",pk++,t);
    }
    return 0;
}

H Jungles Road

裸的最小生成树

POJ 1251 MST

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 10000
using namespace std;
int map[27][27]={0};
int n,s;
void init()
{
    int i,j,t;
    char ch;
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
            map[i][j]=INF;
        map[i][i]=0;
    }
    for (i=0; i<n-1; i++)
    {
        cin>>ch>>t;
        while(t>0)
        {
            cin>>ch>>j;
            map[i][ch-'A']=map[ch-'A'][i]=j;
            t--;
        }
    }
}
void prime()
{
    int i,j,k=0;
    s=0;
    int visit[30]={0};
    int low[30]={0};
    for (i=0; i<n; i++)
        low[i]=map[0][i];
    visit[0]=1;
    for (i=1; i<n; i++)
    {
        int t=INF;
        for (j=0; j<n; j++)
            if (!visit[j] && low[j]<t)
            {
                k=j;
                t=low[j];
            }
        s=s+low[k];
        visit[k]=1;
        for (j=0; j<n; j++)
            if (!visit[j] && low[j]>map[k][j])
                low[j]=map[k][j];
    }
    cout<<s<<endl;
}
int main ()
{
    while(scanf("%d",&n)!=EOF)
    {
        if (n==0) break;
        init();
//        for (int i=0; i<n; i++)
//        {
//            for (int j=0; j<n; j++)
//                cout<<map[i][j]<<" ";
//            cout<<endl;
//        }
        prime();
    }
    return 0;
}

I Knight Moves
HDU 1372 BFS

这道也是很基础的BFS。做过挺多次了 不贴代码了

抱歉!评论已关闭.