T1: 一道简单的模拟题,直接暴力打1,3,5都可以。

#include<bits/stdc++.h>
using namespace std;
int main(){
	char a;
	cin>>a;
	cout<<"  "<<a<<endl<<" "<<a<<a<<a<<endl<<a<<a<<a<<a<<a;
	
	return 0;
}

T2: 简单的打擂台活动,用cnt记录当前值。当然也可以用排序来做。 下面给出两种做法:

#include<bits/stdc++.h>
using namespace std;
int n , a[100010] , k;
int main()
{
	cin >> n >> k;
	for(int i = 0 ; i < n ; i++)
	{
		int t;
		cin >> t;
		a[t]++;
	}
	int m = 0;
	for(int i = 0 ; i < 100010 ; i++)
	{
		if(a[i] != 0)
		{
			m++;
			if(m == k)
			{
				cout << i;
				return 0;
			}
		}
	}
	cout << "NO RESULT";
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,k,a[10005];
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++){
	    cin>>a[i]; 
	}
    sort(a,a+n);
    int ans=unique(a,a+n)-a;
    if(k<ans){
    	cout<<a[k-1];
	}else{
        cout<<"NO RESULT";		
	}
    return 0;
}

T3:排序

#include<bits/stdc++.h>
#define ull unsigned long long   
using namespace std;
int n;
int a[100005];
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n);
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
}

T4:二进制、模拟的题 先计算二进制数中有多少位,再用1&n计算最后一位是否为1,循环将n>>=1;(右移一位)

23212^{32}-1开long long

#include<bits/stdc++.h>
#define ull  long long   
using namespace std;
ull n,c;
int g=0;
ull tot;
int main(){
	scanf("%lld",&n);
	c=n;
	while(c>=1){
		c/=2;
		tot++;
	}
	for(int i=tot;i>=1;i--){
		if(n>=1){
		if(n&1){
			g++;
		}
		n>>=1;
		}
	}
	double ans=g*100.0/tot;
	printf("%.1lf%%",ans);
}

T5: CSP-J 2023原题,一道模拟; 每次k-=ceil(k*1.0/3);

#include<bits/stdc++.h>
using namespace std;
int a,k=0,day1=1,day2=1;
int main(){
	cin>>a;
	k=a;
	int pd=1;
	if(a%3==1){
		day2=1;
		pd=0;
	}
	while(true){
		if(pd==1) day2++;
		k-=ceil(k*1.0/3);
		if(k%3==1) pd=0;

		day1++;
		if(k==1) break;
	}
	cout<<day1<<" "<<day2;
	return 0;
}

附加题:高精度加法模版,模拟竖式加法的进位,将每一位通过数组存储起来。

#include<bits/stdc++.h>
using namespace std;
int x[110000],y[110000],c[11000000],T;
char str1[110000],str2[110000];
int n1,n2;
int main()
{
	cin>>T;
	while(T--){
    memset(x,0,sizeof(x));//置空数组x,y,c
    memset(y,0,sizeof(y));
    memset(c,0,sizeof(c));
    cin>>str1;//读入加数
    cin>>str2;//读入被加数
    n1=strlen(str1);//长度
    n2=strlen(str2);
    int lena=n1;
    int lenb=n2;
    int jw=0;
    for(int i=0;i<lena;i++) x[i]=str1[lena-1-i]-'0';//倒序存储
    for(int i=0;i<lenb;i++) y[i]=str2[lenb-1-i]-'0';
    int len=max(lena,lenb);//为了防止出现漏项
    for(int i=0;i<len;i++)
    {
        c[i]=x[i]+y[i]+jw;//jw为进位
        jw=c[i]/10;
        c[i]%=10;//为了防止出现重复加操作
    }
    if(jw==1) cout<<1;//如果进位为1,那么就输出1
    for(int i=len-1;i>=0;i--) cout<<c[i];
    cout<<"\n";
	}
}

1 comments

  • 1