20200411

1.标题:切面条

一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?

答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。

找规律啊找规律 没想到 对折3次发现是9 , 就是2 3 5 9找规律 还是要坚定自己能做出来吧

#include <bits/stdc++.h>
using namespace std;
int a[12];
int main(){
	a[0]=2; //不对折 
	a[1]=3; //对折1次
	a[2]=5; //对折2次 
	for(int i=3;i<=10;i++)
		a[i]=a[i-1]*2-1; 
	cout<<a[10];
	return 0;
}

2.X的x次幂

如果x的x次幂结果为10,你能计算出x的近似值吗?
显然,这个值是介于2和3之间的一个数字。
请把x的值计算到小数后6位(四舍五入),并填写这个小数值。
注意:只填写一个小数,不要写任何多余的符号或说明。

这个题一看感觉很复杂,没想到这么简单,还是练习太少了。然后是学长提到的,pow函数精准度不够,出来的小数+0.000001/-0.000001试一下 这个程序运行出来时2.506185 计算器算得10.000016(保留6位小数四舍五入),2.506184得出9.999997,2.506186必然比2.506185得出的数还大不必再算,如此可知答案是2.506184.

#include <bits/stdc++.h> 
using namespace std;
int main(){
	double i;
	for(i=2;i<=3;i+=0.000001){
		if((double)pow(i,i)>=10)
			break;
	}
	printf("%0.6lf",i);
	return 0;
}

3.计算质因子
题目描述
输入一个整数,输出其所有质因子。
数据规模和约定
1< =n< =10000
输入
输入只有一行,包含一个整数n。
输出
输出一行,包含若干个整数,为n的所有质因子,按照从小到大的顺序排列
样例输入
6
样例输出
2 3

我的天哪是质因子质因子质质因子啊……我还算出来因子三次提交不过我还想这什么问题 结果人家首先要满足质数的条件 还是要看清楚题啊

#include <bits/stdc++.h>
using namespace std;
int a[10000];
int judge(int n){
	if(n==1)
		return 0; //不是素数
	for(int i=2;i*i<=n;i++){
		if(n%i==0)
			return 0; //不是素数 
	} 
	return 1; //是素数 
}
int main(){
	int x;
	cin>>x;
	int cnt=0;
	for(int i=2;i*i<=x;i++)
		if(x%i==0){
			if(i*i==x){
				a[cnt]=i;
				cnt++;
			}
			else{
				a[cnt]=i;
				a[cnt+1]=x/i;
				cnt+=2;
			}
		}
	sort(a,a+cnt);
	for(int i=0;i<cnt;i++)
		if(judge(a[i])==1)
			cout<<a[i]<<" "; 
	return 0;
} 

4.数的划分
一个正整数可以划分为多个正整数的和,比如n=3时:
3;1+2;1+1+1;
共有三种划分方法。
给出一个正整数,问有多少种划分方法。

数据规模和约定
n< =100

输入
一个正整数n
输出
一个正整数,表示划分方案数
样例输入
3
样例输出
3

考虑到是组合,不能出现重复的情况,比如4=3+1与4=1+3是一种,所以采用“划分数中的最大值”来限定重复状态

#include <bits/stdc++.h>
using namespace std;
int dp[1000][1000];    //dp[i][j]表示对i这个数划分最大数字不超过j的划分数 
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		dp[0][i]=1; //对0这个数字划分当然最大数字是什么都是一个 0
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(i<j) //i<j划分的最大数字只能是i 
				dp[i][j]=dp[i][i]; 
			else    //划分数中含j(最后一个数字为j(前面也可以有))+划分数中不含j 
				dp[i][j]=dp[i-j][j]+dp[i][j-1]; 
					//前半部分的意思是 i这个数里已经有一个加数是j 那就是求i-j的划分 划分中当然也可以有j 
		}
	cout<<dp[n][n]<<endl;
	return 0; 
} 

5.密文搜索

题目描述
福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。

请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。

输入
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8

输出
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。

样例输入
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc

样例输出
4

先记下,具体没看

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
 
int main()
{
    int n;
    char str[1005],s[10];
    int  a[1005][26],b[26];
 
    memset(a,0,sizeof(a));
 
    scanf("%s", str);
 
    for(int i=0; i<=(strlen(str)-8); i++)
        for(int j=i; j<=i+7; j++)
            a[i][str[j]-'a']+=1;
 
    scanf("%d",&n);
 
 
    int sum=0;
    for(int k=0; k<n; k++)
    {
        int flag;
        memset(b,0,sizeof(b));
 
        scanf("%s", s);
 
        for(int i=0; i<strlen(s); i++)
            b[s[i]-'a']+=1;
 
        for(int i=0; i<=strlen(str)-8; i++)
        {
            flag=1;
            for(int j=0; j<26; j++)
            {
                if(a[i][j]!=b[j])
                {
                    flag=0;
                    break;
                }
            }
            if(flag==1)
                sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

6.网络寻路
题目描述
X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
源地址和目标地址可以相同,但中间节点必须不同。
如下图所示的网络。

1 -> 2 -> 3 -> 1 是允许的
1 -> 2 -> 1 -> 2 或者 1 -> 2 -> 3 -> 2 都是非法的。
输入
输入数据的第一行为两个整数N M,分别表示节点个数和连接线路的条数(1< =N< =10000; 0< =M< =100000)。
接下去有M行,每行为两个整数 u 和 v,表示节点u 和 v 联通(1< =u,v< =N , u!=v)。
输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。
输出
输出一个整数,表示满足要求的路径条数。
样例输入
4 4
1 2
2 3
3 1
1 4
样例输出
10

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int head[MAX],tot,n,m;
struct Edge {
	int v;
	int ne;
} e[MAX]; 
void add(int u,int v) {
	e[++tot].v = v;
	e[tot].ne = head[u];
	head[u] = tot;
}
int dfs(int u,int fa,int num) {
	if(num == 4) return 1;
	int res = 0;
	for(int i = head[u]; ~i; i = e[i].ne) {
		int v = e[i].v;
		if(v == fa) continue;
		res += dfs(v,u,num+1);
	}
	return res;
}
int main()
{
	cin>>n>>m;
	for(int i = 1; i<=n; i++) head[i] = -1;
	for(int u,v,i = 1; i<=m; i++) {
		scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
	}
	int ans = 0;
	for(int i = 1; i<=n; i++) ans += dfs(i,0,1);
	cout << ans << endl;
	return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值