2018年东北农业大学春季校赛
B wyh的矩阵 > 24573547
数对称、平均
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 #include <set> 7 #include <map> 8 #include <algorithm> 9 #include <iostream> 10 using namespace std; 11 12 int main() 13 { 14 long t; 15 long long n,m; 16 scanf("%ld",&t); 17 while (t) 18 { 19 t--; 20 scanf("%lld",&n); 21 m=n*n; 22 printf("%lld\n",(1+m)/2 * (1+m)/2); 23 } 24 return 0; 25 }
D wyh的迷宫 > 24572730
bfs
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 #include <set> 7 #include <map> 8 #include <algorithm> 9 #include <iostream> 10 using namespace std; 11 12 char s[505][505]; 13 long dx[4]={-1,0,0,1}; 14 long dy[4]={0,-1,1,0}; 15 long x[250005],y[250005]; 16 17 int main() 18 { 19 long t,n,m,i,j,p,q,head,tail,xx,yy; 20 char c; 21 scanf("%ld",&t); 22 while (t) 23 { 24 t--; 25 scanf("%ld%ld\n",&n,&m); 26 for (i=0;i<n;i++) 27 { 28 for (j=0;j<m;j++) 29 { 30 scanf("%c",&s[i][j]); 31 if (s[i][j]=='s') 32 { 33 x[1]=i; 34 y[1]=j; 35 } 36 else if (s[i][j]=='t') 37 { 38 p=i; 39 q=j; 40 } 41 } 42 scanf("%c",&c); 43 } 44 s[x[1]][y[1]]='x'; 45 head=0; 46 tail=1; 47 while (head<tail) 48 { 49 head++; 50 for (i=0;i<4;i++) 51 { 52 xx=x[head]+dx[i]; 53 yy=y[head]+dy[i]; 54 if (xx>=0 && xx<n && yy>=0 && yy<m && s[xx][yy]!='x') 55 { 56 tail++; 57 x[tail]=xx; 58 y[tail]=yy; 59 s[xx][yy]='x'; 60 } 61 } 62 if (s[p][q]=='x') 63 break; 64 } 65 if (s[p][q]=='x') 66 printf("YES\n"); 67 else 68 printf("NO\n"); 69 } 70 return 0; 71 }
E wyh的阶乘 > 24573338
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 #include <set> 7 #include <map> 8 #include <algorithm> 9 #include <iostream> 10 using namespace std; 11 12 int main() 13 { 14 long x,a,t; 15 scanf("%ld",&t); 16 while (t) 17 { 18 t--; 19 x=0; 20 scanf("%ld",&a); 21 while (a) 22 { 23 a=a/5; 24 x+=a; 25 } 26 printf("%ld\n",x); 27 } 28 return 0; 29 }
F wyh的集合 > 24573728
贪心 分一半
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 #include <set> 7 #include <map> 8 #include <algorithm> 9 #include <iostream> 10 using namespace std; 11 12 int main() 13 { 14 long t; 15 long long n; 16 scanf("%ld",&t); 17 while (t) 18 { 19 t--; 20 scanf("%lld",&n); 21 printf("%lld\n",(n/2) * ((n+1)/2)); 22 } 23 return 0; 24 }
H wyh的吃鸡 > 24660519
三维数组记录状态(x,y,有车/没车)
时间小的先遍历,堆(可以不做)
剪枝:遇到时间大于等于最短时间的就停止继续扩展
用dfs不太好,纯bfs找到答案时不能直接退出
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 #include <set> 7 #include <map> 8 #include <queue> 9 #include <algorithm> 10 #include <iostream> 11 using namespace std; 12 #define inf 1000000001 13 #define maxn 100+5 14 #define maxlen 100*100+5 15 16 17 struct node 18 { 19 long x,y,z; 20 }; 21 22 char s[maxn][maxn]; 23 long ti[maxn][maxn][2]; 24 long dx[4]={-1,0,0,1}; 25 long dy[4]={0,-1,1,0}; 26 long n,zz; 27 //1 +2 28 //0 +1 29 30 struct cmp 31 { 32 bool operator() (node a,node b) 33 { 34 return ti[a.x][a.y][a.z]>ti[b.x][b.y][b.z] || (ti[a.x][a.y][a.z]==ti[b.x][b.y][b.z] && a.z<b.z); 35 //return ti[a.x][a.y][a.z]>ti[b.x][b.y][b.z]; 36 } 37 }; 38 priority_queue<node,vector<node>,cmp> f; 39 40 void bfs() 41 { 42 struct node p,pp; 43 long i,x,y,z,mint=inf; 44 while (!f.empty()) 45 { 46 p=f.top(); 47 f.pop(); 48 if (p.z==1 && ti[p.x][p.y][0]<=ti[p.x][p.y][1]) 49 continue; 50 for (i=0;i<4;i++) 51 { 52 x=p.x+dx[i]; 53 y=p.y+dy[i]; 54 if (x>=0 && x<n && y>=0 && y<n && s[x][y]!='O') 55 { 56 if (p.z==0 || s[x][y]=='C') 57 z=0; 58 else 59 z=1; 60 if (ti[p.x][p.y][p.z]+p.z+1<ti[x][y][z]) 61 { 62 pp.x=x; 63 pp.y=y; 64 pp.z=z; 65 f.push(pp); 66 ti[x][y][z]=ti[p.x][p.y][p.z]+p.z+1; 67 if (s[x][y]=='X') 68 mint=min(mint,ti[x][y][z]); 69 } 70 } 71 } 72 } 73 if (mint<=zz) 74 { 75 printf("YES\n"); 76 printf("%ld\n",mint); 77 } 78 else 79 printf("NO\n"); 80 } 81 82 int main() 83 { 84 struct node p; 85 long t,i,j; 86 char c; 87 scanf("%ld",&t); 88 while (t) 89 { 90 t--; 91 scanf("%ld%ld",&n,&zz); 92 for (i=0;i<n;i++) 93 { 94 scanf("%c",&c); 95 for (j=0;j<n;j++) 96 { 97 ti[i][j][0]=inf; 98 ti[i][j][1]=inf; 99 scanf("%c",&s[i][j]); 100 if (s[i][j]=='S') 101 { 102 p.x=i; 103 p.y=j; 104 p.z=1; 105 ti[i][j][1]=0; 106 f.push(p); 107 } 108 } 109 } 110 bfs(); 111 } 112 return 0; 113 }
I wyh的物品 > 24658961
对于固定的单位价值V0,求出V(Value)-V0*S(Space)的值,降序排序,取前k个求和(最优情况),若和大于等于0,则说明Sum(V)>=Sum(S)*V0,因此可以二分
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <stdbool.h> 6 #include <set> 7 #include <vector> 8 #include <map> 9 #include <queue> 10 #include <algorithm> 11 #include <iostream> 12 using namespace std; 13 #define maxn 100000+5 14 15 double a[maxn],b[maxn],c[maxn]; 16 17 int main() 18 { 19 long t,n,m,i; 20 double l,r,mid,sum; 21 scanf("%ld",&t); 22 while (t--) 23 { 24 scanf("%ld%ld",&n,&m); 25 for (i=1;i<=n;i++) 26 scanf("%lf%lf",&b[i],&a[i]); 27 l=0; r=100000.0; 28 while (r-l>0.001) 29 { 30 mid=(l+r)/2.0; 31 for (i=1;i<=n;i++) 32 c[i]=a[i]-mid*b[i]; 33 sort(c+1,c+n+1); 34 sum=0; 35 for (i=n;i>n-m;i--) 36 sum+=c[i]; 37 if (sum>=0) 38 l=mid; 39 else 40 r=mid; 41 } 42 printf("%.2lf\n",r); 43 } 44 return 0; 45 }
K wyh的数列 > 24691132
unsigned long long 2^64
f(n)=f(n-1)+f(n-2)
前两个状态决定了当前状态,因此
找循环节:若condition(t),condtion(t+1)与之前某个状态(condtion(x),condtion(x+1))相同,则循环节为x~t-1,同时循环节不大于模(c)的平方
对于第a^b个数,分不在循环节 和 在循环节,若在循环节,找到这个数在循环节的位置
1 #include <cstdio>
2 #include <cstdlib>
3 #include <cstring>
4 #include <cmath>
5 #include <vector>
6 #include <set>
7 #include <map>
8 #include <queue>
9 #include <algorithm>
10 #include <iostream>
11 using namespace std;
12 #define maxn 1000+5
13 #define maxm 1000*1000+5
14
15 long f[maxm];
16 long vis[maxn][maxn];
17
18 int main()
19 {
20 long t,c,i,j,d,r;
21 unsigned long long a,b;
22 scanf("%ld",&t);
23 while (t--)
24 {
25 scanf("%lu%lu%ld",&a,&b,&c);
26 for (i=0;i<c;i++)
27 for (j=0;j<c;j++)
28 vis[i][j]=-1;
29 f[0]=0;
30 f[1]=1;
31 vis[1][0]=1;
32 for (i=2;i<=c*c;i++)
33 {
34 f[i]=(f[i-1]+f[i-2])%c;
35 if (vis[f[i]][f[i-1]]!=-1)
36 break;
37 else
38 vis[f[i]][f[i-1]]=i;
39 }
40 //[vis[p][q],i)
41 if (a==1 || b*log(a)<=log(i))
42 {
43 printf("%ld\n",f[(long)pow(a,b)]);
44 continue;
45 }
46
47 d=i-vis[f[i]][f[i-1]];
48 a=a%d;
49 r=1;
50 while (b)
51 {
52 if ((b & 1)==1)
53 r=r*a%d;
54 a=a*a%d;
55 b=b>>1;
56 }
57 r=((r-vis[f[i]][f[i-1]])%d+d)%d;
58
59 printf("%lu\n",f[vis[f[i]][f[i-1]]+r]);
60 }
61 return 0;
62 }
63 /*
64 100
65 1 1 2
66 2 3 1000
67 32122142412412142 124124124412124 123
68 2 10 1000
69 243
70 3 100 1005
71
72 */
M wyh的数字 > 24573154
字符处理最方便
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 #include <set> 7 #include <map> 8 #include <algorithm> 9 #include <iostream> 10 using namespace std; 11 12 int main() 13 { 14 long t,g; 15 char c; 16 scanf("%ld\n",&t); 17 while (t) 18 { 19 t--; 20 g=0; 21 while (1) 22 { 23 scanf("%c",&c); 24 if (c=='\n') 25 break; 26 if (c=='7') 27 g++; 28 } 29 printf("%ld\n",g); 30 } 31 /* 32 long x,a,t; 33 scanf("%ld",&t); 34 while (t) 35 { 36 x=0; 37 scanf("%ld",&a); 38 while (a) 39 { 40 a=a/5; 41 x+=a; 42 } 43 printf("%ld\n",x); 44 } 45 */ 46 return 0; 47 }