BC32(hdu5182~5185)

恩……又是一个悲伤的故事,然后BC做出来一题,因为自己傻逼,可能紧张,也可能是其他,反正没看全题目就敲,敲完WA,WA完改,改完WA,没了……
大概五十几分钟WA了五法,然后问了才知道没看全,就这样,后面也没啥悬念,没有做出来的题了,就酱

1001 PM2.5
对于输入的每一行一两个整数作差,按照差值从大到小排序,如果差值一样,按照后面的整数从小到大排序,如果还是一样按照ID从小到大排序。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 struct p{
 7     int a,l,t;
 8 }a[200];
 9
10 bool cmp(p a1,p a2){
11     if(a1.a==a2.a&&a1.t==a2.t) return a1.l<a2.l;
12     if(a1.a==a2.a) return a1.t<a2.t;
13     return a1.a>a2.a;
14 }
15
16 int main(){
17     int n;
18     while(scanf("%d",&n)!=EOF){
19         int q,i;
20         for(q=0;q<n;q++){
21             int b,c;
22             scanf("%d%d",&b,&c);
23             a[q].l=q;a[q].a=b-c;a[q].t=c;
24         }
25         int j,t;
26         sort(a,a+n,cmp);
27         for(i=0;i<n;i++){
28             printf("%d",a[i].l);
29             if(i==n-1)printf("\n");
30             else printf(" ");
31         }
32     }
33     return 0;
34 }

1002 Positive and Negative
维护前缀和sum[i]=a[0]-a[1]+a[2]-a[3]+…+(-1)^i*a[i]
枚举结尾i,然后在hash表中查询是否存在sum[i]-K的值。
如果当前i为奇数,则将sum[i]插入到hash表中。
上面考虑的是从i为偶数为开头的情况。
然后再考虑以奇数开头的情况,按照上述方法再做一次即可。
不同的是这次要维护的前缀和是sum[i]=-(a[0]-a[1]+a[2]-a[3]+…+(-1)^i*a[i])
I为偶数的时候将sum[i]插入到hash表。
总复杂度o(n)

1003 Brackets
当n为奇数的时候答案是0。
先判断字符串的前面是否符合括号匹配,即对于任何前缀左括号个数>=右括号个数。
设左括号个数为a右括号个数为b, m=n/2,问题可以转化为在平面中从座标(a,b)沿网格走到(m,m) 且不跨过x=y这一条直线的方法数。数据太大,普通DP和搜索都不行的。
问题可以进一步转化为从(a-n,b-n)到(0,0)且不跨过x=y的方法数。再对称一下,转化到(0,0)到(n-b,n-a)不跨过x=y的方法数。

对于从(0,0)点走到(p,q)点不跨过x=y的方法数是

  XXXX(复制不过来,BC首页看)


证明如下:
我们可以通过总的数目来减掉非法的数目即可。
把(0,0)和(p,q)都往下移一格,非法数目即为(0,-1)到(p,q-1)且路径中至少有一点和x=y相交的方法数。记(d,d)为从(0,-1)到(p,q-1)路径中最先和x=y相交的点。则由于对称性(-1,0)到(d,d)的方法数和(0,-1)到(d,d)的方法数是相同的。所以(0,-1)到(p,q-1)且与x=y相交的方法数和(-1,0)到(p,q-1)的方法数是相同的。
所以答案是

  XXXXX

然后对100W以内的数字进行一个阶乘处理,就可以O(1)得出答案了。

1004 Equation
这可以看成是一个完全背包问题,但是由于数字比较多直接DP会超时。其实可以发现数字的种类最多是sqrt(n)级别的。那么就可以把复杂度降到nsqrt(n);
Dp[i][j]代表前i个数字放好之后能组成j的和数是多少。
递推方程是Dp[i][j]=dp[i][j-i]+dp[i-1][j-i]; 表示第i种数字放的时候,前面要么放了i,要么放了i-1
边界条件是dp[i][j]=0 for i < j
Dp[0][0]=1;
所以最后总的复杂度是n*sqrt(n)
时间: 2024-08-07 17:00:18

