上一页 1 2 3 4 5 6 7 8 9 ··· 26 下一页
摘要: 这个题目看似不是很好下手,不过很容易发现每次询问的时候总是会问到第r个盒子是否有糖果;这样的话就很好办事了;维护两个数组;一个sum数组:累加和;一个in数组:如果i位是1的话,in[i]=in[i-k]+1;否则不加1,很好理解;然后利用in数组可以找到本来应该有糖果的但是没有糖果的箱子的数目;然后结合sum数组就可以的出结果;#include#include#define maxn 100005using namespace std;char s[maxn];int sum[maxn];int in[maxn];int n,w,k;int main(){ scanf("%d%d% 阅读全文
posted @ 2014-02-23 11:00 Yours1103 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 刚刚看到这个题感觉是博弈题;不过有感觉不像,应该是个贪心;于是就想贪心策略;举了一个例子:33 1 2 34 3 4 1 25 4 1 2 5 8如果他们两个每次都拿对自己最有利的那个的话,C的得分是14分;但是C作为第一个选手,他有更好的策略,只拿前一半,后一半给J,中间的再分;这样的话C的得分就能达到15分;同样J也有这样的策略,他也能保证自己最少能拿到后一半的分(跟风式的拿);这样的话,贪心策略就明朗了!#include#include#include#define maxn 105using namespace std;int s[maxn];int c,j;int main(){ . 阅读全文
posted @ 2014-02-22 13:59 Yours1103 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 这个题目的突破口就是固定最短长度,然后以二进制的形式分层;最后把需要的曾连起来;#include#include#define maxn 105using namespace std;bool map[maxn][maxn];void link(int x,int y){ map[x][y]=1; map[y][x]=1;}void pre(){ link(1,3); link(1,4); link(2,100); for(int i=3; i<60; i+=2) { link(i,i+2); link(i,i+3); ... 阅读全文
posted @ 2014-02-22 12:29 Yours1103 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 把前n个碟子从第一个塔移动到第三个塔有两种方法:1.把前n-1个移动到第二个塔,把第n个移动到第三个塔,然后把前n-1个从第二个移动到第三个;2.把前n-1个移动到第三个塔,把第n个移动到第二个塔,然后把前n-1个继续移动到第一个的塔,把第N个移动到第三个塔,最后把前n个移动到第三个塔就行了;状态转移方程:a=dp[i][3-i-j][k-1]+matrix[i][j]+dp[3-i-j][j][k-1];b=dp[i][j][k-1]+matrix[i][3-i-j]+dp[j][i][k-1]+matrix[3-i-j][j]+dp[i][j][k-1];dp[i][j][k]=min(a 阅读全文
posted @ 2014-02-21 13:43 Yours1103 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 我的方式是用暴力的方法找到每一行每一列的边界点;但是有大神直接用一个公式解决了:floor(n*sqrt(2))*4;想了很久还是不理解,求各路大神指点!#include#include#includeusing namespace std;int main(){ long long n; cin>>n; if(n==0){cout1) ans+=pre-cur-1; pre=cur; } ans--; cout<<ans*4;}View Code 阅读全文
posted @ 2014-02-19 23:23 Yours1103 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 详解见:http://blog.csdn.net/tri_integral/article/details/18666797#include#include#define maxn 105#includeusing namespace std;int s[maxn];int main(){ int n; int tmp; while(scanf("%d",&n)!=EOF) { memset(s,0,sizeof s); s[50]=n; bool flag; while(1) { ... 阅读全文
posted @ 2014-02-19 12:42 Yours1103 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 概率dp,有点像背包的做法;dp[i][j]代表前i个数组成的j数的概率为多少#include#include#define maxn 40009using namespace std;double dp[45][maxn];int s;double sco;int main(){ int t,n; scanf("%d",&t); while(t--) { memset(dp,0,sizeof dp); dp[0][0]=1; scanf("%d%lf",&n,&sco); for(int i=0;i=sco) ... 阅读全文
posted @ 2014-02-19 08:27 Yours1103 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 一开始贪心策略想错了!#include#includeusing namespace std;int s[105];int main(){ int n; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&s[i]); } sort(s,s+n); int ans; bool flag; for(int k=1;k<=n;k++) { flag=1; for(int i=0;i<n;i++) if(s[i]<i/k) ... 阅读全文
posted @ 2014-02-18 20:19 Yours1103 阅读(170) 评论(0) 推荐(0) 编辑
摘要: #include#includeusing namespace std;char s[30]="iiiiiiiiiiiiiiiiiiiiii";int n;void solve(int re,int now,bool flag){ if(re==0) { s[now]='\0'; printf("%s\n",s); return; } if(re==1) { s[now]='\0'; printf("%si\n",s); return; } if(flag) { ... 阅读全文
posted @ 2014-02-17 22:46 Yours1103 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 这是一个非常神奇的题;感觉像一个模拟搜索;但是竟然可以用网络流来解决;直接粘题解把: 如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左下角(图外面) ,因此建好图之后求一个最小割就可以得到结果了。但是关键在于:1.哪些雷之间可以相互“跳” ?2.哪些雷可以从右上角“跳”过去,哪些雷可以“跳”到左下角? 第二个问题很好办,如果地雷的范围能接触到最上或者最右的格子,就可以从右上角跳到这个雷上,如果地雷的范围能接触到最下或者最右的格子,就可以跳到左下角。 第一个问题需要分类讨论一下,如果两个雷在同一水平线或者竖直线上,当两个雷的距离不超过 2*K+1 时可以认为两... 阅读全文
posted @ 2013-12-11 22:50 Yours1103 阅读(172) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 26 下一页