A-PACM Team
https://www.nowcoder.com/acm/contest/141/A
就是一个四维的01背包,只不过要记录路径,学到了~
#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="<<x
#define C(n,m) ((long long)fac[(n)]*inv[(m)]%MOD*inv[(n)-(m)]%MOD)
using namespace std;
typedef long long LL;
const int maxn=37;
short dp[maxn][maxn][maxn][maxn];
bool vis[maxn][maxn][maxn][maxn][maxn];
struct AAA
{
int c[5],v;
};
AAA a[maxn];
int C1,C2,C3,C4;
void bag01(int n,AAA t)
{
int c1=t.c[1],c2=t.c[2],c3=t.c[3],c4=t.c[4],v=t.v;
for(int i=C1;i>=c1;i--)
{
for(int j=C2;j>=c2;j--)
{
for(int k=C3;k>=c3;k--)
{
for(int l=C4;l>=c4;l--)
{
if(dp[i][j][k][l]<dp[i-c1][j-c2][k-c3][l-c4]+v)
{
dp[i][j][k][l]=dp[i-c1][j-c2][k-c3][l-c4]+v;
vis[n][i][j][k][l]=1;
}
}
}
}
}
}
int main()
{
int N;
cin>>N;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=4;j++)cin>>a[i].c[j];
cin>>a[i].v;
}
cin>>C1>>C2>>C3>>C4;
memset(vis,0,sizeof vis);
for(int i=1;i<=N;i++)
{
bag01(i,a[i]);
}
int cnt=0;
int ans[maxn];
memset(ans,0,sizeof(ans));
for(int i=N,j=C1,k=C2,l=C3,m=C4;i>=1&&j>=0&&k>=0&&l>=0&&m>=0;i--)
{
if(vis[i][j][k][l][m])
{
j-=a[i].c[1];
k-=a[i].c[2];
l-=a[i].c[3];
m-=a[i].c[4];
ans[i]=1;
cnt++;
continue;
}
}
cout<<cnt<<endl;
for(int i=1;i<=N;i++)
{
if(ans[i])cout<<i-1<<" ";
}
cout<<endl;
}
C-Shuffle Cards
竟然有库函数。。。
#include"bits/stdc++.h"
#include"ext/rope"
#define out(x) cout<<#x<<"="<<x
using namespace __gnu_cxx;
using namespace std;
typedef long long LL;
const int maxn=1e6+5;
rope<int>ro;
int main()
{
int N,K;
cin>>N>>K;
for(int i=1;i<=N;i++)ro.append(i);
while(K--)
{
int L,len;
cin>>L>>len;
L--;
rope<int>tmp;
tmp=ro.substr(L,len);
ro.erase(L,len);
ro.insert(0,tmp);
}
for(int i=0;i<N;i++)printf("%d ",ro[i]);
printf("\n");
}
H-Diff-prime Pairs
https://www.nowcoder.com/acm/contest/141/H
这题。。。当我们队都还在冥思苦想抓头发的时候,ymf说,让我交一哈嘛~,结果,啪的一哈,就过了。。。。。。他才大一啊。。。让我们怎么活啊。。。。
题解:ymf的一句话提醒了我~,要是 阔以的话,那么 也阔以, 还是阔以,哇~
好像发现了什么规律。
就是找 的两个质数,然后他们的倍数也满足条件~
而最多倍数能达到几倍喃?就是 除以最大的那个呀,然后这题就完了。。。
#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="<<x
using namespace std;
typedef long long LL;
const int maxn=1e7+5;
vector<int> prime;
bool vis[maxn];
int cnt[maxn];
void PRIME(int NN)
{
memset(vis,1,sizeof(vis));
for(int i=2;i<=NN;i++)
{
if(vis[i])prime.push_back(i);
for(int j=0;j<prime.size()&&i*prime[j]<=NN;j++)
{
vis[i*prime[j]]=0;
if(i%prime[j]==0)break;
}
cnt[i]=prime.size();
}
}
int main()
{
PRIME(maxn-5);
int N;
while(cin>>N)
{
LL ans=0;
for(int i=2;i<=N;i++)
{
if(vis[i])
{
ans+=(cnt[i]-1)*(N/i);
}
}
cout<<ans*2<<endl;
}
}