|
常用鏈接
留言簿(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--;
}
}
|
|