10.9E 根据公式推导,能得到只判断 x*log(y)和y*log(x)得到答案,但是这题对精度要求很高,如果x==y的时候直接返回=即可代码:

#include<bits/stdc++.h> using namespace std; #define LL long long int main() { LL x,y; cin>>x>>y; if(x==y) { cout<<"="<<endl; return 0; } double num1=x*log(y); double num2=y*log(x); if(num1>num2)cout<<"<"<<endl; if(num1<num2)cout<<">"<<endl; //cout<<num1<<" "<<num2<<endl; if(num1==num2)cout<<"="<<endl; }
F题,让找出最小的花费,先遍历一遍,判断是否有符合这个条件的,如果符合在找第三个是否符合,如果也符合就比较最小值,最后输出最小值就可以:

#include<bits/stdc++.h> using namespace std; #define LL long long struct mp { int num; int cost; }o[5005]; LL ans[5005]; int main() { int t; cin>>t; for(int i=0;i<t;i++) { cin>>o[i].num ; } for(int i=0;i<t;i++) { cin>>o[i].cost ; ans[i]=1e18; } for(int i=1;i<t;i++) { int num1=1e9+7; int flag=0; for(int j=0;j<i;j++) { if(o[j].num<o[i].num &&o[j].cost<num1) { flag=1; num1=o[j].cost ; } } if(flag==0)continue; int num2=1e9+7; for(int j=i+1;j<t;j++) { if(o[i].num<o[j].num &&o[j].cost <num2 ) { flag=2; num2=o[j].cost ; } } if(flag==2)ans[i]=num1+num2+o[i].cost ; } LL res=1e18; for(int i=0;i<t;i++) { if(ans[i]<res)res=ans[i]; } if(res==1e18)cout<<-1<<endl; else cout<<res<<endl; }
7-10 这题当时没真正了解题意就开始做了,说的是绝对值相同就删除,而且后面输出删除的当时也没看懂,不过想明白还是可以的:

#include<bits/stdc++.h> using namespace std; #define LL long long struct mp { int aa; int num; int next; }edge[100050]; int vis[100050]; vector<mp>p; int main() { int frist,n; cin>>frist>>n; for(int i=0;i<n;i++) { int a,b,c; cin>>a>>b>>c; edge[a].aa =a; edge[a].num =b; edge[a].next =c; } mp o; for(int i=frist;i!=-1;i=edge[i].next ) { //cout<<p.size()<<" "<<i<<endl; if(vis[abs(edge[i].num )]==1) { if(p.size()!=0)p[p.size()-1].next=edge[i].aa ; o.aa=edge[i].aa ; o.num=edge[i].num ; p.push_back(o); continue; } vis[abs(edge[i].num )]=1; if(i!=frist) printf("%05d\n",edge[i].aa ); printf("%05d %d ",edge[i].aa ,edge[i].num ); } cout<<-1<<endl; if(p.size()!=0) { for(int i=0;i<p.size();i++) { printf("%05d %d ",p[i].aa ,p[i].num ); if(i!=p.size()-1)printf("%05d\n",p[i].next ); else cout<<-1<<endl; } } }
7-11 ...无语,一个并查集,但是因为find函数的原因超时了,改完find就对了 代码:

#include<bits/stdc++.h> using namespace std; #define LL long long int s[20050]; int find(int x) { return s[x]==x?x:s[x]=find(s[x]); } void uni(int a,int b) { int v=find(a); int r=find(b); if(v!=r) { s[v]=r; } } int main() { int t; cin>>t; int max=0; for(int i=0;i<=10010;i++)s[i]=i; int num=0; for(int k=0;k<t;k++) { int n; cin>>n; for(int i=0;i<n;i++) { int v; scanf("%d",&v); if(v>max)max=v; if(i!=0) { uni(num,v); } else num=v; } } int res=0; for(int i=1;i<=max;i++) { if(s[i]==i)res++; } cout<<max<<" "<<res<<endl; int g; cin>>g; while(g--) { int x,y; cin>>x>>y; if(find(x)==find(y)) { cout<<"Y"<<endl; } else cout<<"N"<<endl; } }
7-1 当时判断独立字符串的时候出了点问题,还是对字符串有点生疏,这个题可以用价值一个亿的代码做,也可以直接写 代码:

