第三届“传智杯”全国大学生IT技能大赛(初赛B组)个人题解

题也不算难,因为第一次打比赛,所以也有失误 。

总结

这次算是第一次在洛谷OJ打比赛,之前一直在LeetCode刷题,这两个平台提交代码类型不一样,

导致我没有适应过来洛谷的比赛环境,所以一直在疯狂出错,而比赛提交错误又有罚时,所以...

总结了一下自己的不足:

  • 比赛环境不熟悉导致程序一些库的调用、一些语法细节错误

  • 做题过程中太过着急,导致了程序没有验证就提交

  • 因为题目主办方数据的错误,导致一直在纠结题而错过了后面的题的计算(这不是我的锅)

题解

  • 第一题

!

这算是一道热身题吧~直接写就Vans

题解如下:

#include<iostream>
using namespace std;
int main()
{
   int n,v,m,a;
   cin>>n>>v>>m>>a;
   int sum=0;
   int lost=n%m;
   for(int i=0;i<(n/m);i++)
   {
      sum+=(v*m);
      v=v+a;
   }
   sum+=(lost*v);
   printf("%d",sum);
   return 0;
}
  • 第二题

!

但是这道题有一个BUG

就是按照题目的意思来做的话,会出现这样的一个现象:

如果分数为36~60这个区间,绩点居然比考60分的高?

(WTF ?那干脆不及格算了,还要什么60分万岁)

刚开始我就没想到这个点,认为了36~60这个区间的绩点是1.0

呵呵。。你不知道我这道题罚时了多少

题解如下:

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
   int sco;
   cin>>sco;
   if (sco>90)
   {
      float c=4.0f;
      printf("%.1f",c);
   }
   else if(sco>=60)
   {
      float l=4.0f-(90-sco)*0.1f;
      printf("%.1f",l);
   }
   else
   {
      float c=(float)sqrt(sco)*10;
      int a=(int)c;
      float l=4.0f-(90-a)*0.1f;
      a >= 60?printf("%.1f", l):printf("%.1f", 0.0f);
   }
   return 0;
}
  • 第三题

!

思路是挺简单的,创建一个二维数组然后无脑sort函数就行了。

注意判断贡献度、工作时间、志愿者编号就OK了。

题解如下:

#include<iostream>
#include<algorithm>
#include<vector>
int main()
{
   int n;
   scanf("%d",&n);
   std::vector<std::vector<int>>num(n,std::vector<int>(3));
   for (int i=0;i<n;i++)
   {   
      num[i][0]=i+1;
      scanf("%d  %d",&num[i][1],&num[i][2]);
   }
   sort(num.begin(),num.end(),[&](const std::vector<int>&a,const std::vector<int>&b)
   {
      if ((a[1]*a[2])==(b[1]*b[2]))
         return a[2] == b[2]? a[0] < b[0]:a[1] > b[1];
      else
         return (a[1]*a[2])>(b[1]*b[2]);
   });
   for(int i=0;i<n;i++)
      printf("%d ",num[i][0]);
   return 0;
}
  • 第四题

!

各单位注意!!本次比赛最“坑”的题目出现了,注意躲避

怎么坑呢?主办方数据给错了。导致你就算是正确的答案都没办法通过

而傻傻的我~独自在寒风中和这道题硬刚了一个小时

结果就是纵使我的答案是正确的,但是这道题一直没做出来,而且导致最后一道题也没时间做了。。。。

(原来我才是那个小丑🤡)

题解如下:

#include<iostream>
#include<string>
#include<math.h>
#include<vector>
#include<sstream>
using namespace std;
int main()
{
   string si;
   getline(cin, si);
   vector<string>q;
   int c=atoi(si.c_str());
   for(int i=0;i<c;i++)
   {
      string s;
      getline(cin,s);
      vector<string>l;
      string result;
      stringstream input(s);
      while (input >> result)
         l.push_back(result);
      if(l[0]=="touch")
      {
         string c = l[1];
         q.push_back(c);
      }
      else if(l[0]=="rename")
      {
         for(int i=0;i<q.size();i++)
            if (q[i] == l[1])
		    q[i] = l[2];
      }
      else if (l[0] == "ls")
      {
         if (q.size() == 0) 
            cout << " " << endl;
	else
	   for (int i = 0; i < q.size(); i++)
	      cout << q[i] << endl;
      }
      else if (l[0] == "rm")
      {
         for (auto it = q.begin(); it != q.end();)
            *it == l[1]?it = q.erase(it):++it;
      }
   }
   return 0;
}

题解在输入数据的那段代码有瑕疵,我当时过多的纠结输入的问题了

(因为我以为不通过程序是输入的原因)

不过嘛,瑕不掩瑜~~凑合看看

  • 第五题

!

好了,到了这道因为时间而没做的题目了。

在比赛结束后,我研究了一下这道题

思路挺简单的,DFS模拟每次摇骰子就可以了

注意骰子总数是long long int 类型

题解如下:

#include<iostream>
#include<math.h>
using namespace std;
int n, k; 
void dfs(long long int num,int &count,int res)
{
   if (res==n)
   {
      if(num%k==0)
	  count =(count+1)% 1000000007;
   }
   else
   {
      res++;
      for (int i=1;i<=6;i++)
	  dfs(num * 10+i,count,res);
   }
}
int main()
{
   cin >>n>>k;
   int count=0;
   dfs(0,count,0);
   cout <<count;
   return 0;
}

这次算是给自己提升一下比赛经验吧,希望下次不会再当小丑🤡了