ABC 252 - 254 題解(C, D)
阿新 • • 發佈:2022-06-06
ABC 252
本場RP = INT_MIN。
C
我們的Takahashi太不靈活了吧……
對於每個數字,我們都在這個數字停下來時看一看(如888,666等)
這裡我們分“輪”的概念(因為Takahashi不能1秒按兩個),一輪為10秒。
弄個cnt陣列就好辦了。
1 #include <iostream> 2 #include <string> 3 #include <cmath> 4 #include <cstdio> 5 #include <cctype> 6 #include <cstring> 7View Code#include <iomanip> 8 #include <cstdlib> 9 #include <ctime> 10 #include <set> 11 #include <map> 12 #include <utility> 13 #include <queue> 14 #include <vector> 15 #include <bitset> 16 #include <stack> 17 #include <sstream> 18 #include <algorithm> 1920 using namespace std; 21 22 string s[105]; 23 int place[105][10]; 24 int cnt[10]; 25 26 int main() { 27 int N; 28 cin >> N; 29 for (int i = 0; i < N; i++) { 30 cin >> s[i]; 31 } 32 for (int i = 0; i < N; i++) { 33 for (int j = 0; j < 10; j++) { 34place[i][s[i][j] - '0'] = j; 35 } 36 } 37 int ans = 0x3f3f3f3f; 38 for (int i = 0; i < 10; i++) { 39 memset(cnt, 0, sizeof(cnt)); 40 for (int j = 0; j < N; j++) { 41 cnt[place[j][i]]++; 42 } 43 int this_ans = 0; 44 for (int j = 0; j < 10; j++) { 45 this_ans = max(this_ans, j + (cnt[j] - 1) * 10); 46 } 47 ans = min(ans, this_ans); 48 } 49 cout << ans; 50 return 0; 51 }
廣告:Think twice, Code once!
D
首先統計每個數出現了多少次。
假設說有四個數,分別出現a1, a2, a3, a4次……
a1*a2*a3+a1*a2*a4+a1*a3*a4+a2*a3*a4
= a1*a2*(a3+a4)+a3*a4*(a1+a2)
= (a1)*a2*(a3+a4)+(a1+a2)*a3*(a4)
大膽猜測答案是中間所有數的prefix*now*suffix。
1 #include <iostream> 2 #include <string> 3 #include <cmath> 4 #include <cstdio> 5 #include <cctype> 6 #include <cstring> 7 #include <iomanip> 8 #include <cstdlib> 9 #include <ctime> 10 #include <set> 11 #include <map> 12 #include <utility> 13 #include <queue> 14 #include <vector> 15 #include <bitset> 16 #include <stack> 17 #include <sstream> 18 #include <algorithm> 19 20 using namespace std; 21 22 #define maxn 200005 23 24 long long sum[maxn]; 25 26 int main() { 27 int n; 28 scanf("%d", &n); 29 int tmp; 30 for (int i = 0; i < n; i++) { 31 scanf("%d", &tmp); 32 sum[tmp]++; 33 } 34 for (int i = 1; i < 200003; i++) { 35 sum[i] += sum[i - 1]; 36 } 37 long long ans = 0; 38 for (int i = 1; i < 200002; i++) { 39 ans += (sum[i - 1] - 0) * (sum[i] - sum[i - 1]) * (sum[200002] - sum[i]); 40 } 41 printf("%lld", ans); 42 return 0; 43 }View Code
廣告:Think twice, Code once!
ABC 253
本場RP = INT_MAX。
對了,最近我把int RP給廢除了,換了個long double RP。
C
過於興奮的我打了個暴力交上去,然後就TLE了。
我又換成了map交上去,就AC了。
1 #include <iostream> 2 #include <string> 3 #include <cmath> 4 #include <cstdio> 5 #include <cctype> 6 #include <cstring> 7 #include <iomanip> 8 #include <cstdlib> 9 #include <ctime> 10 #include <set> 11 #include <map> 12 #include <utility> 13 #include <queue> 14 #include <vector> 15 #include <bitset> 16 #include <stack> 17 #include <sstream> 18 #include <algorithm> 19 20 using namespace std; 21 22 multiset<int> s; 23 24 int main() { 25 int Q; 26 scanf("%d", &Q); 27 while (Q--) { 28 int tp; 29 scanf("%d", &tp); 30 if (tp == 1) { 31 int x; 32 scanf("%d", &x); 33 s.insert(x); 34 } else if (tp == 2) { 35 int x, c; 36 scanf("%d %d", &x, &c); 37 while (c-- && s.find(x) != s.end()) { 38 s.erase(s.find(x)); 39 } 40 } else { 41 printf("%d\n", *(s.rbegin()) - *(s.begin())); 42 } 43 } 44 return 0; 45 }View Code
廣告:Think twice, Code once!
D
容!斥!原!理!數!學!題!
還!要!會!等!差!數!列!
我!要!請!他!去!喝!茶!
1 #include <iostream> 2 #include <string> 3 #include <cmath> 4 #include <cstdio> 5 #include <cctype> 6 #include <cstring> 7 #include <iomanip> 8 #include <cstdlib> 9 #include <ctime> 10 #include <set> 11 #include <map> 12 #include <utility> 13 #include <queue> 14 #include <vector> 15 #include <bitset> 16 #include <stack> 17 #include <sstream> 18 #include <algorithm> 19 20 using namespace std; 21 22 int main() { 23 long long n, a, b; 24 scanf("%lld %lld %lld", &n, &a, &b); 25 long long ans = 0; 26 ans += (1 + n) * n / 2; 27 ans -= (a + n / a * a) * (n / a) / 2; 28 ans -= (b + n / b * b) * (n / b) / 2; 29 long long c = a / __gcd(a, b) * b; 30 ans += (c + n / c * c) * (n / c) / 2; 31 printf("%lld", ans); 32 return 0; 33 }View Code
廣告:Think twice, Code once!