代码:

1 #include <bits/stdc++.h> 2 #define pb push_back 3 #define mp make_pair 4 #define esp 1e-12 5 #define lowbit(x) ((x)&(-x)) 6 #define lson l, m, rt<<1 7 #define rson m+1, r, rt<<1|1 8 #define sz(x) ((int)((x).size())) 9 #define pb push_back 10 #define pf(x) ((x)*(x)) 11 12 #define pi acos(-1.0) 13 14 #define in freopen("solve_in.txt", "r", stdin); 15 #define out freopen("solve_out.txt", "w", stdout); 16 17 #define bug(x) printf("Line : %u >>>>>> ", (x)); 18 #define inf 0x0f0f0f0f 19 using namespace std; 20 typedef long long LL; 21 typedef pair<int, int> PII; 22 const int maxn = (int)1e4 + 100; 23 LL f[maxn]; 24 int m; 25 void pre(){ 26 LL sum = 0; 27 m = 0; 28 for(int i = 1; f[i] < (maxn); sum += i, i++){ 29 f[i] = f[i-1] + sum + i; 30 m++; 31 } 32 } 33 int main(){ 34 35 pre(); 36 int n; 37 scanf("%d", &n); 38 int ans = upper_bound(f+1, f+m+1, n)-f; 39 cout << ans - 1 << endl; 40 // cout << f[5]; 41 return 0; 42 }
分析:
比较两端的灯向两边的照射长度,然后其他两个相邻灯之间距离的一半,取最大值。
代码:

1 #include <bits/stdc++.h> 2 #define pb push_back 3 #define mp make_pair 4 #define esp 1e-12 5 #define lowbit(x) ((x)&(-x)) 6 #define lson l, m, rt<<1 7 #define rson m+1, r, rt<<1|1 8 #define sz(x) ((int)((x).size())) 9 #define pb push_back 10 #define pf(x) ((x)*(x)) 11 12 #define pi acos(-1.0) 13 14 #define in freopen("solve_in.txt", "r", stdin); 15 #define out freopen("solve_out.txt", "w", stdout); 16 17 #define bug(x) printf("Line : %u >>>>>> ", (x)); 18 #define inf 0x0f0f0f0f 19 using namespace std; 20 typedef long long LL; 21 typedef pair<int, int> PII; 22 const int maxn = 1111; 23 int a[maxn]; 24 25 int main(){ 26 // in 27 int n, l; 28 scanf("%d%d", &n, &l); 29 for(int i = 1; i <= n; i++) 30 scanf("%d", a+i); 31 sort(a+1, a+n+1); 32 n = unique(a+1, a+n+1)-a-1; 33 double ans = max(a[1], l-a[n]); 34 for(int i = 1; i < n; i++) 35 ans = max(ans, (a[i+1]-a[i])/2.0); 36 printf("%.12f ", ans); 37 return 0; 38 }
分析:考虑剩下还需要多少分。按bi从小到大选取。
代码:

1 #include <bits/stdc++.h> 2 #define pb push_back 3 #define mp make_pair 4 #define esp 1e-12 5 #define lowbit(x) ((x)&(-x)) 6 #define lson l, m, rt<<1 7 #define rson m+1, r, rt<<1|1 8 #define sz(x) ((int)((x).size())) 9 #define pb push_back 10 #define pf(x) ((x)*(x)) 11 12 #define pi acos(-1.0) 13 14 #define in freopen("solve_in.txt", "r", stdin); 15 #define out freopen("solve_out.txt", "w", stdout); 16 17 #define bug(x) printf("Line : %u >>>>>> ", (x)); 18 #define inf 0x0f0f0f0f 19 using namespace std; 20 typedef long long LL; 21 typedef pair<int, int> PII; 22 const int maxn = (int)1e5 + 100; 23 24 int a[maxn], b[maxn]; 25 struct Node { 26 int a, b; 27 bool operator < (const Node &o)const { 28 return b < o.b; 29 } 30 } x[maxn]; 31 32 int main() { 33 // in 34 int n, r, avg; 35 scanf("%d%d%d", &n, &r, &avg); 36 LL tot, sum = 0, ans = 0; 37 for(int i = 0; i < n; i++) { 38 scanf("%d%d", &x[i].a, &x[i].b); 39 sum += x[i].a; 40 } 41 sort(x, x+n); 42 sum = (LL)avg*n-sum; 43 if(sum <= 0) 44 puts("0"); 45 else { 46 for(int i = 0; i < n; i++) { 47 if(r-x[i].a <= sum) { 48 ans += (LL)x[i].b*(r-x[i].a); 49 sum -= (r-x[i].a); 50 } else { 51 ans += (LL)sum*x[i].b; 52 break; 53 } 54 } 55 printf("%I64d ", ans); 56 } 57 return 0; 58 }
分析:二分法。找到最大的一个数m使得m/y+m/x < n,那么然后m+1能否整除y,x。
解释是,每次hit增加一个一定是y,x中至少一个整除m,那么看谁能整除,最后一次hit就是谁贡献的。
代码:

