1. 程式人生 > >Codeforces Round #440 (Div. 2)【A、B、C、E】

Codeforces Round #440 (Div. 2)【A、B、C、E】

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 = 10
, 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 }
31ms

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】