QAU--acm实验室2022级纳新赛

本次采用C++语言代码解析

#include<bits/stdc++.h> 为万能头---大家将来会了解

另外代码都是AC之后的代码,可以正常通过一般样例

第一题--小黄人yyds 没有什么好说的,注意次数就行了

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(int i=1;i<=100;i++){
		cout<<"xiaohuangren yyds\n";
	}
}

第二题--输入一个数,判断是不是水仙花数

此题虽然可以判断  数值    sum>99&&sum<1000 但实际上有一些情况是 00#或者 0##  此时sum虽然是三位数字,但并不符合>99&&<1000 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	cin>>s;
	if(s.length()!=3){
		cout<<"输入错误,不是一个三位数";
	}
	else{
		int a=s[0]-'0';
		int b=s[1]-'0';
		int c=s[2]-'0';
		int sum=a*100+b*10+c;
		if(a*a*a+b*b*b+c*c*c==sum)cout<<"该数是水仙花数";
		else cout<<"该数不是水仙花数";
	}
	//此题虽然可以判断  数值    sum>99&&sum<1000但实际上有一些情况是 00#或者 0##  此时sum虽然是三位数字,但并不符合>99&&<1000 
}

第三题--分解质因数

可以直接暴力求出从2到n/i的质因数(每个合数都是由质因数乘积得到),当然也可以写质数筛,两种都可以。前者比较简单

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int l,r;
	cin>>l>>r;
	for(int i=l;i<=r;i++){
        cout<<i<<"=";
		int temp=i;
		bool ok=false;
		for(int k=2;k<=temp/k;k++){
			if(temp%k==0){
				while(temp%k==0){
					if(ok){
						 cout<<"*"<<k;
					}
					else cout<<k,ok=true;
					temp/=k;
				}
			}
		}
		if(temp>1){
			if(ok)cout<<"*"<<temp;
			else cout<<temp;
		}
		cout<<"\n";
	}
}

第四题--到底有多二 

模拟题,考验基本的字符串运用

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;
    bool fu=false;
    bool ou=false;
    int i=0;
    if(s[0]=='-'){
        fu=true;
        i++;
    }
    int er=0;
    int len=0;
    for(i;i<s.length();i++){
        len++;
        if(s[i]=='2')er++;
    }
    if((s[s.length()-1]-'0')%2==0)ou=true;
    printf("%.2lf\%%",(1+(fu)*0.5)*(1+(ou))*er*1.0/len*100);
    
}

第五题--互评成绩

分组排序--可以用数组,也可以用vector

#include<bits/stdc++.h>
using namespace std;
int n,k,m;
int main()
{
    cin>>n>>k>>m;
    vector<double>student;
    for(int i=1;i<=n;i++){
        int sum=0;
        vector<int>temp;
        for(int h=1;h<=k;h++){
            int t;
            cin>>t;
            temp.push_back(t);
        }
        sort(temp.begin(),temp.end());
        for(int h=1;h<=k-2;h++){
            sum+=temp[h];
        }
        student.push_back((double)sum/(k-2));
    }
    sort(student.begin(),student.end());
    for(int i=student.size()-m;i<=student.size()-1;i++){
        printf("%.3lf",student[i]);
        if(i!=student.size()-1)cout<<" ";
    }
}

第六题--小黄人出游戏

算是最简单的博弈论吧,先排序,然后甲乙轮流取剩余最大的

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
    cin>>n;
    long long res=0;
    vector<int>a;
    for(int i=1;i<=n;i++){
        int temp;
        cin>>temp;
        a.push_back(temp);
    }
    sort(a.begin(),a.end());
    int f=1;
    for(int i=a.size()-1;i>=0;i--){
        res+=a[i]*f;
        f*=-1;
    }
    cout<<res;
}

第七题--刮刮彩票

算是一个简单的模拟题,暴力枚举每一种可能的结果即可

此处如果用switch可以更简洁

