自己写的代码,不能保证全部正确
比赛时没想出来怎样写
比赛时没想出来怎样写
二分法求结果
#include
#include
#include
using namespace std;
const int N=200010;
int a[N],b[N],n,m;
int p(int x)
{
int i,num=0;
for(i=1;i<=n;i++)
{
if(a[i]+b[i]>=x)
{
if(x>a[i]) num+=x-a[i];
}
else return 0;
}
if(num<=m) return 1;
return 0;
}
int main()
{
int i,j,l,r,mid;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
l=1;
r=n+m;
while(l<r)
{
mid=(l+r+1)>>1;
// printf("%d %d %d\n",l,mid,r);
if(p(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",r);
return 0;
}
字符串存储,从高位到底位,判断1号操作和2号操作那种省步骤,并且是否超过A、B次。
#include
#include
#include
using namespace std;
char a[30];
int main()
{
int i,x,y,n,b,c;
scanf("%s %d %d",&a,&b,&c);//b++ c--
for(i=0;a[i]!='\0';i++)
{
n=a[i]-'0';
x=9-n;
y=10+n-9;
if(x<y&&b>=x)
{
b-=x;
a[i]='9';
}
else if(y<x&&c>=y)
{
c-=y;
a[i]='9';
}
else if(b)
{
a[i]+=b;
b=0;
}
// printf("%s %d %d\n",a,b,c);
}
printf("%s",a);
return 0;
}
用深搜寻找消耗时间最短的路径。注意特判只有一个地点时,结果是0。
#include
#include
#include
using namespace std;
const int N=1010;
const int MOD=999999999;
int a[N][N],book[N],c[N],d[N],n,num;
void dfs(int x)
{
// printf("*%d\n",x);
if(x==n)
{
num=min(d[x],num);
return;
}
for(int i=2;i<=n;i++)
{
if(a[x][i]==MOD) continue;
if(d[i]<d[x]+a[x][i]+c[x]) continue;
d[i]=d[x]+a[x][i]+c[x];
if(d[i]>=num) continue;
// printf("%d\n",i);
book[i]=1;
dfs(i);
book[i]=0;
}
return;
}
int main()
{
int i,j,m;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);//防控时间
for(i=1;i<=n;i++)
{
d[i]=MOD;
for(j=1;j<=n;j++)
{
a[i][j]=MOD;
}
}
for(i=1;i<=m;i++)
{
int u,v,c1;
scanf("%d %d %d",&u,&v,&c1);
a[u][v]=a[v][u]=c1;
}
num=MOD;
book[1]=1;
for(i=2;i<=n;i++)
{
if(a[1][i]==MOD) continue;
d[i]=min(d[i],a[1][i]);
book[i]=1;
dfs(i);
book[i]=0;
}
if(n==1) num=0;
printf("%d\n",num);
return 0;
}
动态规划,将时间排序,注意判断两个时间的间隔,寻找不超过给定金额的最大值。
#include
#include
#include
using namespace std;
const int N=10010;
struct no
{
int y;
int d;
int v;
}a[N];
bool cmp(no x,no y)
{
if(x.y==y.y) return x.d<y.d;
return x.y<y.y;
}
int b[N],k,m;
int p(int x,int y)
{
if(x>=y) return 0;
// printf("%d %d\n",x,y);
int t=0,flag=1;
int y1=a[x].y;
int d1=a[x].d;
while(flag)
{
d1++;
t++;
if(y1==2&&d1==28) y1++,d1=1;
else if((y1==4||y1==6||y1==9||y1==11)&&d1==30) y1++,d1=1;
else if(d1==31) y1++,d1=1;
if(y1==a[y].y&&d1==a[y].d) flag=0;
if(t>=k) flag=0;
}
// printf("*\n");
// printf("***********%d %d %d\n",x,y,t);
if(t>=k) return 1;
return 0;
}
int s(int x,int y)
{
// if(abs(x-m)<=abs(y-m)) printf("%d %d %d\n",x,y,x);
// printf("%d %d %d\n",x,y,y);
if(x>m) return y;
if(y>m) return x;
if(abs(x-m)<=abs(y-m)) return x;
return y;
}
int main()
{
int i,j,n,num;
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=n;i++)
scanf("%d %d %d",&a[i].y,&a[i].d,&a[i].v);
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++)
b[i]=s(b[i],a[i].v);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(p(i,j))
{
b[j]=s(b[j],b[i]+a[j].v);
}
}
}
// for(i=1;i<=n;i++)
// printf("%d ",b[i]);printf("\n");
for(i=1;i<=n;i++)
num=s(num,b[i]);
printf("%d",num);
return 0;
}
思路简单,但是实现比较复杂的模拟。
#include
#include
#include
using namespace std;
const int N=1000;
double a[N][N];
int book[N];
struct no
{
int x;
double y;
}c[N];
bool cmp(no x,no y)
{
if(x.y!=y.y)return x.y>y.y;
return x.x<y.x;
}
int main()
{
int i,j,k,n,m;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%lf",&a[i][0]);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
scanf("%lf",&a[i][j]);
}
scanf("%d",&k);
for(i=1;i<=k;i++)
{
int num;
scanf("%d",&num);
book[num]=1;
}
// for(i=1;i<=n;i++)
// printf("%lf ",a[i][0]);printf("\n");
for(i=1;i<=n;i++)
{
// printf("%d ",i);
for(j=1;j<=m;j++)
{
if(book[j]) a[i][0]=a[i][0]*a[i][j]*0.01;//printf("%lf ",a[i][j]*0.01);
else a[i][0]=a[i][0]*(100-a[i][j])*0.01;//printf("%lf ",(100-a[i][j])*0.01);;
}
// printf("\n");
}
double num=0;
for(i=1;i<=n;i++)
num+=a[i][0];
for(i=1;i<=n;i++)
{
c[i].x=i;
c[i].y=a[i][0]/num;
c[i].y*=100;
}
sort(c+1,c+n+1,cmp);
for(i=1;i<=n;i++)
printf("%d %.2lf\n",c[i].x,c[i].y);
return 0;
}
最后时间不够,直接用Floyd暴力计算,通过30%数据就够了。
#include
#include
#include
using namespace std;
const int N=15010;
const int MOD=99999999;
int a[N][N],b[N][N],c[N],z[N];
int main()
{
int i,j,k,n,m,x,y,num;
scanf("%d %d",&n,&m);
for(i=1;i<n;i++)
{
scanf("%d %d",&x,&y);
a[x][y]=a[y][x]=1;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j) continue;
b[i][j]=MOD;
}
for(i=1;i<=n;i++)
{
num=0;
for(j=1;j<=n;j++)
if(a[i][j]) num++;
// printf("%d %d\n",i,num);
z[i]=num;
for(j=1;j<=n;j++)
if(a[i][j]) b[i][j]=num;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
if(b[i][j]>b[i][k]+b[k][j])
b[i][j]=b[i][k]+b[k][j];
}
}
}
// for(i=1;i<=n;i++)
// {
// for(j=1;j<=n;j++)
// printf("%d ",b[i][j]);
// printf("\n");
// }
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
num=b[x][y]+z[y];
printf("%d\n",num);
}
return 0;
}
时间不够
时间不够
最后结果是个比较靠后的国二,也算是对得起两年的努力付出。