本人是在学校机房参加的第二期模拟赛有些题目没有忘海涵
若有什么好的建议可以提出来来分享这是本小白第一篇CSDN希望能帮助到大家
第一题没啥好说的就是直接暴力枚举 这边直接上代码 (稍微注释) 答案:2048
#include <bits/stdc++.h>
using namespace std;
// 9 二进制 :1001
int num[50];
bool judge(int x){
int cnt=0;
while(cnt!=6){ // cnt 表示位数
num[++cnt]=x%2; // 把传进来的数的二进制位数从后往前录入 num中
x=x/2; // 从后往前分离出每位二进制数字
}
for(int i=1;i<=6;i++){ // 数位从1到6遍历判断不等于0就退出到主函数继续循环再到judge函数
if(num[i]!=0)
return false;
}
return true; // 表示六位二进制数都等于0并把该数传回主函数并输出
}
int main(){
for(int i=2023;i<10000;i++){
if(judge(i)){
cout<<i;
break;
}
}
return 0;
}
第二题大家可以用任何方法我用excel表秒出 这里也付上代码 答案:26390
#include<bits/stdc++.h>
using namespace std;
// excel
int month[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
bool isleapyear(int y)
{
if((y%4==0&&y%100!=0)||(y%400==0)) // 闰年判断
return true;
return false;
}
int main()
{
int y=1949,m=10,n=1,s;
s=31*2+30; // 判断到1950年有还有多少天
for(int i=1950;i<=2021;i++){
if(isleapyear(i))
s+=366;
else
s+=365;
}
cout<<s;
return 0;
}
第三题和第一题思路差不了多少只要熟悉了解进制互相转化模拟出即可 答案:1038
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll hex[8];
// hex 16进制
// 同第一题的原理一样
bool judge(int x){
ll xx=x,sum=0;
int cnt=0;
while(x){
ll t=x%10;
sum+=t*hex[cnt++];
x=x/10;
}
if(sum%xx==0)
return true;
return false;
}
int main(){
hex[0]=1;
for(int i=1;i<=7;i++){
hex[i]=hex[i-1]*16;
}
for(int i=10;i<8518;i++){
if(judge(i)){
cout<<i;
break;
}
}
return 0;
}
第四题没题目数据不全 本人也做错了思路大概是dp然后枚举遍历每个点(本人模拟赛时脑子傻了选错方法去做) 答案好像是592大家还是等待官方答案吧哈哈哈
第五题质数分解呢 本人先用线性筛选质数 复杂度O(N) 习惯了哈哈哈都是防爆的错zzz 接着用个01背包思想可以解出 代码如下 答案 :33
#include <bits/stdc++.h> //思路 先得将素数表示再用01背包思想
using namespace std;
const int N=2023;
int dp[N],prime[N],cnt=0;
bool isprime[N];
// isprime[i]=true 表示这个数不是素数 ,=false 表示为素数
// prime[0~cnt-1] 一共cnt个数保存了所有的元素
void shift(){ // 模板 筛选素数 o(n)时间复杂度
isprime[1]=1;
for(int i=2;i<N;i++){
if(!isprime[i]){
prime[cnt++]=i;
}
for(int j=0;j<cnt&&prime[j]*i<N;j++){
isprime[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
int main(){
shift(); // 以下注释的是输出素数的个数以及循环遍历输出各个素数 后来自己补的
// cout<<cnt<<endl;
// for(int i=0;i<cnt;i++)
// cout<<prime[i]<<endl;
memset(dp,-1,sizeof(dp)); // 这里是动态规划的01背包问题思维
dp[0]=0;
for(int i=0;i<cnt;i++){
for(int j=2022;j>=prime[i];j--){
if(dp[j-prime[i]]!=-1)
dp[j]=max(dp[j],dp[j-prime[i]]+1);
}
}
cout<<dp[2022];
}
编程题第一题没啥好说的数据还有一对我也没给出来 大家自行理会哈哈哈哈
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,c,s;
//每秒拷贝c/t字节,共需s/(c/t)=s*t/c;
int main(){
scanf("%lld %lld %lld",&t,&c,&s);
ll ans=s*t/c;
printf("%lld",ans-t);
}
第三题编程(顺序搞错了哈哈下面一题是第二题)只截到这里 还有的是输入banana 输出 bananab 输入noon 输出noon
这题需要注意的是 双指针后的枚举遍历分割最优对称中心 (注意字符串长度的奇数和偶数耶)
#include<bits/stdc++.h>
using namespace std;
bool judge(int start,int end,string s){
while(start<end){
if(s[start]!=s[end]) break;
start++;
end--;
}
if(start==end||s[start]==s[end]) // 这里判断字符串奇数时没事偶数的话需要或
return true;
return false;
}
int main(){
string str;
cin>>str;
int end=str.size()-1; //
int start=end; // 分割点的位置 start前全补后面
for(int i=0;i<str.size();i++){ // 枚举哪个分割点最好
if(judge(i,end,str)){ // 判断
start=i;
break;
}
}
for(int i=start-1;i>=0;i--){ // 字符串的start 往end方向遍历判断满足条件是否是回文串
str+=str[i];
}
cout<<str<<endl;
return 0;
}
第二题编程是这个哈哈哈思路呢是用stl 里面map的映射哈哈哈 大家用集合也是可以的因为没有重复元素嘛嘿嘿 以下为大家献上代码
#include <bits/stdc++.h>
using namespace std;
int n;
// 查重的话可以用stl的set函数 (集合思想嘛懂得都懂)
map<string,int> mp; // stl的map函数 把数组的东西映射到后一个上
int main(){
cin>>n;
string s;
for(int i=1;i<=n;i++){
cin>>s;
if(mp.find(s)==mp.end()){
cout<<s<<endl;
mp[s]=1;
}
}
return 0;
}
编程倒二没题目本人也记不清楚这么写了大概思路也可以枚举吧哈哈哈估计本人也是没做对太菜了呜呜呜
编程倒一题这里样例输出是12 思路想的有点久大概就是树状数组 贪心 小枚举 需要特别注意的是这题数据要求稍微有点严格为了防爆这里取的是极限为1e6+10 代码给各位附上
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
typedef struct Node{
ll val;
int idx;
}Node;
Node p[N];
int n;
int tr[N];
bool cmp(Node x,Node y){
if(x.val==y.val)
return x.idx<y.idx;
return x.val<y.val;
}
int lowbit(int x){
return x&(-x);
}
void update(int x){
while(x<=n){
tr[x]+=1;
x+=lowbit(x);
}
}
int ask(int x){
int res=0;
while(x){
res+=tr[x];
x-=lowbit(x);
}
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&p[i].val);
p[i].idx=i;
}
sort(p+1,p+n+1,cmp);
ll res=0;
for(int i=n;i>=1;i--){
int bias=ask(p[i].idx);
res=res+(i-p[i].idx+bias)*p[i].val;
update(p[i].idx);
}
printf("%lld\n",res);
}