官方题解:http://discuss.acmcoder.com/topic/58e78ec01a2f85620527f2d0
1. 站队,小偷和警察,刚开始想找每个小偷最近的警察,但是发现,如果找最近的警察,但是他的能力可能是小的,不满足要求,那就需要其他办法。然后从警察的角度看,他能抓住的小偷,由于每个警察
最多遍历前后一共19个位置,所以复杂度是19n,线性的,满足要求。
注意边界的检查。
1 #include<bits/stdc++.h> 2 #define pb push_back 3 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 4 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 5 typedef long long ll; 6 using namespace std; 7 typedef pair<int, int> pii; 8 const int maxn = 1e5 + 10; 9 bool a[maxn]; 10 void solve() { 11 int n; 12 string s; 13 cin >> n >> s; 14 int id = -1; 15 n = s.size(); 16 for (int i = 0; i < n; i++) { 17 if(isdigit(s[i])) { 18 int v = s[i] - ‘0‘; 19 for (int j = max(0, i - v); j < min(n, i + v + 1); j++) 20 if(s[j] == ‘X‘) a[j] = 1; 21 } 22 } 23 int res = 0; 24 for (int i = 0; i < n; i++) res += a[i]; 25 cout << res << endl; 26 } 27 int main() { 28 //freopen("test.in", "r", stdin); 29 //freopen("test.out", "w", stdout); 30 //ios::sync_with_stdio(0); 31 //cin.tie(0); cout.tie(0); 32 solve(); 33 return 0; 34 }
2. 分队。
上来一定先要读懂题意,看例子是怎么解的。这是最关键的地方。题目要求仅是相邻的不同,然后和为n。
不难想到k1k1k1的情况,然后我就这样做了,只过了30%,然后考虑哪里错了,我写出k1k1k1k1k1,发现变成(k + 1), k, (k + 1), k, (k + 1), 可以省出很多1,然后就考虑这种方式,这种情况下,是比较好计算的,然后就过了。
1 #include<bits/stdc++.h> 2 #define pb push_back 3 typedef long long ll; 4 using namespace std; 5 typedef pair<int, int> pii; 6 const int maxn = 1e3 + 10; 7 8 void solve() { 9 ll x, y; 10 while(cin >> x) 11 {cin >> y; 12 if(y == 1) { 13 ll res = x / 3; 14 ll d = x % 3; 15 res *= 2; 16 if(d > 0) { 17 res++; 18 } 19 cout << res << endl; 20 continue; 21 } 22 ll res = x / (y * 2 + 1); 23 res *= 2; 24 ll d = x % (y * 2 + 1); 25 if(d >= y) res++; 26 cout << res << endl; 27 } 28 } 29 30 int main() { 31 freopen("test.in", "r", stdin); 32 //freopen("test.out", "w", stdout); 33 ios::sync_with_stdio(0); 34 cin.tie(0); cout.tie(0); 35 solve(); 36 return 0; 37 }
其他的题目没有看,有时间看一下。
感觉基础还不是很熟练,一些套路掌握的不是很好。
想想真是可怕,以前做的都是错的,怪不得挂了。
时间: 2024-10-05 23:36:57