第二届传智杯全国大学生IT技能大赛

在家闲着没事于是就参加了这个比赛,于是水一篇(逃

第一题:思路模拟即可,注意四舍五入

题目描述

某大学的《软件工程》必修课分为理论和实践部分。理论部分由该校教授完成授课;而实践部分是由第三方的公司主导,需要同学们在五周时间内自学 HTML、css、JavaScript、vue、Python、django 等技术,并组队完成一个真实的互联网商业应用。

参与这个课程的有 n(0《=n 《= 1000)n(0n1000) 个学生,分成了不超过 2626 个队伍,每个队伍用 A 到 Z 来表示。每个队伍都会完成一个项目,并以队伍为单位,给所有队伍(包括自己队伍)打分,范围是 00 到 100 的整数。

为了平息学生对这门课产生的出多问题的不满(比如工作量太大、时间过于紧张、考核方式不公平等),老师决定使用一种“看起来”很公平的方式来决定每组队伍的项目得分:

对于某个队伍,首先计算所有队伍(包括自己)给这个队伍评分的平均值,然后剔除掉和这个平均值差别超过 1515 分的评分(保证不会出现所有的评分全部被剔除的情况),最后再对剩余的评分求平均值,四舍五入取整后作为这个队伍的项目得分。

对于每一个同学,我们已经得知他们的队伍代号和理论成绩(也是 0 到 100 分的整数)。这位同学的最后得分就是 60% 的理论成绩加上 40% 的所在队伍的项目得分,然后四舍五入取整。

现在老师想知道所有同学的分数排行。请按最后得分从高到低的顺序,输出每位同学的得分和他所在的队伍。

输入格式

第一行两个整数 nn 和 kk,分别表示学生数和队伍数。

接下来 nn 行,每行一个整数 s_isi 和一个大写字母 c_ici,表示第 ii 个选手的理论分数和队伍编号。保证队伍编号范围是从 A 开始后连续 kk 个字母中的一个。

接下来 kk 行,每行 kk 个整数。其中第 ii 行第 jj 列的整数 a_{i,j}ai,j 表示第 ii 个队伍给第 jj 个队伍的评分,当 i=ji=j 时,就是自评。

输出格式

输出 nn 行表示答案,得分高的同学优先输出,得分相同时队伍编号较小的同学优先输出。对于每一行,先输出这位同学成绩,然后输出代表他的队伍编号的大写英文字母。

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,k;
int b[27][27];
double s1[27]; //第一次取平均值
int s2[27]; //第二次取平均值

struct student{
int score;
char temp;
int zongfen;
};
bool cmp(student x,student y){
if(x.zongfen!=y.zongfen) return x.zongfen>y.zongfen;
if(x.temp!=y.temp) return x.temp<y.temp;
}
student a[1000];


int main(){
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i].score>>a[i].temp;

for(int i=1;i<=k;i++){
for(int j=1;j<=k;j++){
cin>>b[i][j];
}
}

for(int j=1;j<=k;j++){
double sum=0;
for(int i=1;i<=k;i++){
sum+=b[i][j];
}
s1[j]=sum/k;
}
for(int j=1;j<=k;j++){
double sum2=0;
int number=0;
for(int i=1;i<=k;i++){
if(abs(b[i][j]-s1[j])<=15){
number++;
sum2+=b[i][j];
}
}
s2[j]=(int)(sum2/number+0.5);
}

for(int i=0;i<n;i++){
int num= (int) (a[i].temp-64);
a[i].zongfen=(int)(0.6*a[i].score+0.4*s2[num]+0.5);
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
cout<<a[i].zongfen<<" "<<a[i].temp<<endl;
}
return 0;

}

第二题:简单的贪心问题,先从左向右遍历一次,再从右向左遍历一次,注意相等的情况

题目描述

每年的 1024 程序员节日,黑马程序员都会举办大型的庆祝活动。今年的程序员节也不例外,每个班级的同学都发了橙子。

班级里有 nn 名同学从前到后排成一排,且已经得知了这些同学的成绩,其中第 ii 名同学的成绩是 a_iai。班主任想根据同学们上个阶段的考试成绩来评定发橙子的数量。为了激励成绩优秀同学,发橙子时需要满足如下要求:

  • 相邻同学中成绩好的同学的橙子必须更多。若相邻的同学成绩一样,则它们分到的数量必须平等。
  • 每个同学至少分配一个橙子

由于预算有限,班主任希望在符合要求的情况下发出尽可能少的橙子。请问,至少需要准备多少橙子呢?

输入格式

第一行是一个不超过 10^6106 正整数 nn,表示学生数量。

接下来一行有 nn 个不超过 10^9109 的非负整数 a_iai,表示第 ii 个同学的成绩。

输出格式

输出答案,也就是需要最少准备多少个橙子。

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n;
long long a[1000000+1];
long long num[1000000+1];
long long ans=0;
int main(){
long long i,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];

for( i=1;i<=n;i++) num[i]=1;

if(n>=2) {
for( i=2;i<=n;i++){ //右边大于左边
if(a[i]>a[i-1]) num[i]=num[i-1]+1;
else if(a[i]==a[i-1]) num[i]=num[i-1];
}

for( j=n;j>=2;j--){ // 左边大于右边
if(a[j-1]>a[j]&&num[j-1]<=num[j]) num[j-1]=num[j]+1;
else if(a[j-1]==a[j]&&num[j-1]<num[j]) num[j-1]=num[j];
}
}

for(int i=1;i<=n;i++) ans+=num[i];
cout<<ans<<endl;
return 0;
}

第三题:求众数,用map统计即可,注意红黑牌异或时等于红牌的情况,因为只有一种出牌策略,因此对于每名玩家每种值只能出现一次

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;

int main(){
cin>>n;
int a,b;
map<long long,long long>jishu;

while(n--){
cin>>a>>b;
jishu[a]++;
if(a!=a^b) jishu[a^b]++; //注意这里不能相等 否则多+1
}
long long ci=0;
long long number;
map<long long,long long>::iterator iter;
for(iter=jishu.begin();iter!=jishu.end();iter++){
if(iter->second>ci){
number=iter->first;
ci=iter->second;
}
}
cout<<number<<endl;
return 0;

}

第四题比赛的时候没有想到思路,如果有好的思路的话欢迎评论交流

猜你喜欢

转载自www.cnblogs.com/wanganwen/p/12695322.html