USACO Section 1.1

      虽然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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值