USACO training chapter1 入门/section1.2
菜鸡作为提高的第一步,开始刷USACO的题库了,第一章还是水题比较多,但是写模拟也是很重要的能力,希望接下来几个月可以刷通。
A. Your Ride Is Here
没啥好说的
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
int r1 = 1, r2 = 1;
for (int i = 0; i < a.length(); i++) r1 *= (a[i]-'A' + 1);
for (int i = 0; i < b.length(); i++) r2 *= (b[i]-'A' + 1);
if (r1 % 47 == r2 % 47) cout << "GO";
else cout << "STAY" << endl;
return 0;
}
B. Greedy Gift Givers
用到了map。
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
string names[20];
map<string ,int> mpp;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> names[i];
mpp[names[i]] = 0;
}
for (int i = 0; i < n; i++) {
string s;
int m, p;
cin >> s >> m >> p;
if (m == 0 || p == 0) continue;
int g = m / p;
mpp[s] -= g * p;
for (int j = 0; j < p; j++) {
cin >> s;
mpp[s] += g;
}
}
for (int i = 0; i < n; i++) {
cout << names[i] << " " << mpp[names[i]] << endl;
}
return 0;
}
C.Friday the Thirteenth
不是很难,但是有点小烦。
就是判断闰年,然后计算每个月的13号是星期几。
为了方便取余直接把星期日的下标当成0,星期一到星期六对应1-6。
#include <iostream>
using namespace std;
int ans[10];
int days[20] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main() {
int n;
cin >> n;
int start = 1, y = 1900;
int run;
for (int i = 0; i < n; i++) {
if ((y % 100 != 0 && y % 4 == 0) ||y % 400 == 0 ) run = 1;
else run = 0;
days[2] += run;
for (int j = 1; j <= 12; j++) {
ans[(start + 5)%7]++;
start = (start + days[j]%7)%7;
}
days[2] -= run;
y++;
}
cout << ans[6] << " " << ans[0] << " ";
for(int i = 1; i <= 5; i++) cout << ans[i] << " ";
return 0;
}
D.Broken Necklace
直接枚举每个间断点,然后统计就好了。从间断点开始往两边扫描。
因为是个环,当扫到端点的时候需要从另一段继续扫秒。
当然也有可能一次就扫完整个项链(只有一种颜色+白色的项链)
如果是这种情况,那么扫描两端下来的结果必定是大于项链长度的,
直接取n和扫描结果中的最小值就好了,反正整条项链都是同色。
注意细节。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int n; string s;
cin >> n >> s;
int res = 0;
for (int i = 0; i < n; i++) {
char firstColor = 'n';
int cnt = 0, l = i, r = i + 1;
while (true) {
if (l < 0) l = n - 1;
if(firstColor == 'n' && s[l] != 'w')
firstColor = s[l];
if (s[l] == 'w' || s[l] == firstColor) cnt++;
else break;
if (cnt >= n) break;
l--;
}
firstColor = 'n';
while (true) {
if (r > n - 1) r = 0;
if (firstColor == 'n' && s[r] != 'w')
firstColor = s[r];
if (s[r] == 'w' || s[r] == firstColor) cnt++;
else break;
if (cnt >= n) break;
r++;
}
cnt = min(n, cnt);
res = max(cnt, res);
}
cout << res << endl;
return 0;
}
之后在抽空更下poj和cf的题目,反正我菜的很,估计也不会更新特别难的题,通过写博客当作一种激励自己的方式吧。