本次采用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;
}