其他分享
首页 > 其他分享> > PTA枚举和模拟类型八道题型

PTA枚举和模拟类型八道题型

作者:互联网

目录

1.枚举-全排列

2.模拟-(3n+1)猜想

3.枚举-笨拙的手指

4.枚举-求质数的个数

5.枚举-最长不重复子序列

6.模拟-代码运行时间

7.模拟-快乐划拳

8.模拟-快乐求导


1.枚举-全排列

题目:把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式:

一个整数 n。

输出格式:

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围1≤n≤9

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 

 源代码

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
///回溯典型
int n,m;
int mem[maxn]={0};
int mark[maxn]={0};
void traceback(int pos)
{
    if(pos>n)
    {
        for(int i=1;i<=n;i++)
        {
            cout<<mem[i]<<" ";
        }
        cout<<endl;
        return ;
    }

    for(int i=1;i<=n;i++)
    {
        if(mark[i]==1)
        {
            continue;
        }

        mem[pos]=i;
        mark[i]=1;
        traceback(pos+1);
        mark[i]=0;
    }



}

int main()
{
    cin>>n;

    traceback(1);
    return 0;
}


2.模拟-(3n+1)猜想

题目:卡拉兹猜想: 对任何一个自然数n,如果它是偶数,那么就把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后在某一步得到n=1。 此处并非要求证明该定理,而是对于给定的任一个不超过1000的正整数n,简单的数一下,需要多少步才能得到n=1?

输入格式:

每个测试输入包含1个测试用例,即给出自然数n的值

输出格式:

输出从n计算到1需要的步数

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

5

源代码

#include<iostream>
 
using namespace std;
int main(){
    int n,step=0;
    cin>>n;
    while(n != 1){
        if(n%2 == 0){
            n = n/2;
            step++;
        }
        else{
            n = (3*n+1)/2;
            step++;
        }
    }
    cout<<step;
    return 0;
}

3.枚举-笨拙的手指

题目:奶牛贝茜正在学习如何在不同进制之间转换数字。

但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔。

每当贝茜将数字转换为一个新的进制并写下结果时,她总是将其中的某一位数字写错。

例如,如果她将数字 14 转换为二进制数,那么正确的结果应为 1110,但她可能会写下 0110 或 1111。

贝茜不会额外添加或删除数字,但是可能会由于写错数字的原因,写下包含前导 0 的数字。

给定贝茜将数字 N 转换为二进制数字以及三进制数字的结果,请确定 N 的正确初始值(十进制表示)。

输入格式:

第一行包含 N 的二进制表示,其中一位是错误的。

第二行包含 N 的三进制表示,其中一位是错误的。

输出格式:

输出正确的 N 的值。0≤N≤10^9,且存在唯一解。

输入样例:

在这里给出一组输入。例如:

1010
212

输出样例:

在这里给出相应的输出。例如:

14

 源代码:

#include<iostream>
#include<cstring>
#include <unordered_set>
using namespace std;
int get(string s,int b){
 
  int res =0;
  int len =s.size();
  for(int i=0;i<len;i++){
    int c =s[i]-'0';
    res =res*b+c;
 }
  return res;
}
int main(){
  string str,str1;
  cin>>str>>str1;
 
  unordered_set<int> S;
  int len1 =str.size();
  int len2 =str1.size();
  for(int i=0;i<len1;i++){
    str[i] =str[i]^1;
    S.insert(get(str,2));
    str[i] =str[i]^1;
 }
  for (int i = 0; i <len2; i ++ ){
    char c =str1[i];
   
    for(int j=0;j<3;j++){
      if(c!=j+'0'){
        str1[i] =j+'0';
        int ans =get(str1,3);
        if(S.count(ans)){
          cout<<ans<<endl;
          return 0;
       }
       
     }
   }
    str1[i] =c;
 }
 return 0;

}

4.枚举-求质数的个数

题目:给定一个正整数 n,请你求出 1∼n 中质数的个数。

输入格式:

共一行,包含整数 n。

输出格式:

共一行,包含一个整数,表示 1∼n 中质数的个数。

输入样例:

在这里给出一组输入。例如:

8

输出样例:

在这里给出相应的输出。例如:

4

 源代码:

#include<iostream>
using namespace std;
int ans;
bool isPrime(int a){
if(a<2) return false;
for(int i=2;i<=a/i;i++){
if(a%i==0)
return false;
}
return true;
}
int main(){
int n;
cin>>n;
for(int i=2;i<=n;i++){
if(isPrime(i))
ans++;
}
cout<<ans<<endl;
return 0;
}

5.枚举-最长不重复子序列

题目:给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

输入格式:

第一行包含整数 n。 第二行包含 n 个整数(均在 0∼10^5范围内),表示整数序列。

输出格式:

共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。 数据范围1≤n≤10^5

输入样例:

在这里给出一组输入。例如:

5
1 2 2 3 5

输出样例:

在这里给出相应的输出。例如:

3

 源代码:

#include<iostream>
using namespace std;
const int N=10010;
int n;
int a[N],b[N];

int main()
{
	scanf("%d",&n);
	
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	
	int kes=0;
	for(int i=0,j=0;i<n;i++)
	{
		b[a[i]]++;
		while(b[a[i]]>1)
		{
			b[a[j]]--;
			j++;
		}
		
		kes=max(kes,i-j+1); 
	}
	printf("%d",kes);
		return 0;
}

6.模拟-代码运行时间

题目:要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。 这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。 于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2; 两次获得的时钟打点数之差 (C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。 这里不妨简单假设常数 CLK_TCK 为 100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。

输入格式:

输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,10^7]。

输出格式:

在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出;不足 1 秒的时间四舍五入到秒。

输入样例:

在这里给出一组输入。例如:

123 4577973

输出样例:

在这里给出相应的输出。例如:

12:42:59

 源代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int CLK =100;
int main(){
int c1,c2;
scanf("%d%d",&c1,&c2);
int ans =c2-c1;
if(ans%100>=50){
ans =ans/CLK+1;
}
else{
ans =ans/CLK;
}
printf("%02d:%02d:%02d",ans/3600,ans%3600/60,ans%60);
return 0;
}

7.模拟-快乐划拳

题目:灰太狼和蕉太狼两兄弟过年相见,相约一起去喝酒。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。 如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。 下面给出灰太狼和蕉太狼两兄弟的划拳记录,请你统计他们最后分别喝了多少杯酒。

输入格式:

每个测试输入包含1个测试用例,即给出自然数n的值。

输出格式:

输入第一行先给出一个正整数 N(≤100),随后 N 行,每行给出一轮划拳的记录,格式为: 灰太狼喊 灰太狼划 蕉太狼喊 蕉太狼划 其中喊是喊出的数字,划是划出的数字,均为不超过 100 的正整数(两只手一起划)。

输入样例:

在这里给出一组输入。例如:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

输出样例:

在这里给出相应的输出。例如:

1 2

 源代码:

#include <cstdio>
int main()
{
    int n;
    scanf("%d", &n);
    int a[2], b[2];
    int counta = 0, countb = 0;
    for(int i = 0; i < n; i++){
        scanf("%d%d%d%d", &a[0], &a[1], &b[0], &b[1]);
        int temp = a[0] + b[0];
        if(a[1] == temp && b[1] == temp){
            continue;
        }
        if(a[1] == temp){
            counta++;
        }
        if(b[1] == temp){
            countb++;
        }
    }
    //以上计算的获胜次数,罚酒是要对方罚
    printf("%d %d\n", countb, counta);
    return 0;
}

8.模拟-快乐求导
 

题目:求解一元多项式的导数。

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。 注意“零多项式”的指数和系数都是 0,但是表示为 0 0。

输入样例:

在这里给出一组输入。例如:

3 4 5 6

输出样例:

在这里给出相应的输出。例如:

30 5 12 3

 源代码:

#include <iostream>
using namespace std;
int main()
{
	int count = 0;
	int x, n;
	while(cin >> x >> n)
	{
		if (count == 0)
		{
			if (n != 0)
			{
				cout << x*n << " " << n-1;
			}
			else
			{	/* 如果一开始输入的就是0次多项式 */
				cout << "0 0";
			}
			count ++;
		}
		else
		{
			if (n != 0)
			{	/* 0次多项式求导会消失,只需要对不为0的多项式进行操作即可 */
				cout << " " << x*n << " " << n-1;
			}
		}
 
	} 
		return 0;
}
#include<stdio.h>
 
int main()
{
	char ch = 0;
	int fac[1000] = {},exp[1000] = {};
	
	int i = 0,count = 0;
	do
	{
		scanf("%d %d",&fac[i],&exp[i]);
		i++;
	}while((ch = getchar()) != '\n');
 
	for(int j = 0 ; j < i;j++ )
	{
		if(j < i-1)
		{
			if(exp[j] &&  0 != exp[j+1])
			{
				printf("%d ",fac[j] * exp[j]);
				printf("%d ",exp[j] -1);
			}
			else if(exp[j] && 0 == exp[j+1])
			{
				printf("%d ",fac[j] * exp[j]);
				printf("%d",exp[j] -1);
			}
		}
		else if(j == i -1 && 0 != i-1)
		{
			if(exp[j])
			{
				printf("%d ",fac[j] * exp[j]);
				printf("%d",exp[j] - 1);
			}
		}
		else
		{
			if(exp[j])
			{
				printf("%d ",fac[j] * exp[j]);
				printf("%d",exp[j] - 1);
			}
			else
			{
				printf("0 0");		
			}
		}
	}
 
	return 0;	
}

标签:题型,输出,int,样例,PTA,枚举,给出,exp,输入
来源: https://blog.csdn.net/qq_52355113/article/details/122618261