#include<bits/stdc++.h> using namespace std; int main() { int n; string str; vector<string> v; cin>>n; getchar(); while(n--){ getline(cin,str); cout<<str<<endl<<"AI: "; for(int i=0;i<str.size();i++){ if(str[i]>='A'&&str[i]<='Z'){ if(str[i]!='I'){ str[i]=str[i]-'A'+'a'; } }else if((str[i]>='0'&&str[i]<='9')||(str[i]>='a'&&str[i]<='z')){ continue; }else if(str[i]!=' '){ str.insert(i," "); i++; } if(str[i] =='?'){ str[i]='!'; } } string temp=""; for(int i=0;i<str.size();i++){ if(str[i]!=' '){ temp+=str[i]; }else{ if(temp!=""){ v.push_back(temp); temp=""; } } } if(temp!=""){ v.push_back(temp); } for(int i=0;i<v.size();i++){ if(v[i]=="I"||v[i]=="me"){ v[i]="you"; }else if(v[i]=="can"||v[i]=="could"){ if((i+1)<v.size()){ if(v[i+1]=="you"){ v[i+1] = v[i]; v[i]="I"; } } } } for(int i=0;i<v.size();i++){ cout<<v[i]; if(i==v.size()-1){ break; } if((v[i+1][0]>='0'&&v[i+1][0]<='9')||(v[i+1][0]>='a'&&v[i+1][0]<='z')||(v[i+1][0]=='I')){ printf(" "); } } printf("\n"); v.clear(); } return 0; }
7-3 emm..改了好多遍都不知道哪错了,看了ac代码后也没感觉有什么差别,难道写个函数就不对了?不清楚,我的代码:

#include<bits/stdc++.h> using namespace std; #define LL long long struct mp { LL up; LL done; }o; vector<mp>p; vector<mp>q; LL gcd(LL a,LL b) { if(b==0)return a; else return gcd(b,a%b); } LL lcm(LL a,LL b) { return a/gcd(a,b)*b; } int main() { int t; cin>>t; for(int i=0;i<t;i++) { LL a,b; scanf("%lld/%lld",&a,&b); //cout<<a<<" "<<b<<endl; if(a==0||b==0)continue; o.up=a; o.done=b; if(a>0) { p.push_back(o); } else q.push_back(o); } LL sum=1; LL res=0; for(int i=0;i<p.size();i++) { sum=lcm(sum,p[i].done); // cout<<p[i].done<<endl; } for(int i=0;i<q.size();i++) { // cout<<q[i].done<<" "<<q[i].up<<endl; sum=lcm(sum,q[i].done); } for(int i=0;i<p.size();i++) { res+=p[i].up*sum/p[i].done; } for(int i=0;i<q.size();i++) { res+=q[i].up*sum/q[i].done; } if(res==0)cout<<0<<endl; else if(res%sum==0)cout<<res/sum<<endl; else { LL num1=gcd(res,sum); res=res/num1; sum=sum/num1; if(sum<0)res=-res,sum=-sum; LL v=res/sum; if(v!=0)cout<<v<<" "; res=res%sum; cout<<res<<"/"<<sum<<endl; } }
AC代码:

#include<bits/stdc++.h> #include<algorithm> using namespace std; //求最大公约数函数 long long gcd(long long a,long long b) { if(a==0) { return 0; } else { return (b==0) ? a: gcd(b,a%b); //固定格式要记住 } } int main() { int n; long long a,b,c,d; char d1,d2; cin>>n; cin>>a>>d1>>b; int t=gcd(a,b); //约分 if(a) { a=a/t; b=b/t; } //依次输入相加 for(int i=1;i<n;i++) { cin>>c>>d2>>d; //通分 long long b1=b/gcd(b,d)*d; a=a*b1/b+c*b1/d; b=b1; int t2=gcd(a,b); if(t2!=0) { a=a/t2; b=b/t2; } //cout<<a<<"/"<<b<<endl; } //cout<<a<<"/"<<b<<endl; if(a&&a/b==0) { cout<<a%b<<"/"<<b<<endl; } else if(a%b==0) { cout<<a/b<<endl; } else { cout<<a/b<<" "<<a%b<<"/"<<b<<endl; } }