PTA枚举和模拟类型八道题型
作者:互联网
目录
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