程序设计思维与实践 Week13 作业 (3/4/数据班)

程序设计思维与实践 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;
}
原文地址:https://www.cnblogs.com/master-cn/p/12904868.html