今年首次参加传智杯,刚比完蓝桥杯所以打传智杯比较轻松,一个五道题,AC了五道题,还算不错
很可惜,罚时少点应该就是一等了
今年题目相对于前两届较为简单,但是还是有很大细节会影响得分,过程中几乎每道题我都罚了时,下面对题目进行一个总结
题解
这个题比较简单,只需要简单模拟即可,比赛时罚时了两次,开始用(人数%m==0)判断是否需要提升定价,后来改用变量计数成功AC
#include
#include
using namespace std;
long long n,v,m,a;
int main(){
cin>>n>>v>>m>>a;
int count = 0;//报名人数
int sum = 0 ;//学费和
int xueyuan = 0; //记录是否报了m个学员
while(count<n){
if(xueyuan==m){//报到了m个学员
v+=a;//定价提升a元
xueyuan=0;//学员数重置
}
sum+=v;//计算学费
xueyuan++;
count++;
}
printf("%d\n",sum);
return 0;
}
题解
一道模拟题,根据题目转化为相应的代码就可以了,注意的是向下取整
#include
#include
#include
using namespace std;
int score;
double GFA;
int main(){
cin>>score;
if(score>=90){
GFA=4.0;
}else if(score>=60&&score<=89){
int chazhi = 90 - score;
GFA = 4.0-0.1*chazhi;
}else if(score<60){
int newscore = floor(sqrt(score)*(double)10);
if(newscore>=90){
GFA=4.0;
}else if(newscore>=60&&newscore<=89){
int chazhi = 90 - newscore;
GFA = 4.0-0.1*chazhi;
}else if(score<60){
GFA = 0;
}
}
printf("%.1f",GFA);
return 0;
}
#include
#include
#include
using namespace std;
long long n;
struct node{
long long t,k,g,id;
};
node a[10000000];
bool cmp(node a,node b){//自定义排序方式
if(a.g!=b.g)return a.g>b.g;//按贡献排序
else if(a.t!=b.t)return a.t>b.t;//按时长排序
else if(a.id!=b.id)return a.id<b.id;//按照编号排序
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].t>>a[i].k;
a[i].id=i+1;//给每一个人编号,以免排序打乱编号
}
for(int i=0;i<n;i++){//贡献度计算出存入
a[i].g=a[i].k*a[i].t;
}
stable_sort(a,a+n,cmp);//使用稳定排序
for(int i=0;i<n;i++){
printf("%lld ",a[i].id);
}
return 0;
}
题解
这题出题方的锅,真没想到举办反是真不上心,测试数据居然没有提前测出有问题
使用set会相对简单一些,但是要注意一些细节,删除要判断是否存在文件,修改文件要判断是否重名,添加文件要判断是否重名
#include
#include
#include
using namespace std;
int ttime=0;
struct node{
string s;//保存字符串
int t;//保存创建时间
bool operator<(const node &rhs)const{//重载运算符,按时间排序
if(t!=rhs.t){
return t<rhs.t;
}else{
return s<rhs.s;
}
}
node(string ss,int tt){
s = ss;
t = tt;
}
};
int n;
set<node> se;
//创建文件
void add(string s){
//存在同名
for(set<node>::iterator it = se.begin();it!=se.end();it++){
if((*it).s==s){
return;
}
}
ttime++;
se.insert(node(s,ttime));//创建文件和记录时间
}
//删除文件
void delate(string s){
int flag=false;
//查看是否存在文件s
for(set<node>::iterator it = se.begin();it!=se.end();it++){
if((*it).s==s){
flag=true;
break;
}
}
if(flag){
for(set<node>::iterator it = se.begin();it!=se.end();it++){
if((*it).s==s){
se.erase(it);//删除文件
break;
}
}
}
}
//ls查询操作
void prit(){
//保证存在文件
if(se.size()>0){
for(set<node>::iterator it = se.begin();it!=se.end();it++){
cout<<(*it).s<<endl;
}
}
}
//更新文件名(先删除在添加实现)
void update(string a,string b){
int ti=0;
//检测是否存在同名
for(set<node>::iterator it = se.begin();it!=se.end();it++){
if((*it).s==b){
return;
}
}
int flag=false;//保证修改文件存在
for(set<node>::iterator it = se.begin();it!=se.end();it++){
if((*it).s==a){
flag=true;
ti = (*it).t ;
se.erase(it);
break;
}
}
if(flag){
se.insert(node(b,ti));
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
string s;
cin>>s;
if(s=="touch"){//添加文件
string st;
cin>>st;
add(st);
}else if(s=="rm"){//删除文件
string st;
cin>>st;
delate(st);
}else if(s=="ls"){//输出排序
prit();
}else if(s=="rename"){//改名
string a,b;
cin>>a>>b;
update(a,b);
}
}
return 0;
}
题解
这应该是这次比赛唯一考了算法的一道题,最简单的搜索,但是考试的时候想复杂了反而被罚时
#include
#include
#include
using namespace std;
long long n,k,ans;
void dfs(int fg,long long sum){//第fg枚筛子,当前组成了数字sum
if(fg==n){//所有塞子抛完
if(sum%k==0){//判断是不是k的倍数
ans++;
}
return;
}
for(int i=1;i<=6;i++){//一到六点选一点
dfs(fg+1,sum*10+i);
}
}
int main(){
cin>>n>>k;
dfs(0,0);
printf("%lld",ans);
return 0;
}
能力有限会有不足,欢迎大家提出!!!