登录 | 注册

帅到惊动了党的BLOG

春天, 我把时间埋在地里, 秋天, 我就会有很多时间啦~ ­ 前面的路很坎坷, 但毕竟是条路。 也许走过去, 就是梦想中的地方。 因此, 坚持, 成为此刻唯一能做且必须去做的事情…

个人信息栏

帅到惊动了党
23974
.....
影币:238
居住地:广州
性别:男
星座: 金牛座

快速通道

日志分类

日历

日志摘要列表

发布于:2008-10-05 19:23:31 | 分类:我的日志

 //uva.acm.10019 将十进制转换成2进制,十进制转换成16进制,再转换成2进制

#include<iostream>
using namespace std;
const int N=10;
int a[N+1];
int d2b(int n)
{
  int s=0;
  while(n)
  {
    if(n%2==1) s++;
    n/=2;
  }
  return s;
}
int h2b(int n)
{
 int s=0,i=0;
 while(n)
 { a[i]=n%10;n/=10; i++; }
 for(int j=i-1;j>=0;j--) s=(s+a[j])*16;
 int sum=0;
   while(s)
   {
    if(s%2==1)  sum++;
     s/=2;
   }
   return sum;
}
int main()
{
 int t,n;
 scanf("%d",&t);
 while(t--)
 {
  scanf("%d",&n);
  printf("%d %d\n",d2b(n),h2b(n));
 }
 return 0;
}

发布于:2008-09-15 18:47:41 | 分类:我的日志

/*  problem 3n+1     

http://acm.uva.es/p/v1/100.html
虽然时间有5s,但是如果用循环的话,将会超时,因为数字有100 0000,
故当3*n+1没有几步就超出了int型范围,因此要用long long 型,
输入scanf("%lld",&n);
*/
#include<iostream>
using namespace std;
int t=0;
int fun(long long x)
{ t++;
 if(x==1) return t;
     if(x%2!=0) return fun(3*x+1);
   else return fun(x/2);
}
int main()
{
 int n,m,q,s;long long a,b,i;
 while(scanf("%lld%lld",&n,&m)!=EOF)
 {
     a=n;b=m;s=0;
     if(a>b) swap(a,b);
    for(i=a;i<=b;i++)
    {  t=0;
     q=fun(i);
     if(q>s)s=q;
    }
    printf("%lld %lld %d\n",n,m,s);
 }
 return 0;
}

发布于:2008-09-11 17:49:18 | 分类:我的日志

