//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;
}
/* 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;
}
/*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输出的第......
/*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&&......
/*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;
}
/*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,&......
/*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]......
/*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;
&......
/*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;......
/*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开始,是因为走得......