此次考得不怎么样,只有200分!
node
这题水水水!
这题就是一道循环题嘛!
直接一边循环一边作就行了!数组
这题我是直接暴力的。spa
这题就是求至少用多少条通过(x0,y0)的不一样直线能把全部输入的点(恐怖分子)都通过。3d
我一开始认为这道题很难——怎么判断几个点是否在同一条直线上?code
通过个人左思右想,终于发现,只要两个点的最简形式(即X、Y坐标都除以它们的最大公约数后的值)相等,它们就在同一条直线上。blog
而后就直接暴力扫一遍,找到一个还没死的恐怖分子就把他所在的直线上的全部恐怖分子杀死。最后统计一下答案就行了。递归
建议你们把图平移一下,使激光武器移动到(0,0)的位置(即把全部点的X坐标减去激光武器的X,Y坐标减去激光武器的Y),并一开始先把那些X为0或Y为0的恐怖分子先杀掉。io
PS:Dev.C++ 5.8.3 和 Free Pascal 都有个BUG!当源文件名为gun.cpp或gun.pas时,就会运行超慢,HelloWorld也要运行个3~4秒,谁能告诉我为何?class
但我比赛时判断得不周到,错了。。。变量
比赛时我认为这又是找规律题了,列个表格就能找到规律,而后无脑实现代码。
我便画了一个表格,1 1 1,2 1 1,2 2 1 地写,结果花了半小时,仍是没有找到规律(呵呵,2 2 1已经有63种连法了,孩纸你慢慢画吧)
后来王泓皓本身想到正解AC了,何烨成参照题解AC了。
我才知道此题要用递推!
王泓皓看题解时,发现了一下两行文字:
动态规划:
f[i][j]表示一种颜色i个,另外一种颜色j个此时有多少种方法
而后他就关闭了题解,本身找规律去了,王泓皓就画了一个相似于下图的图。
从任意一个岛屿断开这个岛链,咱们就会惊奇地发现,岛屿是这样排列的(ABC分别表示三种颜色的岛屿):
A-B-C-A-B-C-A-B-C……
而后就能够发现,若是把相同颜色的岛屿分红一堆(每种颜色的一大坨中都包含了许多个那种颜色的岛屿),最后的每一种链接方式都是这样的(不必定会有那么多或只有那么多的桥哦!):
SO,最后的答案就是红蓝两色间的链接方案 × 蓝紫两色间的链接方案 × 红紫两色间的链接方案
那么怎么求两色间的链接方案呢?
设F[i][j]表示第一种颜色(在左边)有i个岛屿,第二种颜色(在右边)有j个岛屿,其中第二种岛屿中的j是刚加入的岛屿。
那很明显,F[i][j]=F[i][j-1]+某个数 了。
那加上的那个数又是多少呢?
很明显,如今咱们要求的那个数是必须链接右边第j个岛屿的链接方案,也就是左边第1个岛屿链接右边第j个岛屿,第2个岛屿链接第j个岛屿,第3个岛屿链接第j个岛屿……第i个岛屿链接第j个岛屿。
但每一次咱们强制让两个岛屿相连时,剩下的岛屿怎么办?因为每次强制链接的都是左边的1个岛屿和右边的1个岛屿,剩下的岛屿可连可不连,那剩下的岛屿的链接方案很显然就是F[i-1][j-1]了。因为咱们能够强制链接i座岛屿,因此**加上的那个数就是 F[i-1][j-1]*i 了**。
最后输出F[a][b]F[a][c]F[b][c]就行了。
PS:注意要模上 998244353 哦!这里但是有一个大坑的!全部的F[0][i]和F[i][0]所有赋值为1!
这题我用DFS+贪心,结果就DIE了
正解是 二分答案 ,如今还在思考如何判断二分到的答案是否合法。。。
首先,我必须申明一下:二分不是最难办的,判断二分出来的答案是否正确才是最难办的!!!
某位同窗就发现了这个规律(图中的X,Y表示一个快递员在X的位置上,另外一个在Y的位置上),判断时能够用递归,从上一层某个地方连了一条线到下一层某个地方表示当上一层的那个地方成立(两个快递员间的距离小于等于二分到的答案时)时,才能够继续判断下一层的那个地方(也就是判断从X,Y出发,是否能够走到第N行,即完成):
可是,咱们会发现,重复地判断一个地方是会超时滴(如第1层的S1,X1和S2,X1合法,就会都去判断X1,X2,致使判断了两次X1,X2)
怎么办呢?
开一个BZ数组,BZ[x][y]记录有没有判断过x,y明显是不行的,题目中说得清清楚楚,0≤xi≤10^9,开一个 的标记数组很明显是会爆炸的;
咱们就要用X[0]和X[-1]来表示S1和S2了。
以后开一个BZ数组,BZ[x][y]记录有没有判断过X[x],X[y]行吗?
不行!题目中也有这么一句话:100000,开一个10,000,000,000大小的数组不做死吗?
那怎么办?咱们再仔细看看图呗!
其实不难发现,到了第i行时,每次判断都有包含X[i],因此这一行中,只要有一个地方是合法的,那么就能够递归到X[i],x[i+1]这个位置。
咱们能够开一个数组BZ(怎么又是它?!),BZ[i]表示第i行是否有递归到下一层的X[i],X[i+1](就是第i行有没有合法的)
但这样作仍会时超。。。
咱们又能够发现一个神奇的规律:搜索列比搜索行更快!
并且咱们的程序跑得慢还有一个缘由——已经搜索到最底层了,回溯后却又继续递归!
咱们能够用一个变量记录是否到达最底层,若是发现已经到达过最底层了,就返回上一层!
此次比赛仍是至关有质量的,题目都挺坑。
此次仍是比较粗心,下次要审清楚题提,认真思考了!
T1:
#include<cstdio> using namespace std; #define time 86400 int main() { freopen("read.in","r",stdin); freopen("read.out","w",stdout); int a,n,i,t; scanf("%d%d",&n,&t); for(i=1;i<=n;i++) { scanf("%d",&a); t=t+a-time; if(t<=0) break; } printf("%d\n",i); return 0; }
T2:
#include<cstdio> #include<cmath> using namespace std; struct node { int x,y; }a[1001],min; bool dead[1001]; int s[5001]; bool pd(node n1,node n2) { if(n1.x>n2.x) return 1; if(n1.x<n2.x) return 0; if(n1.y>n2.y) return 1; return 0; } bool zhi(int x) { int tt=sqrt(x),i; for(i=2;i<=tt;i++) { if(x%i==0) return 0; } return 1; } int abs(int x) { if(x<0) return 0-x; return x; } void qsort(int l,int r) { int i=l,j=r; node mid=a[(l+r)/2],t; while(i<=j) { while(pd(mid,a[i])) i++; while(pd(a[j],mid)) j--; if(i<=j) { t=a[i]; a[i]=a[j]; a[j]=t; i++;j--; } } if(i<r) qsort(i,r); if(l<j) qsort(l,j); } int main() { freopen("gun.in","r",stdin); freopen("gun.out","w",stdout); int n,xx,yy,i,j,sum=0,ans=0; bool b1=0,b2=0; scanf("%d%d%d",&n,&xx,&yy); for(i=1;i<=n;i++) { scanf("%d%d",&a[i].x,&a[i].y); a[i].x-=xx,a[i].y-=yy; } //qsort(1,n); for(i=2;i<=10000;i++) { if(zhi(i)) s[++sum]=i; } for(i=1;i<=n;i++) { //printf("%d %d\n",a[i].x,a[i].y); if(a[i].x==0) dead[i]=b1=1; else if(a[i].y==0) dead[i]=b2=1; } if(b1) ans++; if(b2) ans++; for(i=1;i<=n;i++) if(!dead[i]) { dead[i]=1;ans++; min=a[i]; for(j=1;j<=sum;j++) { if(zhi(min.x)&&zhi(min.y)&&min.x!=min.y) break; if(min.x<s[j]&&min.y<s[j]) break; while((min.x>=s[j]||min.y>=s[j])&&min.x%s[j]==0&&min.y%s[j]==0) { min.x=min.x/s[j]; min.y=min.y/s[j]; } } //printf("%d:%d\t%d\n",i,min.x,min.y); for(j=1;j<=n;j++) if(!dead[j]) { if(a[j].x%min.x==0&&a[j].y%min.y==0&&abs(a[j].x)>=min.x&&abs(a[j].y)>=min.y&&a[j].x/min.x==a[j].y/min.y) dead[j]=1; } } printf("%d\n",ans); return 0; }
T3:
#include<cstdio> using namespace std; #define MOD 998244353 long long f[5001][5001]; int main() { freopen("love.in","r",stdin); freopen("love.out","w",stdout); int a,b,c,i,j;long long x,y; scanf("%d%d%d",&a,&b,&c); for(i=0;i<=5000;i++) f[i][0]=f[0][i]=1; for(i=1;i<=5000;i++) { for(j=1;j<=5000;j++) { f[i][j]=(f[i][j-1]+(i*f[i-1][j-1])%MOD)%MOD; } } x=(f[a][b]*f[b][c])%MOD; y=(x*f[a][c])%MOD; printf("%lld\n",y); return 0; }
T4:
#include<cstdio> using namespace std; //__attribute__((optimize("-O2"))) bool b[100010]; int a[100010],n,max,want; int abs(int x) { if(x<0) return 0-x; return x; } void check(int k,int i)//k<i { if(max==n||abs(a[k]-a[i])>want) return; if(i>max) max=i; check(k,i+1); if(b[i]) { b[i]=false; check(i,i+1); } } int main() { freopen("delivery.in","r",stdin); freopen("delivery.out","w",stdout); int ans,i,x,y,j,l=0,r,mid; scanf("%d%d%d",&n,&x,&y); if(x>y) r=x; else r=y; for(i=1;i<=n;i++) { scanf("%d",&a[i+1]); if(a[i+1]>r) r=a[i+1]; } a[0]=x,a[1]=y; while(l<=r) { mid=(l+r)/2; if(mid<abs(x-y)) { l=mid+1; continue; } for(i=0;i<=n;i++) b[i]=1; max=-1;want=mid; check(0,1); if(max==n) { r=mid-1; ans=mid; } else l=mid+1; } printf("%d\n",ans); return 0; }