start。总结

   part1。——start

            今天acm院赛告一段落了,这就算做一个开始吧。挺奇葩的昨天预赛在大二大三组的比赛排第六。今天在大一组决赛还是第六,惨痛的被虐。最后得了二等+最佳女生,算是对最近一段时间的一个交代吧。不知道现在算不算是入门了,接下来还有校团队赛。估计得打酱油了,不抱太大希望。近一段时间尽力就好吧。

  part。——总结

                

                 总结一下吧。A题:求字符串长度。水题。为了不挂0。3分23秒的。手速还是不够快啊!说好的抢第一呢。

                                       B题:走楼梯
        Cloud非常喜欢走楼梯,所以Cloud一有机会就练习走楼梯。刚开始的时候Cloud只能一次上一层,由于练习量巨大,一段时间之后Cloud练成了一次上两层和一次上三层的神技.然后Cloud依然非常刻苦地练习,不断增加难度。现在他要在小伙伴们的帮助下练习走放有障碍物的楼梯。Cloud位于一段高为n层的楼梯的第1层,他的目标是到达第n层。其中有m层楼梯上被放置了障碍物,如果某层楼梯放置了障碍物那么Cloud无法到达该层,但是可以越过。Cloud现在可以一次上一层或两层或三层,他想知道,他是否可以到达目的地(恰好到达第n层)。

输入
多组输入数据,对于每组数据
第一行两个整数,n,m(0<n<100,0<=m<100)
第二行有m个整数,分别表示放有障碍物的层数,均可以用int表示。

输出
对于每组数据,如果Cloud可以到达目的地,输出YES,否则输出NO

样例输入
7 2
5 2

5 3
2 3 4

样例输出
YES
NO

有障碍物的层数是无法到达的。

手速还是个渣。思路很好找。最不该的是用C++的sort排序的提交时忘记选择c++用的c结果罚时20分钟啊啊。不该啊。

