备战天梯赛-计算机唐计队训练赛01 A-F题解

备战天梯赛第一场 题解

by fengyuming233

A HDU5702 结构体排序

一个很基本的简单的知识点,不会请自行百度

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#define each(a,b,c) for(int a=b;a<=c;a++)//宏定义 简化for循环
#define de(x) cout<<#x<<" "<<(x)<<endl;
const int maxn = 15;
const int INF = 0x3f3f3f3f;
using namespace std;
struct node
{
    char color[15];
    int num;

}a[15];
bool cmp(node a, node b)//自己定义排序标准
{
    return a.num > b.num;
}

int main()
{

    int T;
    scanf("%d", &T);
    
    while (T--)
    {
        int n;
        scanf("%d", &n);
        each(i, 1, n)
        {
            scanf("%s", a[i].color);
            scanf("%d", &a[i].num);
        }
        sort(a + 1, a + 1 + n, cmp);
        each(i, 1, n)
        {
            printf("%s", a[i].color);
            if (i == n)printf("\n");//注意输出格式,最后一个是回车,其他都是空格
            else printf(" ");
        }

    }
   
}

B HDU1034 沙雕模拟题

这种模拟题很受天梯赛的待见啊,毕竟不用看着模板敲,着重练习这类题



#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#define each(a,b,c) for(int a=b;a<=c;a++)
#define de(x) cout<<#x<<" "<<(x)<<endl;
const int maxn = 1e3+5;
const int INF = 0x3f3f3f3f;
int a[maxn];
int temp[maxn];


int n;
int ans1 = 0;
int ans2 = 0;
bool check()
{
    int flag = 1;
    each(i, 0, n - 1)
    {
        int nxt = (i + 1) % n;
        if (a[i] != a[nxt])flag = 0;
    }
    if (flag)ans2 = a[0];
    return flag;
}
int main()
{
    
    while (scanf("%d", &n) != EOF&&n)
    {
        each(i, 0, n - 1)
        {
            scanf("%d", &a[i]);
        }
        ans1 = 0;
        while (1)
        {
            if (check())break;
            ans1++;
            each(i, 0, n - 1)
            {
                int nxt = (i + 1) % n;
                temp[nxt] = a[i] / 2;
                a[i] = a[i] / 2;
            }
            each(i, 0, n - 1)
            {
                a[i] += temp[i];
                temp[i] = 0;
                if (a[i] % 2)a[i]++;
            }

        }
        printf("%d %d\n", ans1, ans2);

    }
    return 0;
}

C HDU1412 set的简单实用

STL是重要的工具,请务必学会set map priority queue stack vector的用法

点我进行学习

int main()
{
    int a,b;int num;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        set<int>s;
        while(a--)
        {
            cin>>num;
            s.insert(num);
        }
        while(b--)
        {
            cin>>num;
            s.insert(num);
        }
        set<int>::iterator it;
        int cnt=s.size();
        for(it=s.begin();it!=s.end();it++){
            printf("%d",*it);
            if(cnt-->1)
                printf(" ");
        }
        puts("");
    }
}

D CF1077B 贪心

此题目标在于消灭101这样的序列,所以你从左到右扫描时,如果发现101的序列,你只能立即破坏它,消去1个1,如果你消去左边的1,那么不会对后面的序列造成任何影响,如果你消去右边的1,就可能破坏了右边的一个新的101序列,所以每次发现101序列时将其转化为100,就可以使利益最大化

贪心也有可能考到

#define _CRT_SBCURE_NO_DEPRECATE
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <bitset>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define ll long long
#define mm0(a) memset(a,0,sizeof(a))
#define mm(a,b) memset(a,b,sizeof(a))
#define each(a,b,c) for(int a=b;a<=c;a++)
#define de(x) cout << #x << " " << x <<endl
#define rush() int T;scanf("%d",&T);each(kase,1,T)
#define scan(a,b) scanf("%d%d",&a,&b)
#define fin(a) scanf("%d",&a)
using namespace std;



inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}

using namespace std;

const int maxn = 110;
int a[maxn];

const int INF = 0x3f3f3f3f;

int main()
{
    int n;
    fin(n);
    each(i,1,n)
    {
        fin(a[i]);
    }
    int cnt=0;
    each(i,2,n-1)
    {
        if(a[i-1]==1&&a[i+1]==1&&a[i]==0)
        {
            a[i+1]=0;
            cnt++;
        }
    }
    printf("%d\n",cnt);
    return 0;
 } 

E HDU2084 数塔 教科书上的动态规划例题

自底向上选择两个儿子中的较大的即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <cmath>
#include <string.h>

using namespace std;
int a[101][101],d[101][101];
int main()
{
    int t,l,i,j;
    scanf("%d",&t);
    while(t--){
        memset(d,0,sizeof(d));
        scanf("%d",&l);
        for(i=1;i<=l;i++)
            for(j=1;j<=i;j++)
            scanf("%d",&a[i][j]);
            for(i=1;i<=l;i++)
                d[l][i]=a[l][i];
        for(i=l-1;i>=1;i--)
        for(j=1;j<=i;j++){
            d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
        }
        printf("%d\n",d[1][1]);
    }
    return 0;
}

F 搜索 mdPOJ崩了没法测试不过应该没有写错

注意方向的写法 visit数组的应用 每轮注意清空visit数组并把全局变量cnt置0

如果没有超界 没有撞墙,则可以继续dfs

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#define each(a,b,c) for(int a=b;a<=c;a++)
#define de(x) cout<<#x<<" "<<(x)<<endl;
const int maxn = 1e3+5;
const int INF = 0x3f3f3f3f;
using namespace std;
char a[25][25];
int vis[25][25];
char c;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };
int cnt = 0;
int m, n;
void dfs(int x, int y)
{
    //de(x);
    //de(y);
    if (vis[x][y])return;
    vis[x][y] = 1;
    cnt++;
    each(i, 0, 3)
    {
        int nx = x +dx[i];
        int ny = y + dy[i];
        //de(nx);
        //de(ny);
        if (a[nx][ny] != '#'&&nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny])
        {
            dfs(nx, ny);
        }
    }
    return;
}
int main()
{
    
    while (scanf("%d%d", &m, &n) != EOF&&(m||n)) {
        cnt = 0;
        getchar();//吃掉那个回车
        memset(vis, 0, sizeof(vis));
        int sx, sy;

        each(i, 1, n)
        {
            each(j, 1, m)
            {
                scanf("%c", &a[i][j]);
                if (a[i][j] == '@')
                {
                    sx = i;
                    sy = j;
                }
            }
            getchar();//注意去掉空格
        }
        dfs(sx, sy);
        printf("%d\n", cnt);
        /*
        each(i, 1, n)
        {
            each(j, 1, m)
            {
                printf("%c", a[i][j]);
            }
            printf("\n");
        }*/

    }
    return 0;
}

这场比赛十分经典,再刷新题之前,不会的题目一定要弄懂,一定要亲手AC!!!
加油!为我吉争光!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。