HDU 4927
题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1−ai,直到序列长度为1.输出最后的数。
思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉……对算组合还是不太了解啊。如今对组合算比較什么了……
import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner cin=new Scanner (new BufferedInputStream(System.in)); int t=cin.nextInt(); while(t-->0) { int n=cin.nextInt(); BigInteger ans=BigInteger.ZERO; BigInteger mm=BigInteger.ONE; for(int i=0;i<n;i++) { long x = cin.nextLong(); if(i>0) mm=mm.multiply(BigInteger.valueOf(n-i)).divide(BigInteger.valueOf(i)); if((i&1)>0) ans=ans.subtract(mm.multiply(BigInteger.valueOf(x))); else ans=ans.add(mm.multiply(BigInteger.valueOf(x))); } if((n&1)==0) ans=ans.negate(); System.out.println(ans); } } }
HDU 4925 模拟
一个隔一个的放肥料得到的苹果就是最多的了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define INF 510010 #define maxn 400010 using namespace std; typedef long long ll; typedef unsigned long long ull; int a[101][102]; int main() { int t; cin>>t; while(t--) { int n,m,i,j; scanf("%d%d",&n,&m); for(i=0; i<n; i++) fill(a[i],a[i]+m,1); i=0; while(i<n) { for(j=0; j<m; j++) { if((i&1)&&(j&1)==0) a[i][j]=0; if((i&1)==0&&(j&1)) a[i][j]=0; } i++; } for(i=0; i<n; i++) for(j=0; j<m; j++) { if(!a[i][j]) { if(i-1>=0&&a[i-1][j]) a[i-1][j]*=2; if(i+1>=0&&a[i+1][j]) a[i+1][j]*=2; if(j-1>=0&&a[i][j-1]) a[i][j-1]*=2; if(j+1>=0&&a[i][j+1]) a[i][j+1]*=2; } } int sum=0; for(i=0;i<n;i++) for(j=0;j<m;j++) if(a[i][j]) sum+=a[i][j]; printf("%d ",sum); } return 0; }