目录
L1-003 个位数统计 (15 分)
用map就行
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
string s;
cin>>s;
map<int,int>mp;
for(int i=0;i<s.size();i++)
{
int t=s[i]-'0';
mp[t]++;
}
for(auto it=mp.begin();it!=mp.end();it++)
{
cout<<it->first<<":"<<it->second<<endl;
}
}
L1-005 考试座位号 (15 分)
两个map,用试机座位号关联
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
int n;
cin>>n;
map<int,int>m1;
map<int,string>m2;
for(int i=0;i<n;i++)
{
string s;
int z1,z2;
cin>>s>>z1>>z2;
m1[z1]=z2;
m2[z1]=s;
}
int m;
cin>>m;
for(int i=0;i<m;i++)
{
int t;
cin>>t;
cout<<m2[t]<<" "<<m1[t]<<endl;
}
}
L1-006 连续因子 (20 分)
注意只有一个因子的数的输出问题,因为这个刚开始一直14分。我用了一个mxx记录最小因子,如果只有一个因子就直接输出mxx
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
ll n;
cin>>n;
ll j=0;
ll mx=1;//最小的连续因子
ll maxx=1;//连续因子个数
ll mxx=n;//最小因子
int f=1;
ll m=1;
for(int i=2; i<=sqrt(n); i++)
{
if(n%i==0)//对每个因子进行判断
{
ll p=i;
m*=i;
while(n%m==0)
{
p++;
m*=p;
j++;
if(f)
{
mxx=i;
f=0;
}
}
if(maxx<j)
{
maxx=j;
mx=i;
}
m=1;
j=0;
}
}
//cout<<maxx<<" "<<mx<<endl;
if(maxx==1)
{
cout<<1<<endl<<mxx<<endl;
}
else
{
cout<<maxx<<endl;
for(int i=mx; i<maxx+mx; i++)
{
if(i==mx)
cout<<i;
else
cout<<"*"<<i;
}
cout<<endl;
}
}
L1-008 求整数段和 (10 分)
注意这个题输出的坑,还有cin不能和scanf混着用,因为它们的运行速度不一样。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
int a,b;
int sum=0;
cin>>a>>b;
int j=1;
for(int i=a;i<=b;i++)
{
printf("%5d",i);
sum+=i;
if(j%5==0)printf("\n");
j++;
}
j--;
if(j%5!=0)printf("\n");
printf("Sum = %d\n",sum);
}
L1-023 输出GPLT (20 分)
简单题
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
string s;
cin>>s;
int g=0,p=0,l=0,t=0,m=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='g'||s[i]=='G')
{
g++;
m++;
}
if(s[i]=='p'||s[i]=='P')
{
p++;
m++;
}
if(s[i]=='l'||s[i]=='L')
{
l++;
m++;
}
if(s[i]=='t'||s[i]=='T')
{
t++;
m++;
}
}
while(m--)
{
if(g!=0)
{
cout<<'G';
g--;
}
if(p!=0)
{
cout<<'P';
p--;
}
if(l!=0)
{
cout<<'L';
l--;
}
if(t!=0)
{
cout<<'T';
t--;
}
}
}
L1-025 正整数A+B (15 分)
第二个字符串可能带空格,还有他是包含第一个空格的,所以判断和输出的时候要注意
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
string s1,s2;
cin>>s1;
getline(cin,s2);
int f1=1,f2=1;
if(s1=="0")f1=0;//坑点
if(s1.size()>=4)
{
if(s1!="1000")f1=0;
}
if(s2==" 0")f2=0;//坑点
if(s2.size()>=5)
{
if(s2!=" 1000")f2=0;
}
for(int i=0;i<s1.size();i++)
{
if(s1[i]<'0'||s1[i]>'9')
{
f1=0;
break;
}
}
if(f1)cout<<s1;
else cout<<"?";
cout<<" + ";
for(int i=1;i<s2.size();i++)
{
if(s2[i]<'0'||s2[i]>'9')
{
f2=0;
break;
}
}
if(f2)
{
for(int i=1;i<s2.size();i++)cout<<s2[i];
}
else cout<<"?";
cout<<" = ";
if(!f1||!f2)cout<<"?"<<endl;
else
{
int s=0;
int a=0,b=0,aa=1,bb=1;
for(int i=s1.size()-1;i>=0;i--)
{
int tt=s1[i]-'0';
a+=tt*aa;
aa*=10;
//cout<<a<<" "<<aa<<endl;
}
for(int i=s2.size()-1;i>0;i--)
{
int tt=s2[i]-'0';
b+=tt*bb;
bb*=10;
}
//cout<<aa<<" "<<bb<<endl;
cout<<a+b<<endl;
}
}
L1-027 出租 (20 分)
用map好做
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
speed_up;
string s;
cin>>s;
map<int,int>mp;
for(int i=0;i<11;i++)
{
int p=s[i]-'0';
if(!mp[p])mp[p]=1;
}
int j=0;
int l=mp.size();
int arr[l];
for(auto it=mp.begin();it!=mp.end();it++)//放入数组
{
arr[j]=it->first;
j++;
}
sort(arr,arr+l,cmp);//排序
cout<<"int[] arr = new int[]{";
for(int i=0;i<l;i++)
{
if(i!=l-1)cout<<arr[i]<<",";
else cout<<arr[i]<<"};"<<endl;
}
cout<<"int[] index = new int[]{";
for(int i=0;i<11;i++)
{
int p=s[i]-'0';
for(int k=0;k<l;k++)
{
if(p==arr[k])cout<<k;
}
if(i!=10)cout<<",";
else cout<<"};"<<endl;
}
}
L1-028 判断素数 (10 分)
素数模板背下来就好啦
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll su(int n)
{
if(n==2||n==3)
return 1;
if(n%2==0||n==1)
return 0;
if(n%6!=1&&n%6!=5)
return 0;
for(int i=5; i<sqrt(n)+1; i+=6)
{
if(n%i==0||n%(i+2)==0)
return 0;
}
return 1;
}
int main()
{
speed_up;
int t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
if(su(n))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
L1-039 古风排版 (20 分)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
//#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
//speed_up;加速代码在codeblocks里能运行PTA上运行不了,就注释掉了
int n;
scanf("%d",&n);
getchar();
string s;
getline(cin,s);
int l=s.size();
int h=l/n;
int y=l%n;
if(y!=0)//字符串长度能整除n就不用加空格了
{
for(int i=0;i<n-y;i++)
{
s+=" ";//补空格
}
}
for(int i=0;i<n;i++)
{
for(int j=s.size()-n;j>=0;j-=n)//倒着输出
{
cout<<s[j+i];
}
cout<<endl;
}
}
L1-046 整除光棍 (20 分)
111/31=3 余18
181/31=5 余26
261/31=8 余13
…
借鉴了别人的代码,不知道这是什么算法
注意while(m<x)这里不能等于
比如111,m就变成1111了,多了一位
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
ll x;
cin>>x;
ll m=1;
int j=1;
while(m<x)
{
m*=10;//找到比x大的连续的1组成的数
m+=1;
j++;
}
//cout<<m<<endl;
while(m%x!=0)
{
cout<<m/x;
m=m%x*10+1;
j++;
}
cout<<m/x<<" "<<j<<endl;
}
L1-050 倒数第N个字符串 (15 分)
aaa~aaz 26
aba~abz 26
aca~acz 26
aza~azz 26
baa~baz 26
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
int l,n;
cin>>l>>n;
int c=26;
for(int i=1;i<l;i++)
{
c*=26;
}
c-=n;//先转换为正序
//cout<<c<<endl;
string s="";//用字符串存放
while(l--)//这里括号内用c!=0不对,这样写当c=1的时候样例就会只执行一次循环输出一个b了,而应该输出baa
{
int p=c%26;
c/=26;
char cc=p+'a';
s+=cc;
//cout<<cc;
}
for(int i=s.size()-1;i>=0;i--)//倒着输出
{
cout<<s[i];
}
cout<<endl;
}
L2-033 简单计算器 (25 分)
根据题意模拟即可
注意输出格式,开始用中文字符一直18分找不出错在哪
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
speed_up;
int n;
cin>>n;
stack<int>s1;
stack<char>s2;
for(int i=0;i<n;i++)
{
int t;
cin>>t;
s1.push(t);
}
for(int i=0;i<n-1;i++)
{
char tt;
cin>>tt;
s2.push(tt);
}
int a,b,f=1;
while(!s2.empty())
{
a=s1.top();
s1.pop();
char c=s2.top();
s2.pop();
b=s1.top();
s1.pop();
if(c=='+')
{
b+=a;
}
else if(c=='-')
{
b-=a;
}
else if(c=='*')
{
b*=a;
}
else if(c=='/')
{
if(a==0)
{
cout<<"ERROR: "<<b<<"/0"<<endl;
f=0;
break;
}
else b/=a;
}
//cout<<b<<endl;
s1.push(b);
}
if(f)
{
cout<<s1.top()<<endl;
}
}
L2-034 口罩发放 (25 分)
15分,没得全分
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
struct data
{
string na,id;
int ti;
} d[1010];//存当天提交的姓名、身份证号、时间信息
/*struct data2
{
string na,id;
} bo[1010];//最后将map中身体情况为1的人的姓名、身份证号存入结构体
*/
bool cmp(data x,data y)//排序,按顺序输出当天获得口罩的人并标注当天时间
{
return x.ti<y.ti;
}
int main()
{
speed_up;
int dd,p;
char c;//:
cin>>dd>>p;
map<string,int>mp;//键:发到口罩的人的身份证号 值:当天是第几天
map<string,string>mp2;//键:身体情况为1的人的身份证号 值:姓名
//int bol=1;
for(int i=1; i<=dd; i++)//i表示第i天
{
int t,s;
cin>>t>>s;
for(int j=1; j<=t; j++)
{
string s1,s2;
int bi,hi,mi;
cin>>d[j].na>>d[j].id>>bi>>hi>>c>>mi;//暂存这组数据
d[j].ti=hi*60+mi;
if(bi==1)
{
if(mp2[d[j].id]=="")
{
mp2[d[j].id]=d[j].na;
}
//bol++;
}
}
sort(d+1,d+t+1,cmp);
int ff=0;
for(int k=1; k<=t; k++)
{
int f=1;
if(d[k].id.size()!=18)//检查身份证长度
{
if(d[k].id.size()==19&&d[k].id[0]=='0')
{
f=1;
}
else
f=0;
}
for(int k=0; k<d[k].id.size(); k++) //检查身份证是不是全为数字
{
if(d[k].id[k]<'0'||d[k].id[k]>'9')
{
f=0;
break;
}
}
if((!mp[d[k].id]||i+1-mp[d[k].id]>p)&&f==1)//没领过口罩|p天前领过口罩&身份证合法
{
cout<<d[k].na<<" "<<d[k].id<<endl;
mp[d[k].id]=i+1;
ff++;
}
if(ff==s)break;
}
for(int k=1; k<=t; k++) //每天都将结构体清空
{
d[k].na="";
d[k].id="";
d[k].ti=0;
}
}
for(auto it=mp2.begin();it!=mp2.end();it++)
{
cout<<it->second<<" "<<it->first<<endl;
}
}
L2-035 完全二叉树的层序遍历 (25 分)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,tree[31];
void create(int i)//建立一棵n个节点的树
{
if(i>n)return;
create(2*i);//建立左子树
create(2*i+1);//建立右子树
cin>>tree[i];//根节点赋值
}
int main()
{
cin>>n;
create(1);
for(int i=1;i<=n;i++)//层序遍历输出
{
if(i>1)cout<<" ";
cout<<tree[i];
}
cout<<endl;
}
L2-036 网红点打卡攻略 (25 分)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
int n,m;
cin>>n>>m;
int a[n+1][n+1];//要定义一个二维数组存放边和路费
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
a[i][j]=0;
}
}
for(int i=0;i<m;i++)
{
int b,c,d;
cin>>b>>c>>d;
a[b][c]=d;
a[c][b]=d;
}
int k;
cin>>k;
ll mn=1e9;//注意总路费最大是1e9
int mnn=0,ff=0;//mnn是花费最少的有效攻略序号
for(int i=0;i<k;i++)
{
int nn;
cin>>nn;
int x,s=0;
cin>>x;
int q[n+1]={0};//用来标记网红点,判断是不是有效攻略
q[x]=1;
int f=1;
if(a[0][x]==0)f=0;//要注意判断从家到第一个点是否有边
s+=a[0][x];//从家到第一个点的路费
for(int j=1;j<nn;j++)
{
int y;
cin>>y;
if(q[y]==1)
{
f=0;//这里的f标记是否有多余的点
}
else q[y]=1;
if(a[x][y]==0)f=0;//这里的f判断是否存在路径
else s+=a[x][y];
x=y;
if(j==nn-1&&a[y][0]==0)f=0;//这里的f判断是否存在路径
if(j==nn-1)s+=a[nn-1][0];
}
for(int j=1;j<=n;j++)
{
if(q[j]!=1)f=0;//这里的f判断点是否足够
}
if(f==1)ff++;
if(mn>s&&f!=0)
{
mn=s;
mnn=i+1;
}
//cout<<i+1<<" "<<f<<endl;
}
cout<<ff<<endl;
cout<<mnn<<" "<<mn<<endl;
}
补充
gcd函数
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
C++万能头文件的代码中用__gcd(n,m)函数也可以直接用来求最大公约数