“玲珑杯”ACM比赛 Round #23

A – 生是脂肪的人

分析:打表找规律;

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;

const int maxn = 1010;
double x[maxn], y[maxn];

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        LL n;
        scanf("%lld", &n);
        if(n <= 0)  { //注意这个
            printf("0\n");
            continue;
        }
        if(n % 6 == 1) printf("1\n");
        if(n % 6 == 2) printf("4\n");
        if(n % 6 == 3) printf("2\n");
        if(n % 6 == 4) printf("8\n");
        if(n % 6 == 5) printf("5\n");
        if(n % 6 == 0) printf("7\n");
    }
    return 0;
}

B – 死是脂肪的鬼
这里写图片描述
分析:直接暴力,按照题目模拟题意;

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;

const int maxn = 15;
int ma[maxn][maxn];
int vis[maxn][maxn];

bool dfs(int x, int y) {
    int cnt[14];
    memset(cnt, 0, sizeof(cnt));
    for(int i = x; i <= 2 + x; i++) {
        for(int j = y; j <= y + 2; j++) {
            vis[i][j] = 1;
            cnt[ma[i][j]] = 1;
        }
    }
    for(int i = 1; i <= 9; i++) {
        if(!cnt[i]) return false;
    }
    return true;
}

int main() {
    int t;
    scanf("%d", &t);
    getchar();
    while(t--) {
        memset(vis, 0, sizeof(vis));
        for(int i =1; i <= 9; i++) {
            if(i != 1) getchar();
            for(int j = 1; j <= 9; j++) {
                scanf("%d", &ma[i][j]);
            }
        }
        bool flag = true;
        for(int i = 1; i<= 9; i++) {
            for(int j = 1; j <= 9; j++) {
                if(vis[i][j]) continue;
                if(!dfs(i, j)) {
                    flag = false;
                    break;
                }
            }
            if(!flag) break;
        }
        int cnt[15];
        for(int i = 1; i<= 9; i++) {
            memset(cnt, 0, sizeof(cnt));
            for(int j = 1; j <= 9; j++) {
                cnt[ma[i][j]] = 1;
            }
            for(int j = 1; j <= 9; j++) {
                if(!cnt[j]) {
                    flag = false;
                    break;
                }
            }
            if(!flag) break;
        }
        for(int i = 1; i<= 9; i++) {
            memset(cnt, 0, sizeof(cnt));
            for(int j = 1; j <= 9; j++) {
                cnt[ma[j][i]] = 1;
            }
            for(int j = 1; j <= 9; j++) {
                if(!cnt[j]) {
                    flag = false;
                    break;
                }
            }
            if(!flag) break;
        }
        if(flag) puts("Yes");
        else puts("No");
    }
    return 0;
}

C – 你居然不吃巧克力
这里写图片描述
分析:最优情况,每次把小的二合成一。有点二分的意思,遇到无法相同合并时,把零散的从小到大合并(有的用递推写的,道理一样)。
比如n == 1:
第一步:1 1 1 1 1 1 1 1 1 1 1 -》 0
第二步:2 2 2 2 2 1 -》5
第三步:4 4 2 1 -》 9
第四步:8 2 1 -》 13
最后一步:11 -》 13 + 1 + 3 = 17

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;

const int maxn = 15;
int ma[maxn][maxn];
int vis[maxn][maxn];
int dp[10010];

long long quickpow(long long n,long long m)   
{  
long long ans=1,base=n;  
while(m)  
{  
if(m & 1)   
{  
  ans=(base*ans);  
   }  
   base=(base*base);  
   m>>=1;//m=m/2;  
}  
return ans;  
}  

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        LL n;
        scanf("%lld", &n);
        LL cnt = 0, sum = 0;
        int  p = 0;
        while(n != 1) {
            if(n & 1) {
                dp[p++] = quickpow(2, cnt);
            }
            n >>= 1;
            sum = sum + n * quickpow(2, cnt); 
            cnt++;
        }
        for(int i = 0; i <= p - 1; i++) {

            dp[i + 1] += dp[i];
            sum += min(dp[i], dp[i + 1]);
        }
        printf("%lld\n",sum);
    }
    return 0;
}

1176 - 别不好意思,都是脂肪的人
Time Limit:2s Memory Limit:128MByte
DESCRIPTION
给定两个正整数 n 和 k请求出:
这里写图片描述
数据保证答案是一个有理数,我们假设它为 p/q p / q , 你只需输出它对 1e9+7 的模即可。
INPUT
第一行一个正整数
T
T 表示数据组数。
对于每组数据:
一行两个正整数,表示 n 和 k。
OUTPUT
一共 T行,每行一个正整数,表示答案。
SAMPLE INPUT
1
7 3
SAMPLE OUTPUT
457031313
HINT
数据范围:
1<=T<=1000,1<=n<=1e9,2<=k<=1e9 。

直接给公式了,不会推导:
ans=nkn(k1)(n+1) a n s = n ∗ k n ( k − 1 ) ( n + 1 ) .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值