EducationalCodeforcesRound62(Div. 2)(A-D题解)
http://codeforces.com/contest/1140/problem/A
題意:一個人看一本解謎書,第 i 個謎題的答案在第 ai 頁,他會從頭一頁一頁地翻書,如果今天他看過的所有謎題的答案頁他都看過了,那么今天就不看了,否則就要一直往下翻。求解這本書多長時間看完。
思路:模擬即可,不斷更新今天看過謎題的答案的最大頁碼。(這破題也能WA,真的是菜。。。)
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[10005]; 5 int main() 6 { 7 int n; 8 cin >> n; 9 for(int i = 1;i <= n;i ++){ 10 cin >> a[i]; 11 } 12 int ans = 0; 13 int now = 1; 14 while(now <= n){ 15 int maxx = a[now]; 16 while(now != maxx){ 17 now ++; 18 maxx = max(a[now],maxx); 19 } 20 now ++; 21 ans ++; 22 } 23 cout << ans << endl; 24 25 return 0; 26 } A?
?
http://codeforces.com/contest/1140/problem/B
題意:給一個只含有 '<' 和 '>' 的字符串,如果你經過若干操作能把它的長度變成 1,那么這個串就是好串。
操作包含兩個:1、隨便拿出一個 '<' ,然后刪除在它左邊的所有字符,不包括它本身。
2、隨便拿出一個 '>' ,然后刪除在它右邊的所有字符,不包括它本身。
你現在可以直接不通過操作刪除任意個字符,問你在最少刪除多少個字符后,這個串變成好串。
思路:挺坑的一道題,一看是看錯問題以為是括號匹配,WA了之后就沒思路了。但是想了一會發現,只要從左找第一個右括號,并且從右找到第一個左括號,看看誰先出現就行了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 char a[10005]; 5 int main() 6 { 7 int T; 8 cin >> T; 9 while(T --){ 10 int n;cin >> n; 11 scanf("%s",a); 12 for(int i = 0;i < n;i ++){ 13 if(a[i] == '>'){cout << i << endl;break;} 14 if(a[n - i - 1] == '<'){cout << i << endl;break;} 15 } 16 } 17 18 return 0; 19 } B?
?
http://codeforces.com/contest/1140/problem/C
題意:給定n,k,然后給定 n 對數字 ai,bi。ai 代表一首歌的長度,bi 代表一首歌的幸福值。要求從這 n should歌里面找到不大于 k 首,使得這個歌單的權值最大。
一個歌單的權值是個單種所有歌曲的總長乘以歌單中最小幸福值。
思路:一開始用的就是貪心,按照幸福值從低到高結構體排序,然后枚舉,但是WA掉了。最后找到了一個問題,就是沒有處理長度這個變量 ,對于一個已經有的歌單,下一步加入了一個新的幸福值,但是不一定就要拋棄最小的幸福值,應該拋棄的是最小的長度。
所以將隊列改成可以排序的優先隊列維護歌單就能AC了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct Node{ 5 int L;int H; 6 friend bool operator<(Node a,Node b){return a.L > b.L;} 7 }a[300005]; 8 9 bool cmp(Node a,Node b){ 10 if(a.H == b.H){return a.L < b.L;} 11 return a.H > b.H; 12 } 13 14 int main() 15 { 16 int n,m; 17 cin >> n >> m; 18 for(int i = 0;i < n;i ++){ 19 cin >> a[i].L >> a[i].H; 20 } 21 sort(a,a + n,cmp); 22 priority_queue<Node> Q; 23 // for(int i = 0;i < n;i ++){ 24 // cout << a[i].L << " " << a[i].H << endl; 25 // } 26 long long sum = 0; 27 long long ans = 0; 28 for(int i = 0;i < n;i ++){ 29 Q.push(a[i]); 30 sum += a[i].L; 31 if(Q.size() > m){ 32 sum -= Q.top().L; 33 Q.pop(); 34 } 35 //cout << a[i].H << " " << sum <<endl; 36 ans = max(ans,sum * a[i].H); 37 } 38 cout << ans << endl; 39 40 return 0; 41 } C?
?
http://codeforces.com/contest/1140/problem/D
題意:給一個定義為正多邊形的權重:在一個正 n 邊形內,將所有頂點依次標記為 1,2,3...n 。然后再中間畫出 n - 2 條不相交的對角線,那么一個三角形的權重就是三點標記值的乘積,這個多邊形的權重就是所有三角形權重的和。求解最小正 n 邊形權重。
思路:我認為這題應該是A題。。。只要讀懂題就能過。公共頂點一定是 1 ,不斷的加上 i * (i + 1) 就行了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 5 int main() 6 { 7 int n; 8 cin >> n; 9 long long ans = 0; 10 for(int i = 2;i <= n - 1;i ++){ 11 ans += i * i + i; 12 } 13 cout << ans << endl; 14 15 return 0; 16 } D?
轉載于:https://www.cnblogs.com/love-fromAtoZ/p/10657235.html
總結
以上是生活随笔為你收集整理的EducationalCodeforcesRound62(Div. 2)(A-D题解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POST一下就知道:人生苦短,我用Pyt
- 下一篇: AHOI(十二省联考)2019 退役记