虽然USACO有无数的解题报告,但是这是我的成果,晒晒水题代码。
Gift: map简单过。
/*
ID: duanjia2
PROG: gift1
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<string>
#include<map>
using namespace std;
int main()
{
ifstream fin("gift1.in");
ofstream fout("gift1.out");
int np,i,a,m,n;
string name[12],giver,str;
map<string,int> mp;
fin>>np;
for( i=0; i<np; i++){
fin>>name[i];
mp[name[i]]=0;
}
while( fin>>giver){
fin>>m>>n;
if(n==0) continue;
a=m/n;
mp[giver]-=a*n;
while( n--){
fin>>str;
mp[str]+=a;
}
}
for( i=0; i<np; i++)
fout<<name[i]<<' '<<mp[name[i]]<<endl;
//system("pause");
return 0;
}
Friday: 直接模拟
代码:
/*
ID: duanjia2
PROG: friday
LANG: C++
*/
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
int f[7];
int main()
{
ifstream fin("friday.in");
ofstream fout("friday.out");
int n,day,i,j;
fin>>n;
n+=1900;
memset(f,0,sizeof(f));
day=13;
for( i=1900; i<n; i++){
for( j=1; j<=12;j++){
f[day%7]++;
if( j==2){
if( i%4==0&&i%100!=0||i%400==0)
day+=29;
else
day+=28;
}
else if( j==4||j==6||j==9||j==11)
day+=30;
else
day+=31;
}
}
fout<<f[6]<<' '<<f[0];
for( i=1; i<6; i++)
fout<<' '<<f[i];
fout<<endl;
// system("pause") ;
return 0;
}
Beads: 简单模拟,数量小
代码:
/*
ID: duanjia2
PROG: beads
LANG: C++
*/
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
char str[355];
int main()
{
ifstream fin("beads.in");
ofstream fout("beads.out");
int n,p,a,b,i,j,mx,w,r;
fin>>n;
r=0,b=0, w=0;
char c1,c2;
for( i=0;i<n;i++){
fin>>str[i];
if(!w&&str[i]=='w') w=1;
if(!r&&str[i]=='r') r=1;
if(!b&&str[i]=='b') b=1;
}
if(w+r+b==1) fout<<n<<endl; //只有一种颜色
else if(w+r+b==2){ //两种
a=0,b=0,mx=0;
for( i=0;i<n;i+=a){
j=i; a=1;
while( str[j%n]==str[(j+1)%n])
a++, j++;
j=(i-1+n)%n; b=1;
while( str[(j+n)%n]==str[(j-1+n)%n])
b++, j--;
if(mx<a+b) mx=a+b;
}
fout<<mx<<endl;
}
else{ //三种
mx=0;
for( i=0;i<n;i+=a){
j=i, a=1;
c1=str[j];
while( c1==str[(j+1)%n]||str[(j+1)%n]=='w') //往右计数
a++,j++;
j=(i-1+n)%n;
b=1;
while( (j<i||(j+n)%n>i+a)&&str[(j+n)%n]=='w'){ //往左计数
j--; b++;
}
c2=str[(j+n)%n];
while( (j<i||(j-1+n)%n>i+a)&&(c2==str[(j-1+n)%n]||str[(j-1+n)%n]=='w')) //从左边扫描环形到右边的情况
b++,j--;
// cout<<i<<' '<<a<<' '<<b<<' '<<a+b<<endl;
if(mx<a+b) mx=a+b;
}
fout<<mx<<endl;
}
// system("pause");
return 0;
}