#include<bits/stdc++.h>
using namespace std;
int a[4][4],q,p;
int b[10],c[10];
void dp(int i)
{
	if(i>=9)return;
		if(i<=3)
		{	b[i]=a[i][1]+a[i][2]+a[i][3];}
		if(i>=4&&i<=6)
		{	b[i]=a[1][i-3]+a[2][i-3]+a[3][i-3];}
		if(i==7)
		{	b[i]=a[1][1]+a[2][2]+a[3][3];}
		if(i==8)
		{	b[i]=a[3][1]+a[2][2]+a[1][3];}
	dp(i+1);
}
int main()
{
	int x=45;
	for(int i=1;i<=3;i++)
	for(int j=1;j<=3;j++)
	{cin>>a[i][j];
	x-=a[i][j];
	}
	for(int i=1;i<=3;i++)
	for(int j=1;j<=3;j++)
	if(a[i][j]==0)
	a[i][j]=x;
	dp(1);
	for(int i=1;i<=8;i++)
	{
			if(b[i]==6)
			c[i]=10000;	
			if(b[i]==7)
			c[i]=36;	
			if(b[i]==8)
			c[i]=720;	
			if(b[i]==9)
			c[i]=360;	
			if(b[i]==10)
			c[i]=80;
			if(b[i]==11)
			c[i]=252;	
			if(b[i]==12)
			c[i]=108;	
			if(b[i]==13)
			c[i]=72;	
			if(b[i]==14)
			c[i]=54;	
			if(b[i]==15)
			c[i]=180;	
			if(b[i]==16)
			c[i]=72;	
			if(b[i]==17)
			c[i]=180;	
			if(b[i]==18)
			c[i]=119;	
			if(b[i]==19)
			c[i]=36;	
			if(b[i]==20)
			c[i]=306;	
			if(b[i]==21)
			c[i]=1080;	
			if(b[i]==22)
			c[i]=144;	
			if(b[i]==23)
			c[i]=1800;	
			if(b[i]==24)
			c[i]=3600;	
	}	
	for(int i=1;i<=3;i++)
	{
		cin>>q>>p;
		cout<<a[q][p]<<endl;
	}
	cin>>q;
	cout<<c[q];
	return 0;
}

 第八题--小字辈

此题可以用并查集写法也可以用建图深搜的方法,以及其他多种写法

这里采用建图深搜的方式,也算是给大家以后的学习提供一些介绍

#include<bits/stdc++.h>
using namespace std;
int n;
int idx,e[100005],ne[100005],h[100005];
void add(int a,int b)
{
    e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
int maxn;
vector<int>res[100005];
void dfs(int u,int step)
{
    maxn=max(maxn,step);
    res[step].push_back(u);
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        dfs(j,step+1);
    }
}
int main()
{
    memset(h,-1,sizeof h);
    cin>>n;
    int root;
    for(int i=1;i<=n;i++){
        int temp;
        cin>>temp;
        if(temp==-1)root=i;
        else add(temp,i);
    }
    dfs(root,1);
    cout<<maxn<<"\n";
    sort(res[maxn].begin(),res[maxn].end());
    for(int i=0;i<res[maxn].size();i++){
        cout<<res[maxn][i];
        if(i!=res[maxn].size()-1)cout<<" ";
    }
}

第九题--品酒大师

二维背包问题--大部分应该还没有学到

题目要求可以用光酒起子,但是不能喝醉(酒量剩余值>0)

枚举每一种酒,枚举每一个状态转移的过程

大家可以在其他平台上学习背包dp思想

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int dp[1005][505];
int main()
{
    cin>>n>>m>>k;
    int v1,v2;
    for(int p=1;p<=k;p++){
        cin>>v1>>v2;
        for(int i=n;i>=v1;i--)
            for(int j=m-1;j>=v2;j--){
                dp[i][j]=max(dp[i][j],dp[i-v1][j-v2]+1);
            }
    }
    cout<<dp[n][m-1]<<" ";
    int res=m-1;
    while(dp[n][m-1]==dp[n][res])res--;
    cout<<m-res-1;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值