USACO 1.1
15079 ワード
USACO 1.2は主にフォーマットを説明します.ヘッダは必ず/*ID:beihai 2013 PROG:(タイトル名、タイトルに説明がある)LANG:C+*/を打ってファイルストリームで入出力を開きます.
1.1.1 a+b
1.1.2簡単計算/*ID:beihai 2013 PROG:ride LANG:C+*/
include
include
include
include
include
include
include
using namespace std; const int MAXN = 1000; char s1[MAXN], s2[MAXN]; int main() { //scanf(“%s %s”, s1, s2); freopen(“ride.in”, “r”, stdin); freopen(“ride.out”, “w”, stdout); cin >> s1 >> s2; int ans1 = 1, ans2 = 1; for(int i = 0 ; i < (int)strlen(s1) ; i++) ans1 = (ans1 * (s1[i] - ‘A’ + 1)) % 47; for(int i = 0 ; i < (int)strlen(s2) ; i++) ans2 = (ans2 * (s2[i] - ‘A’ + 1)) % 47; if(ans1 == ans2) cout << “GO” << endl; else cout << “STAY” << endl;
} 1.1.5簡単なシミュレーション.すべての人のお金の合計は0で、最初はすべての人のお金の数も0です.毎回一人が他の何人かにお金を分けて、均等に分けられないお金は自分で残しています.
1.1.6はますます難しくなってきた……アナログ時間、出力は1900年から、N年目の毎月13日はそれぞれ曜日6712345の数量のテーマで見間違えやすい、注意の与える条件は1900.1である.1は月曜日なので、転化しなければなりません.それから12月の日数を前にします.一年を巡るのはこの年の1-12月で、1月は前年の12月から変わったからです.
1.1.7神坑シミュレーション.最初はO(N)でやろうと思っていたが、いろいろできなかった.O(N^2)でやろうとしたのは、ポイントごとに達成できる最左端と最右端を探していた.しかし、wと非wの状況を分けて議論しなければならない.
1.1.1 a+b
/* ID: beihai2013 PROG: test LANG: C++ */
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ofstream fout ("test.out");
ifstream fin ("test.in");
int a, b;
fin >> a >> b;
fout << a+b << endl;
return 0;
}
1.1.2簡単計算/*ID:beihai 2013 PROG:ride LANG:C+*/
include
include
include
include
include
include
include
using namespace std; const int MAXN = 1000; char s1[MAXN], s2[MAXN]; int main() { //scanf(“%s %s”, s1, s2); freopen(“ride.in”, “r”, stdin); freopen(“ride.out”, “w”, stdout); cin >> s1 >> s2; int ans1 = 1, ans2 = 1; for(int i = 0 ; i < (int)strlen(s1) ; i++) ans1 = (ans1 * (s1[i] - ‘A’ + 1)) % 47; for(int i = 0 ; i < (int)strlen(s2) ; i++) ans2 = (ans2 * (s2[i] - ‘A’ + 1)) % 47; if(ans1 == ans2) cout << “GO” << endl; else cout << “STAY” << endl;
//scanf("%s", s1);
return 0;
} 1.1.5簡単なシミュレーション.すべての人のお金の合計は0で、最初はすべての人のお金の数も0です.毎回一人が他の何人かにお金を分けて、均等に分けられないお金は自分で残しています.
/* ID: beihai2013 PROG: gift1 LANG: C++ */
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
const int MAXN = 20;
char name[MAXN];
char p[MAXN][MAXN];
int val[MAXN];
map<string,int>mm;
int main()
{
freopen("gift1.in", "r", stdin);
freopen("gift1.out", "w", stdout);
int n;
scanf("%d", &n);
for(int i = 1 ; i <= n ; i++){
scanf("%s", p[i]);
mm[p[i]] = i;
val[i] = 0;
}
while(scanf("%s", name) != EOF){
int sum, m;
int u = mm[name];
scanf("%d%d", &sum, &m);
if(m == 0){
continue;
}
for(int i = 0 ; i < m ; i++){
scanf("%s", name);
int v = mm[name];
val[v] += sum / m;
}
val[u] -= sum - sum % m;
}
for(int i = 1 ; i <= n ; i++){
printf("%s %d
", p[i], val[i]);
}
return 0;
}
1.1.6はますます難しくなってきた……アナログ時間、出力は1900年から、N年目の毎月13日はそれぞれ曜日6712345の数量のテーマで見間違えやすい、注意の与える条件は1900.1である.1は月曜日なので、転化しなければなりません.それから12月の日数を前にします.一年を巡るのはこの年の1-12月で、1月は前年の12月から変わったからです.
/* ID: beihai2013 TASK: friday LANG: C++ */
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 400 + 5;
int ans[MAXN][10];
int mon[20] = {0, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
int day(int year, int month)
{
if(month == 3){
if(year % 400 == 0) return 29;
else if(year % 100 != 0 && year % 4 == 0) return 29;
}
return mon[month];
}
void init()
{
memset(ans, 0, sizeof(ans));
int now = 5;
for(int i = 1 ; i < MAXN ; i++){
int year = 1900 + i - 1;
for(int j = 1 ; j <= 7 ; j++) ans[i][j] = ans[i - 1][j];
for(int j = 1 ; j <= 12 ; j++){
now = (now + day(year, j)) % 7;
if(now == 0) now = 7;
ans[i][now]++;
// printf("year = %d, month = %d, now = %d, day(year,j) = %d
", year, j, now, day(year, j));
// system("pause");
}
}
}
int main()
{
freopen("friday.in", "r", stdin);
freopen("friday.out", "w", stdout);
init();
int n;
scanf("%d", &n);
for(int i = 1 ; i <= 7 ; i++){
printf("%d", ans[n][i]);
if(i == 7) printf("
");
else printf(" ");
}
return 0;
}
1.1.7神坑シミュレーション.最初はO(N)でやろうと思っていたが、いろいろできなかった.O(N^2)でやろうとしたのは、ポイントごとに達成できる最左端と最右端を探していた.しかし、wと非wの状況を分けて議論しなければならない.
/* ID: beihai2013 TASK: beads LANG: C++ */
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN = 1e3;
char str[MAXN];
int l[MAXN], r[MAXN];
int main()
{
freopen("beads.in", "r", stdin);
freopen("beads.out", "w", stdout);
int n;
scanf("%d", &n);
scanf("%s", str);
for(int i = n ; i < 2 * n ; i++) str[i] = str[i - n];
str[n * 2] = '\0';
for(int i = 0 ; i < 2 * n ; i++){
if(str[i] != 'w'){
int now = i;
while(now >= 0 && (str[now] == 'w' || str[now] == str[i])) now--;
l[i] = i - now;
now = i;
while(now < 2 * n && (str[now] == 'w' || str[now] == str[i])) now++;
r[i] = now - i;
}
else{
int now = i;
while(now >= 0 && str[now] == 'w') now--;
if(now >= 0){
char temp = str[now];
while(now >= 0 && (str[now] == 'w' || str[now] == temp)) now--;
l[i] = i - now;
}
else l[i] = i - now;
now = i;
while(now < 2 * n && str[now] == 'w') now++;
if(now < 2 * n){
char temp = str[now];
while(now < 2 * n && (str[now] == 'w' || str[now] == temp)) now++;
r[i] = now - i;
}
else r[i] = -i + now;
}
}
int ans = 0;
for(int i = 0 ; i < 2 * n ; i++) ans = max(ans, l[i] + r[i + 1]);
ans = min(ans, n);
printf("%d
", ans);
return 0;
}