|
常用链接
留言簿(4)
随笔分类
随笔档案
搜索
最新评论
阅读排行榜
评论排行榜
Powered by: 博客园
模板提供:沪江博客
|
|
|
|
|
发新文章 |
|
|
为什么是runtime error? 网上也找不到相关的代码。。。 郁闷 高手看了回复下哈
#include <iostream> #include <vector> #include <string> #include <math.h> #include <iomanip> #include <stdlib.h> #include <algorithm> using namespace std;
int pround(float f) { float eps=0.49; int i=(int)f; if((f-(float)i)<eps) return i; else return i+1; }
int main() { float sumall=0,fat=0; int i=0,percent=0;float sum=0; char input[1000][1000];bool end=false; while (1) { int temp,len; scanf("%s",input[i]); if (strcmp(input[i],"-")==0&&end==true) break; end=false; if (strcmp(input[i],"-")==0) { float per=fat*100/sumall; printf("%d",pround(per)); printf("%%\n"); sumall=0;fat=0; end=true; continue; } len=strlen(input[i]); sscanf(input[i],"%d",&temp); if (input[i][len-1]=='c') { sum+=temp; if (i%5==0) { fat+=temp; } } else if (input[i][len-1]=='g') { if (i%5==0) { sum+=temp*9; fat+=temp*9; } else if (i%5==4) { sum+=temp*7; } else { sum+=temp*4; } } else if (input[i][len-1]=='%') { if (temp>100) break; percent+=temp; } if (i%5==4) { if (percent!=0) { sum=sum*100/(float)(100-percent); len=strlen(input[i-4]); if(input[i-4][len-1]=='%') { sscanf(input[i-4],"%d",&temp); fat+=temp*sum/100.0; } } sumall+=sum; sum=0;percent=0; } i++; } }
自己想了很复杂,还考虑了追击再追击的问题,结果做到最后还给了个WA。。faint 查了资料,换个角度想问题居然那么简单。。。。 事实上,只要问自己一个问题就能解决这道题,Charley是和哪一位同时到达?
没错,答案是和最早到达的那个人一起到达的(当然,出发时间<0的不算了)。也就是把问题转化为求出每个人到达的时间即可。
#include<stdio.h> #define N 100 int main() { int arr_time,last; int num; int ii,jj,kk; int speed; float tmp; for(;scanf("%d",&num);) { if(!num) return 1; for(ii=0,last=10000;ii<num;ii++) { scanf("%d%d",&speed,&kk); if(kk>=0) { tmp=3600*4.5/speed+kk; /**//*printf("tmp:%f %d",tmp,(int)tmp);*/ if(tmp-(int)tmp<.001) arr_time=(int )tmp; else arr_time=1+(int )tmp; last= ( arr_time<last)?arr_time:last; /**//* printf("last%d",last);*/ } } printf("%d\n",last); } }
STL的排序应用
#include <stdio.h> #include <algorithm>
using namespace std;
int main(){ long m,n,k,i; long a[1024]; scanf("%ld",&m); while (m--) { scanf("%ld%ld",&n,&k); for (i=0;i<n;i++) scanf("%ld",&a[i]); for (i=1;i<=k;i++) if (!(next_permutation(a,a+n))) sort(a,a+n); for (i=0;i<n;i++) printf("%ld ",a[i]); printf("\n"); }; return 0; };
自己写的递归,几经修改终于AC 判断重复的语句很关键原来我的判断是如果之前的值与现在的一样且用过,则跳过,进行下一次循环 但这样会使之后的循环也跳过,导致不必要的查询,从而导致了超时。。 优化后是判断之后的值是否与现在的一样,如果没用过就把之后的值赋值给输出,这样就没问题了
#include <iostream> #include <vector> #include <string> #include <math.h> #include <iomanip> #include <stdlib.h> using namespace std;
char input[200],output[200]; int used[200]; int group=0; int cmp(const void* a,const void* b) { return *(char*)a-*(char*)b; }
void orderfun(int current,int length) //current代表当前打印第几个 { for (int i=0;i<length;i++) { if (i<length-1&&input[i]==input[i+1]&&used[i+1]==0) //重复则运行下一个,判断下一个是否用过很关键,若判断上一个则超时了。。。会走很多弯路 continue; if (used[i]==0) { output[current]=input[i]; used[i]=1; if (current==length-1) //打印一种排列 { printf("%s\n",output); } else orderfun(current+1,length); used[i]=0; } } } int main() { cin>>input; int len=strlen(input); qsort(input,len,sizeof(input[0]),cmp); memset(used,0,sizeof(used)); orderfun(0,len); }
这里还有一个用STL的方法做的很简单(STL类库太强大了。。。)
#include <iostream> #include <string> #include <algorithm> using namespace std;
int main() { string str; while(cin>>str) { sort(&str[0],&str[0]+str.length());//先排序 cout<<str<<endl;//输出排序后的 while(next_permutation(&str[0],&str[0]+str.length())) { cout<<str<<endl; } } return 0; }
下面有关next_permutation的介绍 #include <iostream> #include <algorithm> using namespace std;
int main() { int a[10]={1,2,2,3,3,3,4,5,6,7}; int cnt=0; do{ cnt++; }while(next_permutation(a,a+10)); printf("%d\n",cnt);//输出302400 scanf("pause"); }
next_permutation的返回值如下:如果变换后序列是非减序的则返回0,否则返回1。 所以如果想用do{...}while(next_permutation(...));的方式生成一个集合的全排列,必须先做sort。 即 便做了sort,从上面的例子我们也可以看出,当集合存在重复元素时,循环的次数并不是10!=3628800,302400是什么呢,恰是10!/ (2!*3!),也就是这个多重集的全排列数。可见在处理有重复元素的"集合"时,它是正确的且高效的,只要记住一定要先sort
很典型的动态规划题 很好的算法: f(m, n) = f(m-n, n) + f(m, n-1) f(m, n): 把m个苹果放到n个盘子中的方法数 f(m, n-1): 把m个苹果放到n-1个盘子中的方法数(其中至少有一个空盘子) f(m-n, n): 把m个苹果放到n个盘子中,而且每个盘子中都有苹果(先拿n个出来,等m-n个放好了,然后每个盘子放一个) 一定要牢记!!!
#include <iostream> #include <vector> #include <string> #include <math.h> #include <iomanip> #include <stdlib.h> using namespace std;
int PlaceApple(int m, int n) { if(m < 0) return 0; if(m == 0) //每个盘子一个 return 1; if(n == 1) //只有一个盘子 return 1; return PlaceApple(m - n, n) + PlaceApple(m, n - 1); }
int main() { int num,m,n; cin>>num; while (num>0) { cin>>m>>n; cout<<PlaceApple(m,n)<<endl; num--; } }
纯水题。。。。
#include <iostream> #include <vector> #include <string> #include <math.h> #include <iomanip> #include <stdlib.h> using namespace std;
int main() { long a,b,c,d; int n; cin>>n; while (n>0) { scanf("%ld%ld%ld%ld",&a,&b,&c,&d); printf("%ld %ld %ld %ld ",a,b,c,d); if (a+d==b+c) { printf("%ld\n",d+b-a); } else { printf("%ld\n",d*b/a); } n--; } }
|
|