Codeforces Round #440 (Div. 2)【A、B、C、E】
阿新 • • 發佈:2017-10-16
one target minimum contest () 同一行 += 不同 href
Codeforces Round #440 (Div. 2)
codeforces 870 A. Search for Pretty Integers(水題)
題意:給兩個數組,求一個最小的數包含兩個數組各至少一個數。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int n, m; 6 int a[11], b[11]; 7 int main() { 8 int i, j, x = 1031ms, y = 10, s = 10; 9 scanf("%d%d", &n, &m); 10 for(i = 1; i <= n; ++i) { 11 scanf("%d", &a[i]); if(a[i] < x) x = a[i]; 12 } 13 for(i = 1; i <= m; ++i) { 14 scanf("%d", &b[i]); if(b[i] < y) y = b[i]; 15 for(j = 1; j <= n; ++j)16 if(a[j] == b[i] && b[i] < s) s = b[i]; 17 } 18 if(s < 10) printf("%d\n", s); 19 else { 20 if(x > y) swap(x, y); 21 printf("%d%d\n", x, y); 22 } 23 return 0; 24 }
codeforces 870 B. Maximum of Maximums of Minimums(模擬)
題意:給一排N個數,要求分割成K份,每份裏面取出最小的數,再從取出的這些數中求最大的數,,求能得到的最大的數。
題解:K=1時答案即為最小的數,K≥3時,答案為這排數中最大的數,K=2時,就是兩端 兩個數的最大的一個。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 100005; 6 int n, m; 7 int a[N]; 8 int main() { 9 int i, j, mi = 1000000001, ma = -1000000001; 10 scanf("%d%d", &n, &m); 11 for(i = 1; i <= n; ++i) { 12 scanf("%d", &a[i]); 13 if(a[i] < mi) mi = a[i]; 14 if(a[i] > ma) ma = a[i]; 15 } 16 if(m==1) printf("%d\n", mi); 17 else if(m==2) printf("%d\n", max(a[1], a[n])); 18 else printf("%d\n", ma); 19 return 0; 20 }31ms
codeforces 870 C. Maximum splitting(數學)
題意:一個數拆分成幾個合數之和,求最多能拆分成幾個數之和。
題解:合數為4,6,9最優咯。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() { 6 int t, n; 7 scanf("%d", &t); 8 while(t--) { 9 scanf("%d", &n); 10 int ans = 0; 11 if(n & 1) { 12 n -=9; ans++; 13 } 14 if(n < 4 && n != 0) puts("-1"); 15 else { 16 ans += n/4; 17 printf("%d\n", ans); 18 } 19 } 20 return 0; 21 }61ms
codeforces 870 E. Points, Lines and Ready-made Titles(思維)
題意:對每個點,可以繪制一條垂直線,或一條水平線,或什麽都不做。幾條重合的直線是一條直線,求可以得到多少個不同的圖片。
題解:排序,將同一行的用並查集合並,再將同一列的也合並,假設一個集合的點在原圖的不重復行列數為s,如果該集合的點在原圖中不能形成環,則該集合的貢獻是2^s-1(少一種是環的圖形),否則貢獻為2^s。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 const int N = 100005; 7 const ll mod = 1e9+7; 8 int f[N], r1[N], r2[N]; 9 struct node { 10 int x, y, id; 11 }p[N]; 12 int cmp1(node a, node b) {return a.x < b.x;} 13 int cmp2(node a, node b) {return a.y < b.y;} 14 int fin(int x) { 15 if(f[x]!=x) f[x] = fin(f[x]); 16 return f[x]; 17 } 18 void uni(int x, int y) { 19 if((x=fin(x)) == (y=fin(y))) r2[y]++; 20 else { 21 f[x] = y; 22 r1[y] += r1[x]; 23 r2[y] += r2[x] + 1; 24 } 25 } 26 int main() { 27 int n, i, j; 28 ll ans = 1; 29 ll a[2*N]; a[0] = 1ll; 30 for(i = 1; i < 2*N; ++i) a[i] = (a[i-1] * 2) % mod; 31 scanf("%d", &n); 32 memset(r2, 0, sizeof(r2)); 33 for(i = 1; i <= n; ++i) { 34 scanf("%d%d", &p[i].x, &p[i].y); 35 p[i].id = i; 36 f[i] = i; 37 r1[i] = 1; 38 } 39 sort(p+1, p+1+n, cmp1); 40 for(i = 2; i <= n; ++i) 41 if(p[i].x == p[i-1].x) uni(p[i].id, p[i-1].id); 42 sort(p+1, p+1+n, cmp2); 43 for(i = 2; i <= n; ++i) 44 if(p[i].y == p[i-1].y) uni(p[i].id, p[i-1].id); 45 46 for(i = 1; i <= n; ++i) 47 if(f[i] == i) { 48 if(r1[i] == r2[i]+1) ans = ans * (ll)(a[r1[i]+1] - 1) % mod; 49 else ans = ans * (ll)(a[2*r1[i] - r2[i]]) % mod; 50 } 51 printf("%lld\n", ans); 52 return 0; 53 }93ms
Codeforces Round #440 (Div. 2)【A、B、C、E】