摘要: 题意:有n个数,从中取连续的一段,使其和为n的倍数。 3370求的是部分和为c的倍数(c<=n)。分析:设前k个数的和 S(k)=a1+a2+...+ak,若S(k)为n的倍数,输出前k个数即可。否则 n 个 S(k) 除以 n 的余数只能有1,2,3...n-1,这(n-1)种情况,由鸽笼原理知,必有两个不同的和S(i)和S(j) (i<j)除以n的余数相同 ,故部分和S(j)-S(i) = ai+1+...+aj是n的倍数。poj 2356const int M = 10005;int n, s;int a[M], b[M];int main(){ #ifndef ONLINE 阅读全文
posted @ 2013-05-23 20:49 心向往之 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 题意:n*m矩阵,从某一点起,向上下左右四个方向走,只能走到比自身值小的格子上,问最长路径的长度。分析:从小到大考虑每一个格子,dp[i][j]=max(dp[i-1][j], dp[i+1][j], dp[i][j+1], dp[i][j-1]) + 1, 其中 a[i][j]>a[x][y]。int dx[] = {-1,0,1,0};//up Right down Leftint dy[] = {0,1,0,-1};const int M = 105;int a[M][M], d[M][M];int n, m, ans;struct node{ int x,y;}nd[M*M];i 阅读全文
posted @ 2013-05-23 20:08 心向往之 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 题意:n种物品,第i种价值num[i],数量cnt[i],要将其尽量平分成两份,问这两份的价值各是多少?分析:多重背包的题,用母函数做的。输入数据以负数结束,但我看到样例最后一行是-1,就以为是以-1结束,TLE了半天。。。const int N = 50, M = 250000;int a[2][M+1], p, q, n, sum;int num[N+1], cnt[N+1];//值和个数int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); //freopen("out. 阅读全文
posted @ 2013-05-23 10:55 心向往之 阅读(144) 评论(0) 推荐(0) 编辑