BC32(hdu5182~5185)的相关文章

HDU 5185 Equation (线性dp 完全背包)

Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 64    Accepted Submission(s): 20 Problem Description Gorwin is very interested in equations. Nowadays she gets an equation like this x1+

bc32 1002 预处理 哈希

bc32 1002 预处理 哈希 题意: 给定一个数组(a[0],a[1],a[2],a[n-1])和一个整数K,请来判断一下是否存在二元组(i,j)(0 <= i <= j < n)使得 NP-sum(i,j) 刚好为K.这里NP-sum(i,j)=a[i]-a[i+1]+a[i+2]+...+(-1)^(j-i)a[j]. 限制: 1 <= n <= 1e6; -1e9 <= a[i] <= 1e9; -1e9 <= K <= 1e9 思路: 先从

HDU5182 PM2.5

Problem Description Nowadays we use content of PM2.5 to discribe the quality of air. The lower content of PM2.5 one city have, the better quality of air it have. So we sort the cities according to the content of PM2.5 in asending order. Sometimes one

hdu 5185 动态规划 分析降低复杂度

这题说的是 x[1]+x[2]+x[3]+…+x[n]=n, 这里 0 <= x[i] <= n && 1 <= i <= n x[i] <= x[i+1] <= x[i]+1 && 1 <= i <= n-1 对于一个给定的n,Gorwin想要知道有多少xi的组合满足上述等式.由于结果比较大,输出答案对m取余的结果就行. n<=50000 经过分析我们知道第一个数必须是 0  或者 1 ,如果是0 那么我们分析,第一个

hdu 5185(DP)

不错的一道dp题目,一开始想了一种N*N的dp,后面就一直想怎么优化,然后就一直都在坑中了. 这题题解还是看早了,应该再多想会的,多换种表示状态的方法再想想. dp[i][j]=dp[i-j][j]+dp[i-j][j-1]  表示已经用了i并且最后一位为j的所有情况. dp[0][0]=1 其中i<=50000,j<=320,算算负责度就可以了 #include <iostream> #include <stdio.h> #include <string.h&g

hdu 5185 dp(完全背包)

BC # 32 1004 题意:要求 n 个数和为 n ,而且后一个数等于前一个数或者等于前一个数加 1 ,问有多少种组合. 其实是一道很水的完全背包,但是没有了 dp 的分类我几乎没有往这边细想,又是放在第四题,因此完全没有想出来. 其实并不难,dp [ i ] [ j ] 表示当前放入 i ,总和是 j 的种类数 dp [ i ] [ j ] = dp [ i - 1 ] [ j - i ] + dp [ i ] [ j - i ] :即上一个放的是 i 或 i - 1 : dp [ 0 ]

hdu 5185 Equation(分析+DP)

题意: Gorwin is very interested in equations. Nowadays she gets an equation like thisx1+x2+x3+?+xn=n, and here 0≤xi≤nfor1≤i≤nxi≤xi+1≤xi+1for1≤i≤n−1 For a certain n, Gorwin wants to know how many combinations of xi satisfies above condition.For the answ

HDU 5185 Equation (DP)

题目:LINK 题意:求满足题目要求的x序列的种类数. 能够发现符合条件的序列去重后是一个0, 1, ..., k的连续序列(k满足k*(k+1)/2 <= n) ,则这个去重后的序列长度最长为sqrt(n)规模大小. 能够DP.dp[i][j]表示用到1~i的连续数字当前和为j的方法数.不用考虑长度是否满足n个,由于前面能够用0补上去. dp[i][j] = dp[i][j-i] + dp[i-1][j-i]; ans = sum(dp[i][n]) for i in range(1, k)

hdu 5185(动态规划)

Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 500    Accepted Submission(s): 168 Problem Description Gorwin is very interested in equations. Nowadays she gets an equation like thisx1+