A
题目描述:
解题思路:这道题后知后觉很简单,因为全为单数或者偶数,那么就可以分类成全1和全2,当全为n-1个1时,最后剩下的那个也为单数即为yes,偶数同理
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>k>>n;
int ans1=k-n+1;
int ans2=k-(n-1)*2;
//cout<<ans1<<" "<<ans2<<endl;
if((ans1%2==1&&ans1>0)||(ans2%2==0&&ans2>0))
{
if(ans1%2==1&&ans1>0)
{
cout<<"YES"<<endl;
for(int i=0;i<n-1;i++)
cout<<"1 ";
cout<<ans1<<endl;
}
else if(ans2%2==0&&ans2>0)
{
cout<<"YES"<<endl;
for(int i=0;i<n-1;i++)
cout<<"2 ";
cout<<ans2<<endl;
}
}
else cout<<"NO"<<endl;
}
}
B
题目描述:
解题思路:如果比n小就直接输出,否则有一个公式:n*k/(n-1),最大的要么是他,要么是他-1
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long n,k;
cin>>n>>k;
if(k<n) cout<<k<<endl;
else{
long long ans=n*k/(n-1);
if(ans%n==0)
cout<<ans-1<<endl;
else cout<<ans<<endl;
}
}
}
C
题目描述:
解题思路:
动态规划:
dp[i][j]+=max(dp[i+1][j+1],max(dp[i+1][j],dp[i+1][j-1]));
实现代码如下:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100010;
int dp[maxn][15];
int main(){
int m;
while(cin>>m&&m!=0)
{
int op=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
dp[b][a]++;
op=max(op,b);
}
for(int i=op-1;i>=0;i--)
{
for(int j=0;j<11;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;
}
本文解析了三道算法竞赛题目,包括简单的数学问题、优化问题及动态规划问题,提供了清晰的解题思路和C++代码实现,适合算法学习者和竞赛选手参考。







3865

被折叠的 条评论
为什么被折叠?



