【USACO1.2】解题报告

前言

以后将会不定期刷USACO的题目。每做完一小章会写一份解题报告。这一小章里面较简单或者并不是很重要的题目就会直接放在里面。而比较重要的题目就会单独写博客,在这里面放链接。
这一章很简单,全部都是很基础的题目。就直接在这里面一笔带过。
USACO:http://train.usaco.org


1.2.1.Submitting Solutions

思路:

没啥好说的。

代码:

/*
ID:ssl_zyc2
TASK:test
LANG:C++
*/

#include 
#include 
using namespace std;

int a,b;

int main()
{
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	cin>>a>>b;
	cout<

1.2.2.Your Ride Is Here

思路:

暴力模拟。对于每个字符串的每个字符,按照方法分开处理。

代码:

/*
ID:ssl_zyc2
TASK:ride
LANG:C++
*/

#include
#include
#include
using namespace std;

char ch1[8],ch2[8];

int main()
{
	freopen("ride.in","r",stdin);
	freopen("ride.out","w",stdout);
    long long a=1,b=1;
    cin>>ch1;
    cin>>ch2;
    int l1,l2;
    l1=strlen(ch1);
    l2=strlen(ch2);  //取出长度
    for(int i=0;i

1.2.5.Greedy Gift Givers

思路:

简单的爆模。

代码:

/*
ID:ssl_zyc2
TASK:gift1
LANG:C++
*/

#include 
#include 
#include 
using namespace std;

int n,k,m,a[101],ok,per;
char name[101][1001],c[1001],person[1001];

int main()
{
	freopen("gift1.in","r",stdin);
	freopen("gift1.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
     cin>>name[i];
    for (int i=1;i<=n;i++)
    {
        cin>>person;
        for (per=1;per<=n;per++)
         if (strcmp(person,name[per])==0) break;
        scanf("%d%d",&m,&k);
        a[per]-=m;
        for (int j=1;j<=k;j++)
        {
            cin>>c;
            for (int q=1;q<=n;q++)
            {
                if (strcmp(c,name[q])==0) 
                {
                    a[q]+=m/k;
                    break;
                }
            } 
        }
        if (k==0) a[i]+=m;
        else a[per]+=m%k;
    }
    for (int i=1;i<=n;i++)
    {
        cout<

1.2.6.Friday the Thirteenth

思路:

一天一天处理,时间慢,代码易懂,好打。

代码:

/*
ID:ssl_zyc2
TASK:friday
LANG:C++
*/

#include 
#include 
using namespace std;

const int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};  //储存每一月的天数
int n,ans[8],day,month,year,k;

int leap_year()  //闰年
{
    if (year%400==0) return 1;
    if (year%4==0&&year%100!=0) return 1;
    return 0;
}

void p(int x)
{
    cout<>n;
    while (year<=1900+n-1)
    {
        day++;
        k++;
        if (k>7) k=1;
        if (day==13) ans[k]++;
        if (leap_year()==1&&month==2&&day==29)
        {
            day++;
            k++;
        }
        if (k>7) k=1;
        if (day>m[month])
        {
            month++;
            day=1;
        }
        if (month>12)
        {
            month=1;
            year++;
        }
    }
    p(6);p(7);p(1);p(2);p(3);p(4);cout<

1.2.7Broken Necklace

思路:

枚举每一个位置开始,分别向左和向右,并记录答案。取最大值。

代码:

/*
ID:ssl_zyc2
TASK:beads
LANG:C++
*/

#include 
#include 
#include 
using namespace std;

int n,maxn,sum;
char c[1001],col;

void left(int x)
{
    while (c[x]==col||col=='w'||c[x]=='w')
    {
        if (c[x]!='w') col=c[x];
        sum++;
        x--;
        if (sum==n) return;
        if (x<0) x=n-1;
    }
}

void right(int x)
{
    while (c[x]==col||col=='w'||c[x]=='w')
    {
        if (c[x]!='w') col=c[x];
        sum++;
        x++;
        if (sum==n) return;
        if (x>=n) x=0;
    }
}

int main()
{
	freopen("beads.in","r",stdin);
	freopen("beads.out","w",stdout);
    scanf("%d",&n);
    cin>>c;
    for (int i=0;i<=n;i++)
    {
        col=c[i];
        left(i);
        if (sum==n) return printf("%d\n",n)%1;
        if (i!=n) col=c[i+1]; else col=c[0];
        if (i!=n) right(i+1); else right(0);
        if (sum==n) return printf("%d\n",n)%1;
        maxn=max(sum,maxn);
        sum=0;
    }
    return  printf("%d\n",maxn)%1;
}

你可能感兴趣的:(USACO解题报告)