题目大意:Pupu有N层皮,每一层要么是透明,要么是不透明的,每天被太阳晒到的就会变一次,设N层刚出生都不透明,要全部皮都至少变过一次要多少天?(答案MOD N)
解题思路:1)理解题目: 注意注意,题目所求的是每层皮肤至少变一次的天数,不是全部变成透明的天数!... .坑爹的,它里面写的是(that all of a PuPu's skins has been changed from opacity to clarity ) 2)设f[n]为前n层皮肤变成透明所需要的天数,ans[n]为全部皮肤至少变一次的天数。 易得:f[n]=2*f[n-1]; ans[n]=f[n-1]+1; ==>ans[n]=2^(n-1)+1; f[1]=2 (0->1 两天); 3)这里ans的增长率很客观,所以答案要进行取模,便涉及到一个大数取模((logb)^3)的运算。 1、首先将b化为二进制数:即b=(AtAt-1At-2.....A0)2=At*2^t+At-1*2^(t-1).....+A0; 2、a^b % c = a^(At*2^t+At-1*2^(t-1)+.....+A0)%c=((a^(At*2^t))%c*(a^(A(t-1)*2^(t-1)))%c*.......*(a^(A0)%c)) (*....这式子看起来好恶心......*) 3、对于每一个a^(2^(i+1))%c=(a^(2^i)%c)^2%c 这样我们就可以在常数时间内由2^n项推到2^(n+1)项了。 大数取模模版(吉林大学):
1long long mod_exp(long long a,long long b0,long long n) 2{ 3 if( a > n ) a %= n; 4 long long i, d = 1, b[35]; 5 for( i=0; i < 35; ++i ){ 6 b[i] = b0%2; 7 b0 /= 2; 8 if( b0 == 0 ) break; 9 } 10 for( ;i >= 0; --i ){ 11 d = (d*d)%n; 12 if( b[i] == 1 ) d = (d*a)%n; 13 } 14 return d; 15}
代码:
1#include <iostream> 2#include <cstdio> 3#include <cstring> 4#include <cmath> 5 6using namespace std; 7 8int n; 9 10long long mod_exp(long long a,long long b0,long long n) 11{ 12 if( a > n ) a %= n; 13 long long i, d = 1, b[35]; 14 for( i=0; i < 35; ++i ){ 15 b[i] = b0%2; 16 b0 /= 2; 17 if( b0 == 0 ) break; 18 } 19 for( ;i >= 0; --i ){ 20 d = (d*d)%n; 21 if( b[i] == 1 ) d = (d*a)%n; 22 } 23 return d; 24} 25 26int main() 27{ 28 while(~scanf("%d",&n)) 29 { 30 if(n == 0) break; 31 printf("%I64d\n",(mod_exp(2,(n-1),n)+1)%n); 32 } 33 return 0; 34} 35
题目大意:给出一个数字,求不小于它且由4,7两个数字组成,4跟7的出现次数要一样多。 思路:DFS 每次递归累计4,7出现的个数,直到满足题意即可。 注意要long long 代码:
1#include <iostream> 2#include <cstdio> 3#include <cstring> 4#include <string> 5#include <cmath> 6#include <algorithm> 7 8using namespace std; 9 10long long n,res; 11 12void dfs(long long x,int four,int seven) 13{ 14 if(x>1000000000000) 15 return; 16 if(x>=n&&four==seven) 17 { 18 if(res==0||res>x) 19 res=x; 20 } 21 dfs(x*10+4,four+1,seven); 22 dfs(x*10+7,four,seven+1); 23} 24 25int main() 26{ 27 while(~scanf("%I64d",&n)) 28 { 29 res=0; 30 dfs(4,1,0); 31 dfs(7,0,1); 32 printf("%I64d\n",res); 33 } 34 return 0; 35} 36
题目大意:给出一个矩阵由.,*组成,求里面一个最小的子矩阵能够包含所有* 解题思路:找出最靠近左上方的*和最靠近右下方的*号,截出那个矩阵就可以了。 ~~o(∩_∩)o ~不为切题而切题~~,是为纪念第一道CF题和第一次使用STL而写!!! 代码:
1#include <iostream> 2#include <cstdio> 3#include <cstring> 4#include <string> 5 6using namespace std; 7 8string s[60]; 9int i,j,maxx,maxy,minx,miny,n,m; 10 11int main() 12{ 13 while (~scanf("%d%d",&n,&m)) 14 { 15 minx=1<<30; 16 miny=1<<30; 17 maxx=-(1<<30); 18 maxy=-(1<<30); 19 for (i=1; i<=n; i++) 20 { 21 cin >> s[i]; 22 int pos=s[i].find("*"); 23 if (pos!=string::npos) 24 { 25 if (minx>pos) minx=pos; 26 int pos1=0; 27 for (int l=0; l<s[i].size(); l++) 28 if (s[i][l]=='*') pos1=l; 29 if (maxx<pos1) maxx=pos1; 30 if (miny>i) miny=i; 31 if (maxy<i) maxy=i; 32 } 33 } 34 for (i=miny; i<=maxy; i++) 35 { 36 for (j=minx; j<=maxx; j++) 37 printf("%c",s[i][j]); 38 cout << endl; 39 } 40 41 } 42} 43
题目大意:
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标:
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼) 解题思路:1)由题目可以知道,在某个时间点在某点接住馅饼,则前一个时间点必须在这个点的左边,右边或者就在这个点。 2)根据题设,我们不妨设dp[i][j]为在第i秒在j处接住的馅饼。 则有: dp[i][j]=Max{dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]}+a[i][j]; 代码
1#include <iostream> 2#include <cstdio> 3#include <cmath> 4#include <algorithm> 5#include <cstring> 6 7using namespace std; 8 9int a[100010][15]; 10int dp[100010][15]; 11int t,n,p,q,maxx; 12 13int main() 14{ 15 while (~scanf("%d",&n)) 16 { 17 if (n==0) break; 18 t=-(1<<30); 19 memset(a,0,sizeof(a)); 20 memset(dp,0,sizeof(dp)); 21 for (int i=1; i<=n; i++) 22 { 23 cin >> p >> q; 24 a[q][p]++; 25 if (t<q) t=q; 26 } 27 dp[1][5]=a[1][5]; 28 dp[1][6]=a[1][6]; 29 dp[1][4]=a[1][4]; 30 for (int i=1; i<=t-1; i++) 31 { 32 for (int j=0; j<=10; j++) 33 { 34 if (dp[i+1][j+1]<a[i+1][j+1]+dp[i][j] && j<10) 35 dp[i+1][j+1]=dp[i][j]+a[i+1][j+1]; 36 if (dp[i+1][j]<a[i+1][j]+dp[i][j]) 37 dp[i+1][j]=dp[i][j]+a[i+1][j]; 38 if (dp[i+1][j-1]<a[i+1][j-1]+dp[i][j] && j>0) 39 dp[i+1][j-1]=dp[i][j]+a[i+1][j-1]; 40 } 41 } 42 maxx=-(1<<30); 43 for (int i=1; i<=11; i++) 44 if (dp[t][i]>maxx) maxx=dp[t][i]; 45 cout << maxx << endl; 46 } 47 return 0; 48} 49 :
今天是最后一场的个人赛,打完这场比赛,不知道是喜是忧...喜的是不用再自己面对那些该死的英文题,忧的是不知道要怎么去面对接下来的组队问题。也许明天,组了一年的队就要这么拆散了。 接下来的比赛又是一场接一场的艰苦磨合,我完全不知道这里面又会碰到什么样的困难。鸭梨,鸭梨啊~~....几场比赛就可以确定了一切的走向,这是我完全意料不到的,自己发挥不好也是原因,实力不济也是原因。没有什么可以再去抱怨的了。 但回归总总,还是希望自己能够组成一支比较有竞争力的队伍留在国赛选拔的行列之中,给自己多多积累点经验~,才会有进步!! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在此,再次怀念这支队(TC,LXM,WYH)经历过的比赛~,校赛一等,珠海赛二等,省赛三等~,去年的我们没有把精力在这里面投入的太多,所以我相信,就算拆队了还是都有进步空间的~~~Go on~ By wyh~
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
常用链接
留言簿
随笔分类
随笔档案
文章分类
文章档案
搜索
最新评论
阅读排行榜
评论排行榜
|
|