第三届“传智杯”全国大学生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;
}