传智杯大赛B组合集

文章目录

  • 第四届“传智杯”全国大学生计算机大赛练习赛
    • T211364 [#4练习赛]符合条件的数
    • T211368 [#4练习赛]选代表
    • T211372 [#4练习赛]成绩统计
    • T211939 [#4练习赛]背答案
    • T211943 [#4练习赛]击鼓传花
  • 第三届“传智杯”全国大学生计算机大赛初赛B组
    • A - 课程报名
    • B - 期末考试成绩
    • C - 志愿者
    • D - 终端
    • E - 运气
  • 第三届传智杯全国大学生IT技能大赛决赛B组
    • T172096 课程
    • T172097 序列
    • T172098 子串
    • T172099 打牌
    • T172100 商店
  • 第二届“传智杯”全国大学生IT技能大赛初赛B组
    • P6365 众数出现的次数

题目地址
https://www.luogu.com.cn/team/26074#contest

第四届“传智杯”全国大学生计算机大赛练习赛

T211364 [#4练习赛]符合条件的数

暴力

#include
using namespace std;
long long n,k;

long long f(long long b){
	int ans=0;
	while(b){
		int y=b%10;
		if(y==3)ans++;
		b/=10;
	}
	return ans;
}

int main(){
	cin>>n>>k;
	for(long long i=n;;i++){
		if(f(i)==k){
			cout<<i;
			return 0;
		}
	}
	return 0;
} 

T211368 [#4练习赛]选代表

数组记录次数,不是0不输出

#include
using namespace std;
int n,a[1000500];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int q;
        cin>>q;
        if(!a[q])cout<<q<<" ";
        a[q]=1;
    }
    return 0;
}

T211372 [#4练习赛]成绩统计

模拟
向上取整ceil
四舍五入round

#include
using namespace std;
int n;
struct student{
	string name;
	int pscj,qmcj,zpcj,id;
}a[1050];
bool cmp(student a,student b){
	if(a.zpcj>b.zpcj)return true;
	else if(a.zpcj==b.zpcj && a.id<b.id)return true;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		a[i].id=i;
		cin>>a[i].name>>a[i].pscj>>a[i].qmcj;
		a[i].qmcj=ceil(1.0*sqrt(a[i].qmcj)*10);
		a[i].zpcj=round(1.0*a[i].qmcj*0.6+a[i].pscj*0.4);
	} 
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		cout<<a[i].name<<" "<<a[i].zpcj<<endl;
	}
	return 0;
} 

T211939 [#4练习赛]背答案

map大法直接模拟

#include
using namespace std;
int n,q;
map<string,string>mp;
string s,ss;
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>s>>ss;
		mp[s]=ss;
	}
	
	for(int i=1;i<=q;i++){
		string timu,answer;
		int ans=0;
		cin>>timu;
		for(int j=0;j<4;j++){
			cin>>answer;
			if(mp[timu]==answer){
				ans=j;
			}
		}
		cout<<char(ans+'A')<<endl;
	}
	return 0;
} 

T211943 [#4练习赛]击鼓传花

模拟大法

#include
using namespace std;
int n,m,k;
int a[10000050];

int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		int p;
		cin>>p;
		while(!a[p]){
			a[p]=1;
			p=(p+k)%n;
		}
	}
	int cnt=0;
	for(int i=0;i<n;i++){
		if(a[i]==0)cnt++;
	}
	cout<<cnt;
	return 0;
} 

第三届“传智杯”全国大学生计算机大赛初赛B组

A - 课程报名

暴力

#include
using namespace std;
int n,v,m,a;
int ans,s,sum;
int main(){
	cin>>n>>v>>m>>a;
	for(int i=1;i<=n;i++){
		ans+=v;
		s++;
		if(s==m){
			s=0;
			v+=a;
		}
	}
	cout<<ans;
	return 0;
} 

B - 期末考试成绩

暴力

#include
using namespace std;
int x;
double ans,sum;
int main(){
	cin>>x;
	if(x<60){
		x=sqrt(x)*10;
	}
	if(x<60){
		cout<<"0.0";
		return 0;
	}else if(x>=90){
		cout<<"4.0";
		return 0;
	}else if(x>=60&&x<=89){
		sum=1.0*(90-x)*0.1;
		ans=1.0*4.0-sum;
		printf("%.1lf",ans);
		return 0;
	}
	return 0;
} 

C - 志愿者

模拟,重载排序记得排好先后顺序

#include
using namespace std;
int n;
struct zyz{
	long long level,time,num;
	long long ans;
}a[1005000];
bool cmp(zyz a,zyz b){
	if(a.ans!=b.ans)return a.ans>b.ans;
	if(a.time!=b.time)return a.time>b.time;
	if(a.num!=b.num)return a.num<b.num;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].time>>a[i].level;
		a[i].num=i;
		a[i].ans=a[i].time*a[i].level;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		cout<<a[i].num<<" ";
	}
	return 0;
} 

