SDUT 2017 Autumn Single Contest K

来源:互联网 发布:oracle数据库有可视化 编辑:程序博客网 时间:2024/06/05 00:08

题目链接
A:贪心
题意:一只蜈蚣有40条左腿和40条右腿。它有a只左鞋和b只右鞋。穿一只左鞋2s,穿一只右鞋1s,扔鞋1s。问给所有脚都穿上鞋最坏需要多长时间。
解析:贪心一下,看什么情况下会花最长的时间。无非两种情况下时间最长:
1、先拿所有右鞋去试左脚,再穿左脚:2*b + 40;
2、先给39只右脚穿上鞋,再给所有的左脚穿上鞋,然后再把所有的剩下的左鞋去试右脚,然后再穿上右鞋:39 * 2 + 40 + 2 *(a - 40)+ 1;

#include<iostream>#include <bits/stdc++.h>using namespace std;int main() {    int a, b;    cin >> a >> b;    int c = 40+b*2;    int d = 2*a+39;    cout<<max(c,d)<<endl;}

B Fibonacci Sequence
二分枚举斐波那契的下一项
注意二分的姿势,用题目给出的第二项验证,然后递推求出要求的项

#include <bits/stdc++.h>using namespace std;#define ll long longint main(){    ll i,fi,j,fj,n;    while(cin>>i>>fi>>j>>fj>>n)    {        if(i>j)        {            swap(i,j);            swap(fi,fj);        }        ll l,r,mid,a,b,c;        l = -2000000000LL,r = 2000000000LL;        while(l<r)        {            mid = (l+r)/2;            a = fi;            b = mid;            for(int k=i+2; k<=j; k++)            {                c = a+b;                a = b;                b = c;                if(c>4000000001LL||c<-4000000001LL)                {                    break;                }            }            if(b<fj)            {                l  = mid+1;            }            else if(b>fj)r = mid-1;            else { l =mid,r = mid;}        }        a = fi;        b = r;        if(n>=i+1)        {            for(int k=i+2;k<=n;k++)            {                c = a+b;                a = b;                b = c;            }            printf("%lld\n",b);        }        else        {            for(int k=i-1;k>=n;k--)            {                c = b-a;                b = a;                a = c;            }            printf("%lld\n",a);        }}return 0;}

E:URAL 2067 Friends and Berries (推理,数学)

题意:给定 n 个人,每个人两个值s, r,要满足,p(v, u) = sqrt((sv − su)^2 + (rv − ru)^2), p(v,u,w) = (p(v,u) + p(v,w) + p(u,w)) / 2

要求找出p(v, u) ≥ p(v,u,w) 的对数,其中w是除u,v外,任意的人。
析:化简一下这个表达式,这很明显是两边之和小于等于第三边,好像挺熟悉啊,对,三角形是两边之和大于第三边,现在是小于,不可能,只能是等于,要想等于,
那么只是共线了,并且w是任何人,所以这些点全部都要共线。并且两端的人就是答案,并且只有一对。

#include <iostream>#include<bits/stdc++.h>using namespace std;#define double long longstruct node{    long long x,y,i;} aa[266666];int cmp(node a,node b){    if(a.x==b.x)        return a.y<b.y;    else        return a.x<b.x;}int main(){    int n;    cin>>n;    for(int i=1; i<=n; i++)    {        scanf("%lld%lld",&aa[i].x,&aa[i].y);        aa[i].i = i;    }    sort(aa+1,aa+1+n,cmp);    long long x1 = aa[2].x-aa[1].x;    long long y1 = aa[2].y-aa[1].y;    int f =1;    for(int j=3; j<=n; j++)    {        long long x2 = aa[j].x-aa[1].x;        long long y2 = aa[j].y-aa[1].y;        if(x1*y2!=x2*y1)        {            f =0 ;            break;        }    }    if(f)    {           cout<<"1"<<endl;            printf("%lld %lld\n",aa[1].i,aa[n].i);    }    else    cout<<"0"<<endl;    return 0;}

G dfs可以跑出所有结果,很容易发现规律
不能包含回文串,所以aa,aba这样的串最后答案都不能包含。

#include <iostream>#include<bits/stdc++.h>using namespace std;char ans[][10]={"abc","acb","bac","bca","cab","cba"};int main(){    int n;    cin>>n;    if(n==1)    {        cout<<"a\nb\nc\n";    }    else if(n*6>100000)    {        cout<<"TOO LONG"<<endl;    }    else    {        for(int i=0;i<6;i++)        {            for(int j=0;j<n;j++)            {                printf("%c",ans[i][j%3]);            }            printf("\n");        }    }    return 0;}
原创粉丝点击