您的位置:首页 > 其它

“玲珑杯”ACM比赛 Round #18

2017-07-15 19:28 513 查看
赛后补题0 0 原谅我,比赛的时候悲催的挂0了。

垃圾!

玲珑杯 1146 - 图论你先敲完模板

http://www.ifrog.cc/acm/problem/1146

DP题,dp[i]表示到达第i个休息战的最小花费,那么dp[i]= min(dp[i],dp[j]+cost)。之后列出方程即可。

#include <bits/stdc++.h>
#define maxs 202020
#define mme(i,j) memset(i,j,sizeof(i))
using namespace std;
long long poww[45];
long long dp[maxs];
int x[maxs];

void init(){
mme(poww,0);
poww[0]=1;
for(int i=1;i<=40;i++)
poww[i]=poww[i-1]*2;
}

int main(){
init();
int n,t,a;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&a);
for(int i=1;i<=n;i++)
scanf("%d",&x[i]);
dp[1]=0;

for(int i=2;i<=n;i++)
{
dp[i]=LONG_LONG_MAX;
long long len=0;
for(int j=i-1;j>=1;j--){

len=len+x[j+1]-x[j];
if(len>40)
break;
dp[i]=min(dp[i],dp[j]+poww[len]+a);
}
}

cout<<dp
<<endl;
}

return 0;
}


A题 1143 - 计算几何你瞎暴力

我真是瞎,我没注意x,y,z的范围只是0~10,我以为 是1~5e4呢,我还在想,这个题怎么那么多人都会。我都怀疑人生了。x,,y,z确定后,那么给的n很大,那么只有一种可能,同一个点上有多个重复教室。那么我们暴力吧

#include <bits/stdc++.h>
#define maxs 220200
#define mme(i,j) memset(i,j,sizeof(i))
using namespace std;
long long vis[15][15][15];
long long ans[1505];

int main(){
int t;
scanf("%d",&t);
while(t--){
int n,q;
scanf("%d%d",&n,&q);
int x,y,z;
mme(vis,0);
mme(ans,0);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
vis[x][y][z]++;
}

for(int i=0;i<=10;i++)
{
for(int j=0;j<=10;j++)
{
for(int k=0;k<=10;k++)
{
for(int x=0;x<=10;x++)
{
for(int y=0;y<=10;y++)
{
for(int z=0;z<=10;z++)
{
int dis = abs(i-x)+abs(j-y)+abs(k-z);

if(i==x && j == y && k == z) {
if(vis[x][y][z]>=1)
ans[dis] = ans[dis]+ ( ( vis[x][y][z] * ( vis[x][y][z] - 1 ) ) / 2 );

}
else if(vis[x][y][z]*vis[i][j][k]>0)
{
ans[dis]+=vis[i][j][k]*vis[x][y][z];
}
}
}
}
}
}
}

int r;

for(int i=1;i<31;i++) ans[i]=ans[i-1]+ans[i]/2;
while(q--){
scanf("%d",&r);
if(r>30)
cout<<ans[30]<<endl;
else
cout<<ans[r]<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm dp