最近這兩場好無奈啊。。。
今天這場最後30分鐘敲1001,壓力倍增,雖然思路比較明確,但是代碼打起來不怎麼容易。
但是還是好在25分鐘左右debug結束。提交wa,再提交,依然WA.......最後5分鐘,還是沒有AC掉。
一開始以爲是精度問題,後來才sb的發現原來數組開小了。
在壓力環境下保證代碼的效率和質量真不是一件容易的事情。不過數組開小了,真是不可原諒。
1001:Map
題目相當於幾條鏈表。把鏈表排成幾行。
然後枚舉每一列的狀態會被操作多少次。
然後把和累加起來,然後直接除以狀態總數。
#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include <map>
using namespace std;
#define LL long long
#define lcm(a,b) (a*b/gcd(a,b))
int su[1010][1100];
int a[10100];
int have[1010];
int pre[10100];
int next[11000];
vector<int>vec;
int maxlen;
int pan(int p,int t)
{
int n=vec.size();
for(int i=0;i<n;i++)
{
if(t&(1<<i))
{
if(su[i][p]==0)return 0;
}
}
return 1;
}
double use(int p,int t)
{
int n=vec.size();
int s,x,y;
x=have[p];
y=0;
s=0;
for(int i=0;i<n;i++)
{
if(t&(1<<i))
{
y++;
s+=a[su[i][p]];
}
}
if(y>1)
{
return 1.0*y*s/x+s;
}
else return s;
}
void dos()
{
int n=vec.size();
int t=1<<n;
t--;
double ans=0;
double pp=1.0;
for(int i=0;i<n;i++)
{
pp*=1.0*(su[i][0]+1);
}
pp--;
for(int i=1;i<=maxlen;i++)
{
for(int j=1;j<=t;j++)
{
if(pan(i,j)==0)continue;
double sum=use(i,j);
double ch=1.0;
for(int k=0;k<n;k++)
{
if(j&(1<<k))
{
ch*=1.0*(su[k][0]-i+1);
}
else
{
ch*=1.0*min((su[k][0]+1),i);
}
}
ans+=sum*ch;
}
}
printf("%.3f\n",ans/pp);
}
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
memset(have,0,sizeof(have));
memset(pre,0,sizeof(pre));
memset(next,-1,sizeof(next));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int u,v;
while(m--)
{
scanf("%d%d",&u,&v);
u++;
v++;
pre[v]=u;
next[u]=v;
}
vec.clear();
for(int i=1;i<=n;i++)
{
if(pre[i]==0)vec.push_back(i);
}
memset(su,0,sizeof(su));
maxlen=0;
for(int i=0;i<vec.size();i++)
{
int k=1;
for(int j=vec[i];j!=-1;j=next[j])
{
su[i][k]=j;
have[k]++;
k++;
}
su[i][0]=k-1;
maxlen=max(maxlen,k-1);
}
dos();
}
return 0;
}
1003:Room and Moor
從前往後掃,如果不滿足不下降,就把後面的合併到前面去,如果還不滿足,繼續合併。
最後算出結果即可。
#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define eps 1e-9
#define zero(x) (fabs(x)<eps?0:x)
#define maxn 110000
struct list
{
int x;
int y;
double f;
int pre;
}p[maxn];
int a[maxn];
double su(int x,int y)
{
return (1.0*x)/(1.0*x+1.0*y);
}
void dos(int n)
{
p[0].f=0.0;
p[0].pre=-1;
p[0].x=0;
p[0].y=0;
for(int i=1;i<=n;i++)
{
p[i].f=su(p[i].x,p[i].y);
// cout<<i<<" "<<p[i].x<<" "<<p[i].y<<" "<<p[i].f<<endl;
if(zero(p[i].f-p[i-1].f)>=0)
{
p[i].pre=i-1;
continue;
}
for(int j=i-1;j!=-1;j=p[j].pre)
{
p[i].x+=p[j].x;
p[i].y+=p[j].y;
p[i].pre=p[j].pre;
p[i].f=su(p[i].x,p[i].y);
if(zero(p[i].f-p[p[i].pre].f)>=0)break;
}
}
double sum=0.0;
for(int i=n;i!=-1;i=p[i].pre)
{
double ps=0;
double f=p[i].f;
ps+=f*f*1.0*p[i].y;
f=1.0-f;
ps+=f*f*1.0*p[i].x;
sum+=ps;
}
printf("%.6f\n",sum);
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int ls=0;
int leap=1;
for(int i=1;i<=n;i++)
{
if(ls==0)
{
if(a[i]==0)continue;
else
{
ls++;
p[ls].x=1;
p[ls].y=0;
continue;
}
}
if(leap==a[i])
{
if(leap==0)p[ls].y++;
else p[ls].x++;
}
else
{
leap=leap^1;
if(leap==1)
{
ls++;
p[ls].x=0;
p[ls].y=0;
}
i--;
}
// cout<<ls<<" "<<p[ls].x<<" "<<p[ls].y<<endl;
}
if(p[ls].y==0)ls--;
// cout<<"__"<<ls<<endl;
if(ls==0)
{
printf("%.6f\n",1.0*ls);
continue;
}
dos(ls);
}
return 0;
}
1005:Apple Tree
很明顯可以發現,我們交叉放蘋果和肥料是最優的,一共兩種放法。
直接模擬一下就好。
1007:Series 1
脫脫的最後的係數是一個楊輝三角。然後+,-交替。
不過是大數sad,要用到java。。。
悲傷
import java.util.Scanner;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigInteger[] bit = new BigInteger[3300];
BigInteger ans,temp,sn;
int i,cas,n,j,k;
cas = cin.nextInt();
for(i = 1;i <= cas;i ++)
{
ans = BigInteger.ZERO;
temp = BigInteger.ONE;
n = cin.nextInt();
sn = BigInteger.valueOf(n-1);
for(j = 1;j <= n;j ++)
bit[j] = cin.nextBigInteger();
for(j = 0;j < n;j ++)
{
if(j%2 == 0)
ans = ans.add(temp.multiply(bit[n-j]));
else
ans = ans.subtract(temp.multiply(bit[n-j]));
temp = temp.multiply(sn).divide(BigInteger.valueOf(j+1));
sn = sn.subtract(BigInteger.ONE);
}
System.out.println(ans);
}
}
}
1010:Fighting the Landlords
這個題目就不吐槽了。。。
很明顯一開始看錯題了。。。
就是一個水的模擬題,不用理會。。。。