首页  >  文章  >  web前端  >  Codeforces Round #256 (Div. 2) A/B/C/D_html/css_WEB-ITnose

Codeforces Round #256 (Div. 2) A/B/C/D_html/css_WEB-ITnose

WBOY
WBOY原创
2016-06-24 11:59:331012浏览

A. Rewards

水题


#include<cstdio>#include<iostream>#include<cstring>using namespace std;int main(){    int a1,a2,a3,b1,b2,b3,s,t1,t2,sum1,sum2;    while(scanf("%d%d%d",&a1,&a2,&a3)!=EOF)    {        scanf("%d%d%d",&b1,&b2,&b3);        scanf("%d",&s);        sum1 = a1+a2+a3;        sum2 = b1+b2+b3;        if(sum1>=5)        {            t1 = sum1/5;            if(sum1%5) t1++;        }        else if(sum1>0) t1 = 1;        else t1 = 0;        if(sum2>=10)        {            t2 = sum2/10;            if(sum2%10) t2++;        }        else if(sum2>0) t2 = 1;        else t2 = 0;        if(t1+t2>s) puts("NO");        else puts("YES");    }    return 0;}</cstring></iostream></cstdio>

B. Suffix Structures

题意:给你两个字符串,要把a串变为b串,如果只需要删除某些字符就能达到目的就输出automaton

如果只通过交换某些字符就输出array,如果两种操作都需要才能达到目的就输出both,如果两种操作

同时使用都不行则输出need tree.


算法:

这个其实情况很复杂的,必须保持头脑清晰清晰清晰~


1、首先如果两个串是相同的则输出array。

2、如果a串长度小于b串长度或者b串中的对应字母在a串中个数不够或者种类不够都是need tree.

3、如果a串长度等于b串长度,且a串中能找到对应的b串中的字母则输出array.

4、如果a串长度大于b串长度,b串中的字母在a串中依次出现则输出automaton.如果虽然都出现了但是

顺序不一样,则输出both。


#include<cstdio>#include<iostream>#include<cstring>#include<vector>using namespace std;char s1[110],s2[110];vector<int> c;int cnt1[30],cnt2[30];int main(){    int flag1,flag2,d,flag;    while(scanf("%s%s",s1,s2)!=EOF)    {        if(strcmp(s1,s2)==0)        {            printf("array\n");            continue;        }        flag1 = flag2 = flag = 0;        c.clear();        memset(cnt1,0,sizeof(cnt1));        memset(cnt2,0,sizeof(cnt2));        int len1 = strlen(s1);        int len2 = strlen(s2);        if(len1>len2) flag1 = 1;        for(int i=0;i<len2 cnt2 for j="0;j<len1;j++)" cnt1 i="0;i<len2;i++)" if> cnt1[s2[i]-'a'])            {                flag = 1;                break;            }        }        if(flag || len1<len2 printf tree continue for i="0;i<len1;i++)" if c.push_back int t="1;" j="c[i]+1;j<len1;j++)" len2 flag2="1;" break else return>  <br>  <br>  <p></p>  <p>C. Painting Fence</p>  <p>题意:有n个长度为ai的木条。然后有一个油漆刷,木条宽度和油漆刷的宽度都为1,要把</p>  <p>木条都涂色。且油漆刷刷到的地方都要有木块。问最少需要刷多少次。</p>  <p><br> </p>  <p>算法:记忆化搜索</p>  <p>1、横向刷的下面一定是横向刷。</p>  <p>2、刷完了下面共同的长度后会把木条分成断开的几截,每一截由若干木条的上半部分未刷油漆的组成。</p>  <p>每一部分要么就是竖着刷要么就是横着刷,这时比较两种刷法的次数,取小者。[l,r]的部分竖着刷要刷</p>  <p>r-l+1下,横着刷还是先刷公共部分,再看上面分成几截,于是又出现了相同的子问题。用dfs递归解决。</p>  <p></p>  <pre name="code" class="sycode">#include<cstdio>#include<iostream>#include<cstring>#define maxn 5010using namespace std;typedef long long ll;ll a[maxn];ll min(ll x,ll y){    return x<y work l r cen ll mi="a[l];" for i="l+1;i<=r;i++)" sum="mi-cen,s" r-l int last="l;" if return min main n while scanf ans="work(1,n,0);" printf>  <br>  <br>  <p></p>  <p>D. Multiplication Table</p>  <p>题意:n行m列的乘法表,为第k大的数是哪个。</p>  <p>比如:2*3的乘法表为     1    2    3</p>  <p>                                           2    4    6</p>  <p>算法:二分查找。</p>  <p>由于最大的数为n*m=25*10^10,想到二分。第k大的数就是说有k个小于等于他的数(这种说法也不准确),</p>  <p>反正就是第一个找到的这样的最小的数。</p>  <p>充分利用乘法表的特点,每一行都是行数乘以1-m。所以找比小于等于x的数就是min(m,x/i)。</p>  <p><br> </p>  <p>P.S 。。。反正我是没想到这个解法啦。。。o(?□?)o。。。学习了。。。</p>  <p><br> </p>  <p></p>  <pre name="code" class="sycode">#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;typedef long long ll;ll k,n,m;ll min(ll x,ll y){    return x<y check x ll sum="0;" for i="1;i<=n;i++)" min return main ans while l="1,r" n mid="(l+r)">>1;            if(check(mid)>=k)            {                ans = mid;                r = mid-1;            }            else l = mid+1;        }        printf("%I64d\n",ans);    }    return 0;}</y></queue></cstring></iostream></cstdio>














声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn