bestcoder Round #75(前四)

King's Cake (简单数学)
大意:一块n*m的蛋糕切成多个正方形(体),正方形尽可能大,求解正方形的个数。
分析:此过程像极了GCD


#include <iostream>
#include <cstdio>
using namespace std;
int sum=0;
void gcd(int a,int b){
    sum++;
    if(a<b) {
        a=a^b;  b=a^b;  a=a^b;
    }
    if(a==b) { return ; }
    else {
        gcd(b,a-b);
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        int a,b;
        sum=0;
        scanf("%d%d",&a,&b);
        gcd(a,b);
        printf("%d\n",sum);
    }
    return 0;
}


King's Phone (模拟)
大意:手机解锁密码。
手机屏幕九格:
1 2 3
4 5 6
7 8 9
密码条件:
- The password contains at least four points.
- Once a point has been passed through. It can't be passed through again.
- The middle point on the path can't be skipped, unless it has been passed through(
3427
is valid, but
3724
is invalid).

给出密码判断是否满足规定。

分析:直接模拟即可。但是注意给出的si,不是一位数哦


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[100];
char str[350];
int d[10];
int f[10][10];
int main()
{
    f[1][3]=f[3][1]=2;
    f[1][9]=f[9][1]=5;
    f[1][7]=f[7][1]=4;
    f[2][8]=f[8][2]=5;
    f[3][9]=f[9][3]=6;
    f[3][7]=f[7][3]=5;
    f[6][4]=f[4][6]=5;
    f[9][7]=f[7][9]=8;
    int t,k;
    cin>>t;
    while(t--){
        int top=0;
        memset(d,0,sizeof(d));
        scanf("%d",&k);
        bool OK=1;
        for(int i=0;i<k;i++){
            scanf("%s",a);
            int len=strlen(a);
            for(int j=0;j<len;j++) {
                str[top++]=a[j];
                if(a[j]=='0') OK=0;
            }
        }
        if(top<4) OK=0;
        for(int i=0;i<top;i++){
            if(i>0){
                int mid=f[str[i]-'0'][str[i-1]-'0'];
                if(mid!=0 && d[mid]==0) OK=0;
            }
            d[str[i]-'0']++;
            if(d[str[i]-'0']>1) OK=0;
        }
        if(OK) puts("valid");
        else puts("invalid");
    }
    return 0;
}


King's  Order(DP)
大意:给定字符串的长度,在字符串中最多存在3个连续相同的字符。求解符合条件的字符串的个数

#include <iostream>
#include <cstdio>
using namespace std;
const int mod=1000000007,N=2e3+10;
typedef long long LL;
LL dp[N];
int main()
{
    dp[1]=26;
    dp[2]=dp[1]*26;
    dp[3]=dp[2]*26;
    for(int i=4;i<N;i++){
        dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])*25%mod;
    }
    int t,n;
    cin>>t;
    while(t--){
        scanf("%d",&n);
        printf("%I64d\n",dp[n]);
    }
    return 0;
}

King's Game
大意(分析):和普通的约瑟夫环很像,不过,第k轮是念到k的人出来。将约瑟夫环的解决过程稍作变化即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int work(int k,int n,int c){
    if(c==1)  return (n+k-1)%n;
    else return (k+work(k+1,n-1,c-1))%n;
}
int main()
{
    int t,n;
    cin>>t;
    while(t--){
        scanf("%d",&n);
        int k=1;
        cout<<work(k,n,n)+1<<endl;
    }
    return 0;
}

第5道:
King's Pilots
额,图论是软肋。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值