ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-24 15:31:42  阅读:179  来源: 互联网

标签:题型 输出 int 样例 PTA 枚举 给出 exp 输入


目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有