#include<stdio.h>
#include<algorithm>
using namespace std;
int str[111111];
int main(){
    int n,m;

    while(scanf("%d %d",&n,&m)!=EOF){
        int flag=0;
        for(int i=0;i<m;i++){
            scanf("%d",&str[i]);
            if(str[i]==n)flag=1;
        }
        sort(str,str+m);
        for(int i=2;i<m;i++){
            if(str[i]-str[i-1]==1&&str[i-1]-str[i-2]==1)flag=1;
        }
        if(flag)printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}


             题C:缺德的冒泡排序。只怪自己基本功不好。循环体是n-1不是n。提交了了四次错误。坑爹了。看着WA心都寒了。

zax与冒泡排序
在学习了C语言一段时间之后,zax开始学习最简单的算法,其中之一便是冒泡排序,为了透彻理解冒泡排序,zax决定尝试写出2种冒泡排序的代码,一种是将一个长度为n的序列进行升序排列,另外一种是降序排列。zax是一个爱钻牛角尖的人,所以他还要求出每种的交换次数。

输入
多组数据,对于每组数据
第一行一个整数n(0<n<100)
第二行n个整数,均可以用int表示且不重复。

输出
输出冒泡排序得到升序序列需要的交换次数和得到降序排列需要的交换次数,中间以空格分隔,最后换行。

样例输入
5
1 2 3 5 4
5
1 2 3 4 5

样例输出
1 9
0 10

#include<stdio.h>
int main(){
    int str[111];
    int s1[111],s2[111];
    int n;

    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d",&str[i]);
            s1[i]=str[i],s2[i]=str[i];
        }
        int i,j;//sheng
        int ans1=0,ans2=0,tmp;
        for (i = 0; i < n-1; i++) {
            for (j = n - 1; j > i; j--) {
                if (s1[j] < s1[j-1]) {
                tmp = s1[j-1];
                s1[j-1] =  s1[j];
                s1[j] = tmp;
                ans1++;
                }
            }
        }
        for (i = 0; i < n-1; i++) {
            for (j = n - 1; j > i; j--) {
                if (s2[j] > s2[j-1]) {
                tmp = s2[j-1];
                s2[j-1] =  s2[j];
                s2[j] = tmp;
                ans2++;
                }
            }
        }

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



                         题D:面值问题。最后20秒交了一次。结果还是错的。觉得自己的思路有点诡异。

多少种面值
现在你拥有1元,2元,5元的纸币n,m,k张。
问这些钱币可以组成的大于0的面值有多少种

输入
多组输入,每组三个整数n,m,k(0<n,m,k<300);

输出
能够组成大于0的面值的种数。

样例输入
1 1 1

样例输出
7
这是正确答案:

#include<stdio.h>
#include<string.h>
int vis[111111];
int main(){
    int n,m,a;

    while(scanf("%d %d %d",&n,&m,&a)!=EOF){
        memset(vis,0,sizeof(vis));
        for(int i=0;i<=n;i++){
            for(int j=0;j<=m;j++){
                for(int k=0;k<=a;k++){
                    vis[i*1+j*2+k*5]=1;
                }
            }
        }
        int ans=0;
        for(int i=1;i<=50000;i++){
            ans=ans+vis[i];
        }
        printf("%d\n",ans);
    }
    return 0;
}


我的神坑思路是:1元2元5元可以组成1元2元3元4元5元之后也是这样组成的。所以5是个循环体。把从1到n+2*m+5*a的数将组成不了的扣除。就是种数。比如说 n=1,m=1,a=1;那么组成不了4,他们的和是8 所以是8-1=7;

总结这个思路不知道可能是写的问题却少限制吧。改天重写试试。

                       题E:玩骰子。就是求输入一个数对面的数,还给了Hint说是两个数的和是固定的,所以7分钟秒过。

                       题F:评奖学金
现在有n个学生m门课程的分数,学分。
一个学生在一门课程的分权为该门课程的得分*该门课程的学分
一个学生的学习成绩为他全部课程的分权和/全部课程学分和
现在规定,一个学生可以获得奖学金的条件是学习成绩不小于70并且无挂科(某门课程得分<60)

输入
多组输入,对于每组数据,第一行两个整数n,m(0<n,m<10)
然后有n行,每行有m个数字,代表一个学生的m门课程的成绩。(第一个数字代表第1门课程的成绩)
最后一行m个数字,代表对应下标的课程的学分数(第一数字代表第一门课程的学分)
保证输入数据合法。

输出
输出可以获得奖学金的人数然后换行。

样例输出
3 2
75 75
69 69
59 100
2 2

样例输出
1

这题用结构体。结果一次AC。没想到啊没想到。

#include<stdio.h>
struct ss{
    int s[20];
    double sum;
    int flag;
}a[111];
int main(){
    int n,m,ok[111];

    while(scanf("%d %d",&n,&m)!=EOF){
        int all=0;
        for(int i=0;i<n;i++){
            a[i].sum=0,a[i].flag=0;
            for(int j=0;j<m;j++){
                scanf("%d",&a[i].s[j]);
                if(a[i].s[j]<60)a[i].flag=1;
            }
        }
        for(int i=0;i<m;i++){
            scanf("%d",&ok[i]);
            for(int j=0;j<n;j++){
                a[j].sum+=a[j].s[i]*ok[i];
            }
            all+=ok[i];
        }
        int ans=0;
        for(int i=0;i<n;i++){
            a[i].sum=a[i].sum/all;
            if(a[i].sum>=70&&!a[i].flag)ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}


                              题G:Hill在玩一个卡片游戏,在这个游戏中,桌面上一共有n张卡片,每张卡片的正面和背面分别有一个非负整数a,b。通过选择卡片增加所拥有的权值。一开始Hill只有一次选择的机会,当Hill选择了卡片i时,他所拥有的权值将会增加ai,他可以选择次数将会增加bi,然后因为他选择了一张卡片,所以他可以选择的次数将减少一次。现在Hill想知道,他最多可以得到多大的权值。

输入
多组数据,对于每组数据
第一行一个正整数 n(0<n<100)
第二行n个正整数代表ai(0<i<=n,0<=ai<1000)
第三行n个正整数代表bi(0<i<=n,0<=bi<1000)

输出
输出Hill所能获得的最大权值和,然后换行。

样例输入
2
1 0
2 0
样例输出
2
没思路,主动放弃了。

贴上答案吧:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct ss{
    int x,y;
}a[1111];
int cmp(ss a,ss b){
    if(a.y==b.y)return a.x>b.x;
    else return a.y>b.y;
}
int main(){
    int n;
   // freopen("in.txt","r",stdin);
   // freopen("out.txt","w",stdout);
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d %d",&a[i].x,&a[i].y);
        }
        sort(a,a+n,cmp);
        int now=1,sum=0;
        for(int i=0;i<n;i++){
            sum+=a[i].x,now=now-1+a[i].y;
            if(now==0)break;
        }
        printf("%d\n",sum);
    }
    return 0;
}


              题H:Tida非常喜欢玩棋类游戏,他自己发明了一种棋的玩法。这种棋玩法中有两个骑士,骑士这种棋子的移动方式比较特别,一共有四种移动方式:
向前上移动两格然后向左移动两格;
向前上移动两格然后向右移动两格;
向前下移动两格然后向左移动两格;
向前下移动两格然后向右移动两格;
在一个8*8的棋盘上Tida放置了两个骑士,每次将两个骑士按照上述规则同时进行移动,在一些移动后两个骑士可能会同时停留到了同一格子上。为了增加难度,Tida用“#”标记了棋盘上的一些格子,如果两个骑士在在标记的格子上相遇将被视为无效,现在的问题是,对于给定的一个局面,经过一些移动后两个骑士是否可以在非“#”的格子相遇。骑士不能移动到棋盘之外。

输入
多组数据,对于每组数据
包含8行,表示棋盘。
其中“k”表示骑士,“.”表示空地,“#”表示被标记的格子

输出
如果经过一些移动后,两个骑士可以在非“#”的格子相遇,输出YES,否则输出NO。

样例输入
........
........
......#.
...##..#
.......#
...##..#
......#.
K...K...


样例输出
YES

hint 骑士每次移动结束时的相遇才有效,移动过程中的相遇无效。

                   防AK的一道题,对我们大一的来说够够的了。要用到搜索。还需要学啊。

     

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct ss{
    int x,y;
}a[1111111],tp,zz;
char str[111][111];
int vis[11][11];
int vis2[11][11];
int main(){
    int t;
   // freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

   // t++;
   while(scanf("%s",&str[0])!=EOF){
        for(int i=0;i<8;i++){
            scanf("%s",&str[i]);
        }
        int x1,y1,x2,y2,flag=0,ok=0;
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                if(str[i][j]=='K'){
                    if(flag)x2=i,y2=j;
                    else x1=i,y1=j;
                    flag++;
                }
            }
        }
        tp.x=x1,tp.y=y1;
        queue<ss>q;
        memset(vis,0,sizeof(vis));
        vis[x1][y1]=1;
        q.push(tp);
        while(q.size()){
            tp=q.front(),q.pop();
            if(tp.x+2<8&&tp.y+2<8&&!vis[tp.x+2][tp.y+2]){
                zz.x=tp.x+2,zz.y=tp.y+2,vis[tp.x+2][tp.y+2]=vis[tp.x][tp.y]+1;
                q.push(zz);
            }
            if(tp.x+2<8&&tp.y-2>=0&&!vis[tp.x+2][tp.y-2]){
                zz.x=tp.x+2,zz.y=tp.y-2,vis[tp.x+2][tp.y-2]=vis[tp.x][tp.y]+1;
                q.push(zz);
            }
            if(tp.x-2>=0&&tp.y+2<8&&!vis[tp.x-2][tp.y+2]){
                zz.x=tp.x-2,zz.y=tp.y+2,vis[tp.x-2][tp.y+2]=vis[tp.x][tp.y]+1;
                q.push(zz);
            }
            if(tp.x-2>=0&&tp.y-2>=0&&!vis[tp.x-2][tp.y-2]){
                zz.x=tp.x-2,zz.y=tp.y-2,vis[tp.x-2][tp.y-2]=vis[tp.x][tp.y]+1;
                q.push(zz);
            }
        }
        tp.x=x2,tp.y=y2;
        queue<ss>q2;
        memset(vis2,0,sizeof(vis2));
        vis2[x2][y2]=1;
        q2.push(tp);
        while(q2.size()){
            tp=q2.front(),q2.pop();
            if(tp.x+2<8&&tp.y+2<8&&!vis2[tp.x+2][tp.y+2]){
                zz.x=tp.x+2,zz.y=tp.y+2,vis2[tp.x+2][tp.y+2]=vis2[tp.x][tp.y]+1;
                q2.push(zz);
            }
            if(tp.x+2<8&&tp.y-2>=0&&!vis2[tp.x+2][tp.y-2]){
                zz.x=tp.x+2,zz.y=tp.y-2,vis2[tp.x+2][tp.y-2]=vis2[tp.x][tp.y]+1;
                q2.push(zz);
            }
            if(tp.x-2>=0&&tp.y+2<8&&!vis2[tp.x-2][tp.y+2]){
                zz.x=tp.x-2,zz.y=tp.y+2,vis2[tp.x-2][tp.y+2]=vis2[tp.x][tp.y]+1;
                q2.push(zz);
            }
            if(tp.x-2>=0&&tp.y-2>=0&&!vis2[tp.x-2][tp.y-2]){
                zz.x=tp.x-2,zz.y=tp.y-2,vis2[tp.x-2][tp.y-2]=vis2[tp.x][tp.y]+1;
                q2.push(zz);
            }
        }
       for(int i=0;i<8;i++){
         for(int j=0;j<8;j++){
            if(vis[i][j]&&vis2[i][j]&&str[i][j]!='#'){
                if(vis[i][j]%2==0&&vis2[i][j]%2==0)ok=1;
                if(vis[i][j]%2==1&&vis2[i][j]%2==1)ok=1;
            }
         }
       }
        if(ok)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


                      说完了题。总结下比赛情况吧。现场当时有点混乱,可能是弄气球的缘故。所以,A E题水过之后心态很不稳定。加上不知道应该先从哪道题下手。大脑处于空白,没状态。准备不够充分,结构体好久不用了,都不会用了。先翻的书。然后,尼玛赛场上没准备水,干下一瓶矿泉水之后渴死了。以后比赛一定要准备充足的水源。再就是太爱看排名了。思路总断,看到别人AC了哪道题自己扔下手中的题跟着做别人AC了,导致自己刚才做的又忘记了。看过高年级组的题之后我还是深深的觉得还是高年级组的题简单。短小英语题最爱啊。可惜这次我们都是汉字题,需要耐下性子去看题。看题很费事。幸好有纸质题册。

                      算是一个小阶段的结果吧。等待下次团队赛。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值