1 #include <bits/stdc++.h> 2 #define pb push_back 3 #define mp make_pair 4 #define esp 1e-12 5 #define lowbit(x) ((x)&(-x)) 6 #define lson l, m, rt<<1 7 #define rson m+1, r, rt<<1|1 8 #define sz(x) ((int)((x).size())) 9 #define pb push_back 10 #define pf(x) ((x)*(x)) 11 12 #define pi acos(-1.0) 13 14 #define in freopen("solve_in.txt", "r", stdin); 15 #define out freopen("solve_out.txt", "w", stdout); 16 17 #define bug(x) printf("Line : %u >>>>>> ", (x)); 18 #define inf 0x0f0f0f0f 19 using namespace std; 20 typedef long long LL; 21 typedef pair<int, int> PII; 22 int main() { 23 // in 24 int x, y, n; 25 scanf("%d%d%d", &n, &x, &y); 26 swap(x, y); 27 for(int i = 1; i <= n; i++) { 28 int m; 29 scanf("%d", &m); 30 31 LL l = 0, r = (LL)1e18; 32 LL mid; 33 while(1) { 34 mid = (l+r)>>1; 35 if(mid/x+mid/y < m) { 36 if((mid+1)/x + (mid+1)/y >= m) 37 break; 38 else l = mid+1; 39 } else r = mid-1; 40 } 41 l = mid; 42 if((l+1)%x == 0 && (l+1)%y == 0) 43 puts("Both"); 44 else if((l+1)%x == 0) 45 puts("Vanya"); 46 else puts("Vova"); 47 } 48 return 0; 49 }
分析:gcd(dx, n) = gcd(dy, n)知道从任意一点出发访问,一定会停止在原点,也就是原点是第一个重复点,而且总共访问n个点,这n个点的x,y坐标是能够分别覆盖0,1, n-1的,有了这个的话,我们可以假定从原点出发,到达每一行x时,相应的y的坐标,那么出发点相对原点向上移动一个单位,到达每一行的时y坐标也向上移动一个坐标。然后对于每个位置的苹果树,算出可以访问该点的(x = 0, y)的坐标,,最后看哪个y坐标上出发访问的点最多,输出0 y。
代码:

1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = (int)1e6 + 100; 4 int pos[maxn], ans[maxn]; 5 6 7 int main(){ 8 int n, m, dx, dy; 9 scanf("%d%d%d%d", &n, &m, &dx, &dy); 10 if(n == 1){ 11 for(int i = 0; i < m; i++){ 12 int x, y; 13 scanf("%d%d", &x, &y); 14 } 15 puts("0 0"); 16 } 17 else{ 18 int sx = 0, sy = 0; 19 while(1){ 20 pos[sx] = sy; 21 sx = (sx+dx)%n; 22 sy = (sy+dy)%n; 23 if(sx == 0 && sy == 0) break; 24 } 25 for(int i = 0; i < m; i++){ 26 int x, y; 27 scanf("%d%d", &x, &y); 28 ans[(y-pos[x]+n)%n]++; 29 } 30 int t = max_element(ans, ans+n)-ans; 31 cout << 0 << ' ' << t << endl; 32 } 33 return 0; 34 }