第二次比赛,题目比较简单。做个记录。
比赛链接:http://www.bnuoj.com/bnuoj/contest_show.php?cid=3488
差一道AK,想到可以用深搜做,但是试了一下真的不会递归。就放弃了。
下面说我做出来的题目。
先说一直卡我的一道题吧。
给你一串数,再给你几个加号插入这串数中,求使和最大的方案。 如给你594,再给你一个加号,易得最优方案为5+94=99。
第一行为这一串长数,长度l<=400。 第二行为一个整数k,代表加号的个数,k<=400。
一个数,为最优解。
594 1
99
要使得值最大,那么首先使得其位数最大,其次要求其位数越大的值最大,一个长度为 len 的串,要添加 k 个加号,要使得位数最大为 len-k 位,遍历找到一个最大的,然后加起来即可。题目有一个坑点!
比如说 458673 加 3 个加号,其最大和可得到最大位6 - 3 = 3位,所以遍历找到最大的位 867 ,最大和位 867+4+5=3 = 879
坑点是输入的串有前道0,更坑的是全为0
假如 00055 4 输出为 10
输入 0000 2 输出为 0
错的可以试试这些数据。
#include <cstdio> #include <string> #include <iostream> #include <algorithm> using namespace std; string sum(string s1,string s2) { if(s1.length()<s2.length()) { string temp=s1; s1=s2; s2=temp; } int i,j; for(i=s1.length()-1,j=s2.length()-1; i>=0; i--,j--) { s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 if(s1[i]-'0'>=10) { s1[i]=char((s1[i]-'0')%10+'0'); if(i) s1[i-1]++; else s1='1'+s1; } } return s1; } int main() { string s; int k; while(cin>>s>>k) { if(s.size()<=k ) { continue; } int len=s.size()-k; string tmp="",max=""; for(int i=0; i<len; i++) { tmp+=s[i]; } max=tmp; int ans=len-1; for(int i=len; i<s.size(); i++) { tmp.erase(0,1); tmp+=s[i]; //cout<<tmp<<endl; if(tmp>max) { max=tmp; ans=i; } } int pp=0; for(int i=0; i<=ans-len; i++) { pp+=(s[i]-'0'); } for(int i=ans+1; i<s.size(); i++) pp+=(s[i]-'0'); string max1=""; while(pp) { max1+=(pp%10+'0'); pp/=10; } int ok=0; while(max[0]=='0'){ max.erase(0,1); ok=1; } if(ok&&max.size()==0) //zheer cout<<"0"<<endl; if(max1.size()==0) cout<<max<<endl; else { reverse(max1.begin(),max1.end()); //cout<<max1<<endl; cout<<sum(max,max1)<<endl; } } return 0; }
现在要求你编写程序把实现阿拉伯数字到罗马数字的转换.
输入文件包含多组测试数据,每组测试数据一行,给出一个阿拉伯数字表示下的正整数,该数不超过3000.
对于每一组测试数据,对应输出一行,为阿拉伯数字表示.
512
DXII
这个题目我是用map容器做的,非常简单!
#include <cstdio> #include <map> #include <string> #include <cmath> #include <iostream> using namespace std; map<int,string> v; void isit() { v[1]="I",v[2]="II",v[3]="III",v[4]="IV",v[5]="V",v[6]="VI",v[7]="VII",v[8]="VIII",v[9]="IX"; v[10]="X",v[20]="XX",v[30]="XXX",v[40]="XL",v[50]="L",v[60]="LX",v[70]="LXX",v[80]="LXXX",v[90]="XC"; v[100]="C",v[200]="CC",v[300]="CCC",v[400]="CD",v[500]="D",v[600]="DC",v[700]="DCC",v[800]="DCCC",v[900]="CM"; v[1000]="M",v[2000]="MM",v[3000]="MMM"; } int main() { isit(); int n; while(~scanf("%d",&n)) { int p[10],i; for(i=1;i<10;i++) { p[i]=n%10*pow(10,i-1); n/=10; if(n==0) break; } for(int j=i;j>=1;j--) { cout<<v[p[j]]; } cout<<endl; } return 0; }
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; int main() { int n; while(~scanf("%d",&n)&&n) { getchar(); string s,t; double p; int ans=0; for(int i=0;i<n;i++) { getline(cin,s);t=""; for(int i=s.size()-1;i>=0;i--) { if(s[i]>='0'&&s[i]<='9' || s[i]=='.') t+=s[i]; else break; } //cout<<t<<endl; if(t=="57.1") ans++; } printf("%d\n",ans); } return 0; }
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; int main() { long long a,b; while(~scanf("%lld%lld",&a,&b)) { printf("%lld\n",a+b); } return 0; }
#include <cstdio> int main() { int m,n; while(~scanf("%d%d",&m,&n)) { if(m==0&&n==0) break; char c; int ans=0; getchar(); for(int i=0;i<m;i++) { for(int j=0;j<=n;j++) { scanf("%c",&c); if(c=='*') ans++; } } printf("%d\n",ans); } }
#include <cstdio> #include <string> #include <iostream> using namespace std; int main() { int T; cin>>T; while(T--) { string s,tmp=""; cin>>s; for(int i=0;i<s.size()&&i<3;i++) printf("%c",s[i]); for(int i=3;i<s.size();i++) { if(s[i]=='m' && s[i-1]=='m' &&s[i-2]=='i' &&s[i-3]=='l') { printf("ingming"); } else printf("%c",s[i]); } printf("\n"); } }
#include <cstdio> #include <cmath> struct Node { double x; double y; }; double dist(Node A,Node B,Node C) { if(B.x!=A.x) { double k=(B.y-A.y)/(B.x-A.x); return fabs((C.y-A.y)-k*(C.x-A.x))/sqrt(1+k*k); } else return fabs(C.x-A.x); } int main() { Node A,B,C,D,E; while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y,&D.x,&D.y,&E.x,&E.y)) { double sa=dist(A,B,E); double sb=dist(C,D,E); if(sa>sb) printf("Archimedes\n"); else if(sa==sb) printf("Equal\n"); else printf("uTOPia\n"); } return 0; }