week13作业

A

题意

k个奇偶性相同的数,和为n。求这k个数,若不存在输出NO。

  • 样例
Input
8
10 3
100 4
8 7
97 2
8 8
3 10
5 3
1000000000 9
Output
YES
4 2 4
YES
55 5 5 35
NO
NO
YES
1 1 1 1 1 1 1 1
NO
YES
3 1 1
YES
111111110 111111110 111111110 111111110 111111110 111111110 111111110 111111110 111111120

思路

  1. n/k代表初步结果res, n%k代表剩余的数remain。若res>=1,则进一步判断处理,否则不存在输出NO
  2. 若剩余的remain为偶数,则代表当前res的奇偶性不用改变,输出结果k-1个res和1个res+remain,否则进一步判断处理。
  3. 改变res奇偶性(res--),改变剩余的数remain+=k。若res仍非0且remain为偶数,则按k-1个res和1个res+remain输出,否则输出NO

代码

#include<cstdio>
using namespace std;

int main(void){
    int T;
    scanf("%d",&T);
    while(T--){
        int n,k;
        scanf("%d%d",&n,&k);
        int res=n/k,remain=n%k;
        if(res>=1){
            if(remain%2==0){
                printf("YES\n");
                for(int i=0;i<k-1;i++)
                    printf("%d ",res);
                printf("%d\n",res+remain);
            }
            else{
                remain+=k;
                res--;
                if(res>=1&&remain%2==0){
                    printf("YES\n");
                    for(int i=0;i<k-1;i++)
                        printf("%d ",res);
                    printf("%d\n",res+remain);
                }
                else printf("NO\n");
            }
        }
        else printf("NO\n");
    }
    return 0;
}

B

题意

求第k个不能被n整除的数。

  • 样例
Input
6
3 7
4 12
2 1000000000
7 97
1000000000 1000000000
2 1
Output
10
15
1999999999
113
1000000001
1

思路

按整除结果1,2,3,...分组,第i组有(n-1)*i个不能被整除。求第k个不能被整除的,则在第k/(n-1)(能整除时)或k/(n-1)+1组(不能整除时)。

代码

#include<cstdio>
using namespace std;

int main(void){
    int T;
    scanf("%d",&T);
    while(T--){
        int n,k;
        scanf("%d%d",&n,&k);
        int g=k/(n-1),rm=k%(n-1);
        if(rm==0)
            printf("%d\n",n*g-1);
        else
            printf("%d\n",n*g+rm);
    }
    return 0;
}

C

题意

思路

总结

dp问题

代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5;
int dp[MAXN][15];

int main(void){
    int m;
    while(~scanf("%d",&m)&&m){
        for(int i=0;i<MAXN;i++)
            for(int j=0;j<15;j++)
                dp[i][j]=0;
        int rc=0;
        for(int i=0;i<m;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            dp[b][a]++;
            if(b>rc) rc=b;
        }
        for(int i=rc-1;i>=0;i--)
            for(int j=0;j<=10;j++)
                dp[i][j]=dp[i][j]+max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]));
        printf("%d\n",dp[0][5]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值