2019庐阳区
P1919 身高测量仪(height) | 843 | 51 | 1 | |
P1920 蚂蚁(ant) | 673 | 38 | 3 | |
P1921 布展(diff) | 943 | 24 | 4 | |
P1922 防盗(guard) |
身高测量仪(height)
题目描述
给智能电子身高测量仪,写一个显示程序。
输入一个数字N,表示身高,程序会输出一句英文,"Your height is Ncm.”,其中N是输入的数字。 例如:输入158,输出是“Your height is 158cm.”
输入格式
一个整数,表示身高。
输出格式
如题所述。
样例
输入#1
158
输出#1
Your height is 158cm.
#include<bits/stdc++.h>
using namespace std;
string n;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>n;
cout<<"Your height is "<<n<<"cm.";
return 0;//Your height is 158cm.
}
蚂蚁(ant)
题目描述
在一个长度为L cm的木板上,有N只蚂蚁。木板的最左侧用坐标0来表示,最右侧用坐标L来表示,第i只蚂蚁的初始位置用xi来表示。蚂蚁们在一刻不停的爬来爬去,爬行的速度都是1cm/s,并且只能向左或者向右爬行。木板的两侧是空的,所以如果一个蚂蚁爬到尽头,它就掉了下去。
现在有一个问题,我们不知道这N只蚂蚁的爬行方向,但是我们想知道需要多长时间这N只蚂蚁就全部都掉了下去。聪明的你需要编写一个程序来计算N只蚂蚁全部都掉下去需要的最短和最长时间。
输入格式
第一行是两个正整数L和N(1≤L≤1000,1≤N≤100),表示木板的长度和蚂蚁的个数。
接下来是N个整数,第i个正整数xi(1≤xi≤L)表示第i只蚂蚁的初始位置。
输出格式
两个整数,分别是这N只蚂蚁全部掉下去需要的最短和最长时间。
样例
输入#1
10 3
2 6 7
输出#1
4 8
#include<bits/stdc++.h>
using namespace std;
long long m,n,a[105],b[105],c[105];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>m>>n;
int q=m/2;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]<q)
{
b[i]=a[i];c[i]=m-a[i];
}
else
{
b[i]=m-a[i];c[i]=a[i];
}
}
sort(b+1,b+n+1);
sort(c+1,c+n+1);
cout<<b[n]<<" "<<c[n];
return 0;
}
布展(diff)
题目描述
有N颗大小不一的钻石,现在需要布展,为了视觉效果,你可以去掉其中最多K颗钻石,使得展台上的最大的钻石与最小的钻石差值最小。求解这个最小值。
输入格式
第一行两个整数N和K。
接下来N个整数Ai,表示钻石的大小。
输出格式
一个整数,意义如题所述。
样例
输入#1
3 1
1 2 4
输出#1
1
数据范围
1≤N ≤100000
1≤Ai≤100000
0≤K<N
#include<bits/stdc++.h>
using namespace std;
long long a[100001];
long long n,k;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>n>>k;
int minn=INT_MAX;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int j=0;j<=k;j++)
{
if(a[n-(k-j)]-a[j+1]<minn)
{
minn=a[n-(k-j)]-a[j+1];
}
}
cout<<minn;
return 0;
}
防盗(guard)
题目描述
展台被分成N*N个格子,某些格子中有钻石,为了防盗,需要建立防盗系统,防盗系统是一种光电检测装置,它可以检测它所在的行和列以及两个对角线共四条线上是否有人触碰。当然已经放置了钻石的位置是不能安装这个装置的,同时四条线上不能有多个装置,因为他们会互相干扰,发出错误的信号。针对以上防盗装置,放置N个检测装置,我们想知道有多少种布局方案。
输入格式
第一行一个整数N,表示展台的大小。
接下来 N 行,每行N个0或1的整数,如果一个整数为1,表示对应的位置可以放防盗装置,如果一个整数为0,表示对应的位置放置了展品。
输出格式
一个整数,表示总共有多少种放法。
样例
输入#1
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
输出#1
1
数据范围
0<N ≤10
#include <bits/stdc++.h>
using namespace std;
const int N = 12;
int g[N][N];//图
int b1[N], b2[2*N], b3[2*N];//分别记录y, x+y, n-x+y是否被占用
int n, ans;
void dfs(int x)//第x层
{
if(x > n) //有一条新的放置方法
{
ans ++;
return;
}
for(int i = 1; i <= n; i++)//在第x层确定哪一列可以放置
{
//b1数组用来表示这一列有没有放置
//b2和b3数组,是采用数学中 y=x+b 和 y=-x+b,斜线放置的位置 b 不能重复
if(!b1[i] && !b2[x+i] && !b3[n-i+x] && g[x][i])
{
b1[i] = b2[x+i] = b3[n-i+x] = 1;//标记
dfs(x + 1);//搜索下一层
b1[i] = b2[x+i] = b3[n-i+x] = 0;//取消标记
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> g[i][j];
dfs(1);
cout << ans;
}
自己觉得:前三道题秒杀,最后一道题,稍微思考一下就简单了。