要是有什么大佬为了看一些好题的点进来的,真不好意思。。。本人实力不咋滴。只能写写水题的题解。
其实还有几题是学长教我的,不然我都不会做。
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<stdio.h> 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<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> 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;i<n;i++){ scanf("%s",a[i]); } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(a[i][j]=='S'){ sx=i,sy=j; }else if(a[i][j]=='E'){ fx=i,fy=j; }else if(a[i][j]=='#'){ vis[i][j]=1; } } } queue<p>Q; 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<n&&0<=v.y&&v.y<n&&vis[v.x][v.y]==0&&vis[v.x][v.y]!='#'){ vis[v.x][v.y]=1; Q.push(v); } } } if(flag){ printf("-1\n"); } } return 0; }
C、走路遇怪兽问题,这题就是枚举每一个点就可以了,不过算速度需要一点想法,
因为sqrt再取ceil的确没错。
但是 距离=时间×速度,距离的平方=(时间×速度)的二次方
直接用来比较即可:距离的平方<=(时间×速度)的二次方
#include<stdio.h> #include<string.h> 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<n;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v); } memset(vis,0,sizeof(vis)); for(i=1;i<=100;i++){ for(j=0;j<n;j++){ if( dis(a[j].x,a[j].y,0,i)<=a[j].v*a[j].v*i*i && vis[j]==0 ){ ans++; vis[j]=1; } } } printf("%d\n",ans); } return 0; }
D、这题是问学长才知道的,学长说,其实找出一个拥有前面数字的最大值即可,可以看看代码实现
#include<stdio.h> #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<algorithm> #include<iostream> #include<cstdio> #include<cstring> 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<<"****"<<endl; }else{ scanf("%d",&e[en++]); //cout<<"####"<<endl; } } sort(o,o+on); sort(e,e+en); for(i=1;i<=n;i++){ if(i&1){ if(o[i/2]>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; }