/*Inversion  

 2008-09-08 22:49:35 Accepted 1201 C++ 00:00.00 836K 天将降大任于我     

 当P序列转换为I序列时, i前有多少个比其大的数,则下标为i的位置填该数,即得到以I开头的序列。以I开头的序列转换成P开头的序列则是,位置为i的数表示的是:在P序列中,数字i前面有多少个比它大的数,即得到P序列
当输入为cin时,chaar字符型数据可以用比较形式if(c=='I'),不需要用strcmp()函数
*/
#include<iostream>
using namespace std;
const int N=50;
int p[N+1],I[N+1],s[N+1];
int main()
{
 int n,i,j,num;char  c;
 while(cin>>n&&n)
 {  memset(s,0,sizeof(s));
    memset(p,0,sizeof(p));
   cin>>c;
  for(i=0;i<n;i++)
  cin>>p[i];
  if(c=='P')
  {
   for(i=0;i<n;i++)        //检查前面是否有比它大的数,有多少个就加到多少个,num
   {   num=0;
    for(j=0;j<=i-1;j++)
     if(p[j]>p[i]) num++;
     s[p[i]]=num;        //然后将这个数作为下标存储num,作为I输出的第......

发布于:2008-09-11 16:29:26 | 分类:我的日志
/*Red and Black  广度优先搜索   简单题
2008-09-11 16:17:15 Accepted 2165 C++ 00:00.05 848K 天将降大任于我
先把w,h周围的行和列,即将w+1列,h+1行,0行,0列都置为'#',,不能过去,然后输入的存放在i=1~h,j=1~w中。
这样无须考虑边界的情况,               char,string类型的数据不要用scanf(),printf()输入输出,否则很麻烦
*/
#include<iostream>
using namespace std;
int d[4][2]={0,1,1,0,0,-1,-1,0},temp;    //定义为前后左右相邻的4点
const int N=20;
char a[N+1][N+1];bool b[N+1][N+1];  //b[][]用来标记该点是否走过了
int fun(int x,int y)
{  
 for(int i=0;i<=3;i++)
 {
  if(a[x+d[i][0]][y+d[i][1]]=='.'&&b[x+d[i][0]][y+d[i][1]]==0)
  {
   b[x+d[i][0]][y+d[i][1]]=1;
             temp++;
    fun(x+d[i][0],y+d[i][1]);
  }
 }
 return temp;
}
int main()
{
 int w,h,i,j,x,y;
 while(cin>>w>>h&&(w&&......
发布于:2008-09-11 15:27:38 | 分类:我的日志
/*Accurately Say "CocaCola"!    简单题
2008-09-11 15:19:20 Accepted 2965 C++ 00:00.00 2988K 天将降大任于我
碰到7或者7的倍数的同学必须说"CocaCola",第一个是7,第4到第10个都是从70开始,第11个从270开始,
因为270~280,共有11个,后面的都是从700开始,一直到99个
*/
#include<iostream>
using namespace std;
const int N=100;
int a[N+1];
int main()
{
 int t,n,i;
 a[1]=7;a[2]=27;
 for(i=3;i<=10;i++) a[i]=70;
 a[11]=270;
 for(i=12;i<=99;i++) a[i]=700;
 scanf("%d",&t);
 for( i=1;i<=t;i++)
 { scanf("%d",&n);
     printf("%d\n",a[n]);
 }
 return 0;
}
发布于:2008-09-08 20:13:50 | 分类:我的日志

/*Build The Electric System   查找最短路径 
2008-09-08 19:59:18 Accepted 2966 C++ 00:00.10 2304K 天将降大任于我
先按照权值从小到大排序,将最小的权值的那边的两个端点标记为-1已经走过,然后寻找两个端点一个端点已经走过,另一个还没有走过的边
把权值加进来(因为已经排序过,故可从最小权值的点开始,将没走过的点拉进来)
There will be at most one line between any two villages,因为每两个最多只有一条边,故无须考虑两端点有多边连接的情况
*/
#include<iostream>
using namespace std;
const int N=125000;
int a[N+1],b[N+1],k[N+1];
int v[501];
void sort1(int e)
{
 int i,j,temp;
 for(i=0;i<e;i++)
  for(j=i+1;j<e;j++)
   if(k[i]>k[j])
   {
    temp=a[i],a[i]=a[j],a[j]=temp;
                temp=b[i],b[i]=b[j],b[j]=temp;
    temp=k[i],k[i]=k[j],k[j]=temp;
   }
  
}
int main()
{

 int n,p,e,i,j;
 scanf("%d",&n);
 while(n--)
 {
  scanf("%d%d",&p,&......

发布于:2008-09-05 22:54:23 | 分类:我的日志
/*To and Fro  字符串处理
2008-09-05 22:46:21 Accepted 2208 C++ 00:00.02 896K 天将降大任于我
第一行从左数去,第二行右边数过来,第三行左边数过去……
  先将字符串处理成从左往右排列的,单行递增处理,双行递减处理即可。
*/
#include<iostream>
#include<string>
using namespace std;
const int N=200;
char a[N+1][N+1];
int main()
{
 int n,i,t,j,r;string s;
 while(cin>>n&&n)
 {
  cin>>s;
        int k=s.length();
        t=k/n;r=0;
  for(i=1;i<=t;i++)
  {
   if(i%2!=0)
    for(j=0;j<n;j++)
                 a[i][j]=s[r++];
   else
    for(j=n-1;j>=0;j--)
     a[i][j]=s[r++];
  }
  for(i=0;i<n;i++)
   for(j=1;j<=t;j++)
    cout<<a[j][i]......
发布于:2008-09-03 21:18:47 | 分类:我的日志

/*FatMouse's Speed    动态规划思想  最长不下降子序列
2008-09-03 20:41:45 Accepted 1108 C++ 00:00.01 1036K 天将降大任于我

花了n多时间来检查错误,结果发现是很低级的,无语~
*/
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
 int w,s,i;
}a[10001];
int b[10001],c[10001];
bool cmp(node x,node y)
{
 return (x.w<y.w||(x.w==y.w&&x.s!=y.s));  //排序,如果两个的w相等,则只要s不等即可
}
int main()
{  int j=0,Max,d=0,x,l,r;
  while(scanf("%d%d",&a[j].w,&a[j].s)!=EOF)
  {   a[j].i=j+1;j++;}
  sort(a,a+j,cmp);
  memset(b,0,sizeof(b));
  memset(c,0,sizeof(c));
  a[j].w=10001,a[j].s=0;   //比较时比最后一个数的w大,比它的s小
  for(int t=j-1;t>=0;t--)    //}最长不下降子序列算法
  {
    Max=0;
 for( r=t+1;r<=j;r++)
  if((a[r].w>a[t].w)&&(a[r].s<a[t].s)&&(b[r]+1>=Max))
  {
   Max=b[r]+1;
  &......

发布于:2008-09-03 19:58:53 | 分类:我的日志
/*The Intervals   二分查找
2008-09-03 19:49:57 Accepted 2029 C++ 00:00.01 848K 天将降大任于我
先对a[]排序,然后用二分查找法查出b[i]在a[]中的位置
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000;
int a[N+1],b[N+1];
bool cmp(int x,int y)
{
 return x<y;
}
int main()
{
 int n,m,k,i,j,mid,t=0;
 while(scanf("%d%d",&n,&m)!=EOF)
 {  
  for(i=0;i<n;i++)  scanf("%d",&a[i]);
  for(i=0;i<m;i++) scanf("%d",&b[i]);
  sort(a,a+n,cmp);
  for(k=0;k<m;k++)
  {
   if(b[k]<a[0]||b[k]>=a[n-1]) {printf("no such interval\n");continue;}  //当b[k]==a[0]时可以,但是当b[k]==a[n-1]时不符合,因为括号为[),不包括右端点
   i=0;j=n-1;
         while(i<j-1)         //循环条件为i<j-1,如为i<j则死循环
   {   mid=(i+j)/2;......
发布于:2008-09-03 10:27:26 | 分类:我的日志
/*106 miles to Chicago         最短路径            邻接表表示
2008-09-03 09:57:35 Accepted 2797 C++ 00:00.11 880K 天将降大任于我
*/
#include<iostream>
using namespace std;
const int N=100;
int s[N+2][N+2];double cost[N+2];bool check[N+2];
int main()
{
   int n,m,x,y,d; int i,j,t,b;double k,Max;
   while(scanf("%d",&n)&&n)
   {  
    scanf("%d",&m);
    memset(check,0,sizeof(check));
    memset(cost,0,sizeof(cost));
    memset(s,0,sizeof(s));
    for(i=0;i<m;i++)
    {
     scanf("%d%d%d",&x,&y,&d);
     s[x][y]=d;s[y][x]=d;
    }
   cost[1]=1.0;Max=0.0;          //cost[]下标从1开始,是因为走得......