要是有什么大佬为了看一些好题的点进来的,真不好意思。。。本人实力不咋滴。只能写写水题的题解。
其实还有几题是学长教我的,不然我都不会做。
A、24
有一天dark sil在玩24点,被杰哥看见了,杰哥就想到了这样一个问题:假设有N张卡片,上面写着1,2,3....N,是否可以用这些卡片组成24点呢?要求是只能使用加减乘除(整除),所有的卡片都必须用上,并且只能使用一次。如果可以组成24点,则输出"Yes",否则输出“No”.
假设N等于5,那么存在1*2*(3+4+5)=24.
示例还有4 1×2×3×4=24;
后来你就会发现 6....... 1+2×3×4+5-6=24 7........1+2×(3+4+5)+6-7=24
大于等于4的都能构成这样形式的。
#include
int main()
{
int T;
while(~scanf("%d",&T)){
while(T--){
int n;
scanf("%d",&n);
if(n>=4){
printf("Yes\n");
}else{
printf("No\n");
}
}
}
return 0;
}
B、简单的模板题:bfs
#include
#include
#include
#include
#include
using namespace std;
int n;
char a[1005][1005];
int vis[1005][1005];
int dir[4][2]={
{-1,0},
{0,-1},{0,1}
,{1,0}
};
typedef struct point{
int x,y,step;
}p;
int sx,sy,fx,fy;
int main()
{
while(~scanf("%d",&n)){
memset(a,'\0',sizeof(a));
memset(vis,0,sizeof(vis));
for(int i=0;iQ;
p u,v;
p first={sx,sy,0};
int flag=1;
for(Q.push(first);!Q.empty();Q.pop()){
u=Q.front();
if(a[u.x][u.y]=='E'){
flag=0;
printf("%d\n",u.step);
break;
}
for(int i=0;i<4;i++){
v.x=u.x+dir[i][0];
v.y=u.y+dir[i][1];
v.step=u.step+1;
if(0<=v.x&&v.x
C、走路遇怪兽问题,这题就是枚举每一个点就可以了,不过算速度需要一点想法,
因为sqrt再取ceil的确没错。
但是 距离=时间×速度,距离的平方=(时间×速度)的二次方
直接用来比较即可:距离的平方<=(时间×速度)的二次方
#include
#include
int dis(int x1,int y1,int x2,int y2){
return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
typedef struct point{
int x,y,v;
}node;
int vis[100050]={0};
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF){
int ans=0;
node a[100500];
for(i=0;i
D、这题是问学长才知道的,学长说,其实找出一个拥有前面数字的最大值即可,可以看看代码实现
#include
#define max(a,b) (a)>(b)?(a):(b)
int main()
{
int n;
int a[100005];
while(~scanf("%d",&n)){
int vis[100050]={0},i;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int maxz=-1;
for(i=1;i<=n;i++){
vis[a[i]]=vis[a[i]-1]+1;
maxz=max(maxz,vis[a[i]]);
}
printf("%d\n",n-maxz);
}
return 0;
}
H、排序,-这题都是坑,原以为排完序就可以了,后来才知道要排序后的第一个 a[i]>a[i+1]的下标。
#include
#include
#include
#include
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)){
int a[100400],o[100400],e[100400],i,on=0,en=0;
memset(o,127,sizeof(o));
memset(e,127,sizeof(e));
for(i=1;i<=n;i++){
if(i&1){
scanf("%d",&o[on++]);
//cout<<"****"<e[i/2]){
printf("%d\n",i);break;
}
}else{
if(e[i/2-1]>o[i/2]){
printf("%d\n",i);break;
}
}
//printf("%d%c",((i%2==1)?o[i/2]:e[i/2-1]),i==n?'\n':' ');
}
if(i==n+1){
printf("OK\n");
}
}return 0;
}