1. 程式人生 > >ACM-ICPC(11/9)

ACM-ICPC(11/9)

cnblogs 代碼 ace gif print gin truct 失敗 ==

今天看了一下黑書,感覺很劉汝佳,是他的風格,題目挺好的~~~

  • 枚舉

P12翻硬幣

二進制枚舉每一列的情況2^9種。

在每一種情況下然後對於每一行就是翻與不翻的兩種情況~~~

  • 貪心

P13釣魚問題

POJ上有,之前做過,可以再優化一下。

首先枚舉在哪裏結束,然後剩下的時間就是用來釣魚,每次選取當前最大的釣魚,然後更新當前值(優先隊列插入與彈出)

  • 遞歸

P20三色三角形

當查找失敗的時候還是要回溯一下,看了一下網上的代碼,發現好像我的是最短的~~~

技術分享
#include <bits/stdc++.h>

using namespace
std; char str[1005]; vector<char> v; map<int,int> mp; int n; bool flag[1005]; struct Ans { int a,b; }ans[1005]; struct Node { char s; int pos; }; int cnt; bool solve(vector<Node> &v) { int len = v.size(); if(len==3) { if(v[0].s!=v[1
].s&&v[0].s!=v[2].s&&v[1].s!=v[2].s) { return true; } return false; } for(int i = 0; i < len; i++) { Node tmp = v[(i+1)%len]; if(v[i].s!=v[(i+1)%len].s&&v[i].s!=v[(i+2)%len].s&&v[(i+1)%len].s!=v[(i+2)%len].s) { ans[cnt].a
= v[i].pos; ans[cnt++].b = v[(i + 2)%n].pos; auto it = v.begin() + (i+1)%n; v.erase(it); if(solve(v)==true) return true; cnt--; v.insert(it,tmp); } } return false; } vector<Node> strs; int main() { scanf("%d%s",&n,str); for(int i = 0; i < n; i++) strs.push_back((Node){str[i],i}); if(!solve(strs)) { puts("0"); } else { printf("%d\n",cnt); for(int i = 0; i < cnt; i++) printf("%d %d\n",ans[i].a+1,ans[i].b+1); } return 0; }
View Code

ACM-ICPC(11/9)