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
思路
n/k
代表初步结果res
,n%k
代表剩余的数remain
。若res>=1
,则进一步判断处理,否则不存在输出NO
。- 若剩余的
remain
为偶数,则代表当前res
的奇偶性不用改变,输出结果k-1个res
和1个res+remain
,否则进一步判断处理。 - 改变
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;
}