Saturday, 21 March 2009

POJ ( acm.pku.edu.cn ) 1008

之前做的时候忘掉了一个月份,那个冤啊。



#include <stdio.h>
#include <string.h>
char const Haab[19][10]={"pop","no","zip","zotz","tzec","xul","yoxkin","mol",
"chen","yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};
char const Tzol[20][10]={"ahau","imix","ik","akbal","kan","chicchan","cimi",
"manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab"
,"canac"};
int main(){
int n,day,mon,year; char s_mon[16];
for(scanf("%d",&n),printf("%d\n",n);n;--n){
scanf("%d. %s%d",&day,s_mon,&year);
for(mon=0;strcmp(Haab[mon],s_mon)&&mon<19;++mon);
day+=year*365+mon*20;
printf("%d %s %d\n",day%13+1,Tzol[(day+1)%20],day/260);
}
return 0;
}

POJ ( acm.pku.edu.cn ) 1007

这道题也有点诡异,G++ 的 STL 中的 stable_sort 似乎不能正常工作。
另外,计算逆序其实可以以 nlogn 的时间复杂度完成;拷贝构造函数如果使用引用计数之类的方式可以提高效率——所以优化的空间还很大。



#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;

class DNA {
public:
char str[51];
int inv;
DNA(char const* s=""){strcpy(str,s); inv=ninv(); }
DNA(DNA const& d){strcpy(str,d.str); inv=d.inv;}
int ninv(){
int n=0;
for(char const* i=str;*i;++i)
for(char const*j=i;*j;++j)
if(*i>*j)
++n;
return n;
}
bool operator<(DNA const& b) const {
return this->inv<b.inv;
}
};

int main()
{
int N,M; char temp[51];
vector<DNA> dnas;
for(cin>>N>>M;M;--M){
cin>>temp;
dnas.push_back(DNA(temp));
}
std::stable_sort(dnas.begin(), dnas.end());
for(vector<DNA>::const_iterator i=dnas.begin();i!=dnas.end();++i){
cout<<i->str<<endl;
}
return 0;
}



POJ ( acm.pku.edu.cn ) 1006

早年做的


#include<iostream>
using namespace std;
const int rp=23,re=28,ri=33;
int nexttime(int p,int e,int i,int d)
{
int x=1;
while(x<=21252)
{
if( (x+d-p)%rp || (x+d-e)%re || (x+d-i)%ri ) x++;
else return x;
}
return x;
}
int main()
{
int p,e,i,d,n=0;
while(cin>>p>>e>>i>>d)
{
n++;
if(p==-1&&e==-1&&i==-1&&d==-1)break;
cout<<"Case "<<n<<": the next triple peak occurs in "<<nexttime(p,e,i,d)<<" days."<<endl;
}
return 0;
}

POJ ( acm.pku.edu.cn ) 1005





#include <iostream>
#include <math.h>
using namespace std;
typedef unsigned int uint;

uint f(float x,float y){
float area=(x*x+y*y)/2.*3.141592652589793238;
return ceil(area/50.);
}

int main()
{
int N;cin>>N;
for(int i=1;i<=N;++i) {
float x,y; cin>>x>>y;
cout<<"Property "<<i<<": This property will begin eroding in year "
<<f(x,y)<<".\n";
}
cout<<"END OF OUTPUT.";
return 0;
}

POJ ( acm.pku.edu.cn ) 1004





#include <iostream>
using namespace std;
int main(){
float a,s=0;
for(;cin>>a;s+=a);
printf("$%.2f\n",s/12.);
return 0;
}

POJ ( acm.pku.edu.cn ) 1003

这道题是早年做的,那时还不知道能输入一条然后立即输出一条。



#include<iostream>
#include<vector>
using namespace std;
inline int f(float x)
{
int i=2;
if(x<=0.5) return 1;
else
{
float p=0;
while(p<x)
{
p+=(float)1/i;
i++;
}
}
return i-2;
}
int main()
{
int i,n,a=0;
float c;
vector<float> l;
while(1)
{
cin>>c;
if(c<0.01)break;
l.push_back(c);
a++;
}
for(i=0;i<a;i++)
cout<<f(l[i])<<" card(s)\n";
return 0;
}

POJ ( acm.pku.edu.cn ) 1002

需要说的是,这道题很诡异,用G++编译会超时,得用万恶的C++



#include <iostream>
#include <map>
#include <iomanip>
using namespace std;

int main()
{
typedef unsigned int uint;
int N; char s[128]; uint t;
map<uint,uint> m;
for(cin>>N;N;--N){
cin>>s; t=0;
for(char* i=s;*i;++i){
if(*i<='9'&&*i>='0') {
t*=10; t+=*i-'0';
} else if (*i<='Z'&&*i>='A') {
t*=10; t+="22233344455566677778889999"[*i-'A']-'0';
} else continue;
}
++m[t];
}
int n=0;
for(map<uint,uint>::const_iterator i=m.begin();i!=m.end();++i){
if (i->second>1) {
cout<<setfill('0')<<setw(3)<<i->first/10000
<<"-"<<setfill('0')<<setw(4)<<i->first%10000
<<" "<<i->second<<endl;
++n;
}
}
if (n==0)
cout<<"No duplicates."<<endl;
return 0;
}

POJ ( acm.pku.edu.cn ) 1001





#include<stdio.h>
#include<string.h>
#define MAX 1024
void power(int *a, int base, int n)
{
int i,j,r=0;
memset(a, 0, sizeof(int)*MAX);
for(i=0,j=base;j&&i<MAX;++i,j/=10)
a[i]=j%10;
for(i=0; i<n-1; ++i){
j=0;
for (j=0; j<MAX; j++){
r+=a[j]*base;
a[j]=r%10;
r/=10;
}
}
}

int main() {
char s[MAX];
int a[MAX];
int n, i, base, len, k;
while(scanf("%s%d",&s,&n)!=EOF){
base = 0;
len = strlen(s);
for (i=0; i<len; i++){
if (s[i]=='.'){
k = 6-(i+1); //小数位数
continue;
}
base*=10;base+=s[i]-'0';
}
for (i=5; s[i]=='0'; --i,--k)
base/=10;
k = k*n;
power(a, base, n);
for (i=MAX-1; i>=0; --i)
if(a[i])
break;
if (k>i){
printf(".");
for (i=k-1; i>=0; --i)
printf("%d", a[i]);
}else{
for (;i>=k;--i)
printf("%d", a[i]);
if (k!=0)
printf(".");
for (;i>=0;i--)
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}

POJ ( acm.pku.edu.cn ) 1000





#include <iostream>
using namespace std;
int main(){for(int a,b;cin>>a>>b;cout<<a+b<<endl);return 0;}

HOJ ( acm.hdu.edu.cn ) 2503





#include <iostream>
using namespace std;int gcd(int a,int b){int c;if(a<b){c=a;a=b;b=c;}while(1){c=a%b;if(c==0)return b;a=b;b=c;}}int main(){int N;for (cin>>N;N--;){int a,b,c,d,x,y,n;cin>>a>>b>>c>>d;x=a*d+b*c,y=b*d;n=gcd(x,y);cout<<x/n<<" "<<y/n<<endl;}return 0;}