程序设计思维与实践 Week13 作业 (3/4/数据班)
A - TT 的神秘任务1(必做)
问题分析
相当与前k-1个数均为1或者2,检查是否存在是问题有解的第k个数。
#include<bits/stdc++.h>
using namespace std;
int T,n,k;
int main(){
cin>>T;
while(T--){
cin>>n>>k;
if((n-k+1)%2==1&&(n-k+1)>0){
cout<<"YES"<<endl;
for(int i=0;i<k-1;i++)
cout<<"1 ";
cout<<n-k+1<<endl;
continue;
}
else if((n-2*(k-1))%2==0&&(n-2*(k-1))>0){
cout<<"YES"<<endl;
for(int i=0;i<k-1;i++)
cout<<"2 ";
cout<<n-(k-1)*2<<endl;
continue;
}
else{
cout<<"NO"<<endl;
continue;
}
}
return 0;
}
B - TT 的神秘任务2(必做)
问题分析
转化为在去掉n,2n,3n,4n...的正整数中序列,找第K个
例如,去掉3的倍数的序列种,找第4个。可知每一组(第一组是1,2,第二组是4,5,...)只有两个数。自然知道,要求的数落在了第4%2=2组,且是最后一个,即2*3-1=5.
#include <bits/stdc++.h>
using namespace std;
int T;
long long n,k;
int main(){
cin>>T;
while(T--){
cin>>n>>k;
int p=k/(n-1 );
int q=k%(n-1 );
if(q==0){
cout<<n*p-1<<endl;
}
else{
cout<<n*p+q<<endl;
}
}
return 0;
}
C - TT 的奖励(必做)
问题分析
DP问题,看了大佬的公式。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int m,a,b,op,dp[maxn][15];
int main(){
while(cin>>m){
if(m==0) break;
op=0,memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++){
cin>>a>>b;
dp[b][a]++;
if(b>op)
op=b;
}
for(int i=op-1;i>=0;i--)
for(int j=0;j<=10;j++)
dp[i][j]+=max(dp[i+1][j+1],max(dp[i+1][j],dp[i+1][j-1]));
cout<<dp[0][5]<<endl;
}
return 0;
}