1.大家去电影院看电影,总共有n人来看电影,其中年龄不低于18岁的成年人的座位号为奇数,不满18岁的
未成年人的座位号为偶数。现在请统计成年人与未成年的数目,以及他们在总人数里的比例。n<=1000。
样例输入:5 2 3 6 7 11
样例输出:3 0.60 2 0.40
//扫描所有数据,统计奇数个数和偶数个数
//注意:两个int型数据相除还是int型,必须加上强制类型转换,或者直接将其全部变为double型数据进行运算,否则0.6这样的数显示不出来
#include<cstdio>
int main(){
int n,num;
int odds=0,even=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num);
if(num%2==0) even++;
else odds++;
}
double ration1=(double)even/n;
double ration2=(double)odds/n;
printf("%d %.2f %d %.2f",odds,ration2,even,ration1);
return 0;
}
/*
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,
垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容
纳最多的水
说明:你不能倾斜容器,且 n 的值至少为 2。
输入: 9 1 8 6 2 5 4 8 3 7(考试的时候给了数量n,n<=1000)
输出: 49
暴力法:直接求出任意两根线之间能容纳的水量,在比较选出最大值,O(n-1+n-2+…+1)=O(n^2)
#include<cstdio>
int main(){
int n,num[1010];
scanf("%d",&n);
int min,temp;//存储两者中的最小值 ,暂时的存水量
int total=0;//total中存储最大储水量
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(num[i]<num[j]) min=num[i];
else min=num[j];
temp=(j-i)*min;
if(temp>total){
total=temp;
}
}
}
printf("%d\n",total);
return 0;
}
百度之后发现可以用双指针法使复杂度降为O(n)
双指针反向扫描,如果左边的小于右边的则指针右移,否则右指针左移,i=0,j=n-1;
思考原理:对于两条竖线,一定是以最低的作为容器的高,那么宽当然是越大越好,所以刚开始两指针分别在头和尾,底是最大的,对于第一条竖线和最后一条来说,高固定了,只有底最大时,存水才最大,假设i=0,j=n-1;num[i]<num[j],那么以num[i]为高,求出此时的存水量是最大的,如果j往前移的过程中,j–,有比num[j]更高的,也没用,因为以最低为标准,如果有比num[i]还低的,那么宽一定更小了,容量也就更小,所以这里求出了num[i]这个竖线的最大存储容量,然后i++,移动指针求另一条
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int n,num[1010];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
int i=0,j=n-1;
int total=0;
while(i<j){//两指针相遇是退出循环
int temp=(j-i)*min(num[i],num[j]);
if(temp>total){
total=temp;
}
if(num[i]<num[j]) i++;//走链
else j--;
}
printf("%d\n",total);
return 0;
}
*/
/*题3:有个班级,里面有N个学生,他们之中有些是朋友有些不是,比如如果A是B的朋友,B是C的朋友,
那么A就是C的间接朋友,我们定义所谓的朋友圈就是由直系和间接朋友所组成的群体。N的范围为 [1,200].
输入:
3
1 1 0
1 1 0
0 0 1
输出: 2
解释:第0个和第1个学生是直系朋友,所以记为1个朋友圈。第2个学生他没什么朋友也
要算一个朋友圈,所以结果为2
输入:
3
1 1 0
1 1 1
0 1 1
输出: 1
解释:第0个和第1个学生是直系朋友,第1和第2个也是,所以第0和第2个学生是
间接朋友,三个学生都在同个朋友圈里,返回1.
*/
//看题的话可以求连通块的数量,即BFS和DFS,或者用并查集判断两块是否属于同一个连通块
//并查集在合并时要求两个是不同的集合,所以一定没有环,并查集产生的每一个集合都是一颗树
#include<cstdio>
const int maxn=210;
int father[maxn];
bool isroot[maxn]={false};//记录某个节点是否是一个完整集合的根节点
int matrix[maxn][maxn];
int findFather(int x){
int a=x;
while(x!=father[x]){
x=father[x];
}
//路径压缩
while(a!=father[a]){
int z=a;
a=father[a];//下面两行不能颠倒
father[z]=x;
}
}
int main(){
for(int i=1;i<maxn;i++){//并查集初始化
father[i]=i;
}
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&matrix[i][j]);
if(matrix[i][j]==1){//合并操作
int fax=findFather(i);
int fay=findFather(j);
if(fax!=fay){//不在一个连通块中,将其合并
father[fax]=fay;
}
}
}
}
for(int i=1;i<=n;i++){
printf("%d ",father[i]);
isroot[findFather(i)]=true;
}
int ans=0;
for(int i=1;i<=n;i++){
if(isroot[i]==true){
ans++;
}
}
printf("%d\n",ans);
return 0;
}
//DFS,BFS算法见2015年题2
还有一题是关于图像处理的,
.使用卷积神经网络将一张图片进行卷积处理。
(1)给出卷积公式,还给出图片的边缘处理方式,要求用代码实现图片卷积的过程。
(2)给出一张图片,让你画出卷积后的图片。
(3)给出两个函数(已知,直接调用即可,不用实现),一个是图片读入函数,一个是图片保存函数。要求实现从图片读入,经过卷积变形,最后保存结果这么一个过程。//第三题还可以,直接依据已经存在的函数进行调用即可,所以说难题中也有可以拿分项