日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces Round #291 Div.2

發布時間:2025/3/13 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces Round #291 Div.2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

A. Chewbaсca and Number

感覺這道題巨坑,如果題中加粗標出來的輸出得是正數算小坑的話。有個巨坑就是

the final number shouldn't start with a zero.

答案不能有前導0,我覺得這句話有兩種理解:

比如將9999變為9,算不算有前導0呢?把9當做一位數就沒有前導0,當做4位數就有前導0

好吧,根據“劇情需要”,看來是被當做有前導0的

所以,這道題的解法就是除了最高位如果是9的話,把其他所有大于等于5的數字t,全部轉變為9-t

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 25; 6 char s[maxn]; 7 8 int main() 9 { 10 scanf("%s", s); 11 int l = strlen(s); 12 for(int i = 0; i < l; ++i) 13 { 14 if(i == 0 && s[i] == '9') continue; 15 if(s[i] > '4') s[i] = '0' + '9' - s[i]; 16 } 17 printf("%s\n", s); 18 19 return 0; 20 } 代碼君

?

B. Han Solo and Lazer Gun

題意:

可能是A題弄得心里比較亂,所以這個題在思路清晰的情況下還WA了兩次,真是。。

有一把槍和n個敵人,這把槍一次能消滅經過槍的位置的直線上所有敵人。

已知槍和敵人的坐標,求要消滅所有敵人的最少開槍次數。

分析:

以槍為中心,如果某兩個敵人和槍連線斜率一樣的話,一次就能全部消滅。

因為浮點運算肯定會有誤差,所以我們用兩個互素的整數<x, y>(x≥0)來表示斜率。

注意敵人與槍處于同一水平線或豎直線的特殊情況。

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 1000 + 10; 6 7 int gcd(int a, int b) 8 { return b == 0 ? a : gcd(b, a % b); } 9 10 int main() 11 { 12 //freopen("in.txt", "r", stdin); 13 14 int n, x0, y0, cnt = 0; 15 scanf("%d%d%d", &n, &x0, &y0); 16 set<pair<int, int>> Set; 17 for(int i = 0; i < n; ++i) 18 { 19 int x, y; 20 scanf("%d%d", &x, &y); 21 x -= x0; y -= y0; 22 pair<int, int> t; 23 if(x == 0) t = make_pair(0, 1);//處于同一豎直線 24 else if(y == 0) t = make_pair(1, 0);//處于同一水平線 25 else 26 { 27 int g = gcd(x, y); 28 x /= g; y /= g; 29 if(x < 0) { x = -x; y = -y; } 30 t = make_pair(x, y); 31 } 32 if(!Set.count(t)) { cnt++; Set.insert(t); } 33 } 34 35 printf("%d\n", cnt); 36 37 return 0; 38 } 代碼君

?

C. Watto and Mechanism (哈希)

題意:

給出n個字符串,然后有m個詢問,每個詢問也都是一個字符串。

恰好改變詢問中的字符串的一個字符,是否能變為n個字符串中的某個字符。

分析:

題中說所有的字符串只含abc三種字符,所以我們可以把每個字符串看做一個三進制的數字(abc代表012)。

因為可能會溢出,所以要不斷取余。一開始是對1e9+7取余,但是沒過,后來改成1e12+7

將這n個字符串對應的哈希值插入到set中,然后對于每個詢問枚舉改變的字符以及位置。

注意這里不要枚舉新字符串然后計算哈希值,還是會超時的。應該在計算出詢問串的哈希值的基礎上再做相應改動。

1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 5 const LL MOD = 1000000000007LL; 6 7 inline LL Hash(string& s) 8 { 9 LL ans = 0; 10 for(int i = 0; i < s.length(); ++i) ans = (ans*3+(s[i]-'a')) % MOD; 11 return ans; 12 } 13 14 int main() 15 { 16 //freopen("in.txt", "r", stdin); 17 18 int n, m; 19 scanf("%d%d", &n, &m); 20 set<LL> Set; 21 string s; 22 for(int i = 0; i < n; ++i) 23 { 24 cin >> s; 25 Set.insert(Hash(s)); 26 } 27 28 for(int i = 0; i < m; ++i) 29 { 30 cin >> s; 31 bool flag = false; 32 LL x = Hash(s);//詢問串的hash值 33 LL b = 1; 34 for(int j = s.length()-1; j >= 0; j--) 35 { 36 LL t = (x-b*(s[j]-'a'+1) % MOD + MOD) % MOD;//先將枚舉的位置變為0 37 for(char c = 'a'; c <= 'c'; c++) if(c != s[j]) 38 { 39 LL tt = (t + b*(c-'a'+1)) % MOD;//新串對應的Hash值 40 if(Set.count(tt)) { flag = true; break; } 41 } 42 if(flag) break; 43 b = (b*3) % MOD;//b = (3^i)%MOD 44 } 45 46 printf("%s\n", flag ? "YES" : "NO"); 47 } 48 49 return 0; 50 } 代碼君

?

轉載于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4295749.html

總結

以上是生活随笔為你收集整理的CodeForces Round #291 Div.2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。