D - 终端

双map配合模拟

使用iterator迭代器遍历map:
map ::iterator it;
for(it=mpp.begin();it!=mpp.end();++it){
cout<<(it->second)< }
迭代器中,first 和 second,分别指向键值和数值

mp.erase(x) 删除x 如果这个数不存在,则什么都不干

mp.count(Key)返回值为1或者0,1返回存在,0返回不存在

#include
using namespace std;
string s,ss,sss;
int n,sum;
map<string,int>mp;
map<int,string>mpp;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		if(s=="touch"){
			cin>>ss;
			if(!mp.count(ss)){
				mp[ss]=++sum;
				mpp[sum]=ss;
			}
		}else if(s=="rm"){
			cin>>ss;
			int aa=mp[ss];
			mp.erase(ss);
			mpp.erase(aa);
			
		}else if(s=="rename"){
			cin>>ss>>sss;
			if(mp.count(ss) && !mp.count(sss)){
				int aa=mp[ss];
				mpp[aa]=sss;
				mp.erase(ss);
				mp[sss]=aa;
			}
		}else{
			map <int,string>::iterator it;
			for(it=mpp.begin();it!=mpp.end();it++){
				cout<<(it->second)<<endl;
			}
		}
	}
	return 0;
} 

E - 运气

模板题dfs,根据题意不需要建立vis标记

#include
using namespace std;
const long long mod=1e9+7;
long long n,k,a[10005],cnt;

void pr(){
	long long y=0;
		for(int i=1;i<=n;i++){
			y=y*10+a[i];
		}
		if(y%k==0)cnt++;
}

void dfs(int sum){
	if(sum>n){
		pr();
		return ;
	}
	for(int i=1;i<=6;i++){
		a[sum]=i;
		dfs(sum+1);
	}
}

int main(){
	cin>>n>>k;
	dfs(1);
	cout<<cnt%mod;
	return 0;
} 

第三届传智杯全国大学生IT技能大赛决赛B组

T172096 课程

暴力

#include
using namespace std;

int aa[100];
int ans=0;
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int a;
		cin>>a;
		aa[a]++;
	}
	for(int i=1;i<=m;i++){
		int a;
		cin>>a;
		aa[a]++;
	}
	for(int i=1;i<=21;i++){
		if(aa[i]>1)ans++;
	}
	cout<<ans;
	return 0;
} 

T172097 序列

暴力模拟

#include
using namespace std;
long long n,k,a[10050000],ans;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	} 
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(a[i]*a[j]<=k)ans++;
		}
	}
	cout<<ans;
	return 0;
} 

T172098 子串

tolower:字符串转小写
toupper:字符串转大写
b.find(a) 在字符串b中查询有没有a字符串,返回地址,没有返回-1
b.find(a,i); 在字符串b第i个下标中查询有没有a字符串,返回地址,没有返回-1

#include
using namespace std;
int t,n,m,ans;
string a,b;


int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		cin>>a>>b;
		for(int i=0;i<n;i++){
			a[i]=tolower(a[i]);
		}
		for(int i=0;i<m;i++){
			b[i]=tolower(b[i]);
		}
		int x;
		for(int i=0;i<m;i++){
			x=b.find(a,i);
			if(x!=-1){
				ans++;
				i=x;
			}
		}
		cout<<ans<<endl;
		ans=0;
	}
	return 0;
} 

T172099 打牌

不会

T172100 商店

贪心s双指针思想,排序后用最多钱的买最贵的

#include
using namespace std;
int n,m,ans;
long long w[100005],c[100005];


int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	for(int i=1;i<=m;i++){
		cin>>c[i];
	}
	sort(w+1,w+1+n);
	sort(c+1,c+1+m);
	int l=n;
	for(int i=m;i>=1;i--){
		if(w[l]>=c[i]){
			ans++;
			if(l==0)break;
			l--;
		}
	}
	cout<<ans;
	return 0;
} 

第二届“传智杯”全国大学生IT技能大赛初赛B组

P6365 众数出现的次数

#include
using namespace std;
int n;
map<int,int>cnt;

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int ai,bi;
		cin>>ai>>bi;
		cnt[ai]++;
		if(ai!=ai^bi)cnt[ai^bi]++;
	}
	int maxx=-1,ans;
	for(map<int,int>::iterator it=cnt.begin();it!=cnt.end();it++){
		int x=it->first;
		int y=it->second;
		if(y>maxx){
			maxx=y;
			ans=x;
		}
	}
	cout<<ans;
	return 0;
}

你可能感兴趣的:(c++,传智杯,算法)