第一题 :传送门
题意:把每个月银行账户余额加起来除以12
//ac代码
#include<cstdio>
using namespace std;
int main()
{
double x;
double re=0;
for(int i=1;i<=12;i++){
scanf("%lf",&x);
re+=x;
}
printf("$%.2lf\n",re/12);
}
第二题 传送门
老师原题,测测你们有没有认真补题
//ac代码
#include<iostream>
using namespace std;
const int maxn=1e3+5;
int pre[maxn];
int _find(int x)
{
return x==pre[x]?x:pre[x]=_find(pre[x]);
}
int main()
{
int n,m;
while(cin>>n&&n){
cin>>m;
for(int i=1;i<=n;i++){
pre[i]=i;
}
int a,b;
for(int i=1;i<=m;i++){
cin>>a>>b;
int rt1=_find(a);
int rt2=_find(b);
if(rt1!=rt2){
pre[rt2]=rt1;
}
}
int ans=0;
for(int i=1;i<=n;i++){
if(i==pre[i]){
ans++;
}
}
cout<<ans-1<<endl;
}
return 0;
}
第三题 传送门
题意:找最大值和最小值
#include<iostream>
#include<string>
using namespace std;
const int maxn=1e5+5;
struct node{
string id;
string zs;
string ws;
}e[maxn];
int main()
{
int t;
cin>>t;
while(t--){
int n;cin>>n;
for(int i=0;i<n;i++){
cin>>e[i].id>>e[i].zs>>e[i].ws;
}
int a=0,b=0;
for(int i=0;i<n;i++){
if(e[i].zs<=e[a].zs){
a=i;
}
if(e[i].ws>=e[b].ws){
b=i;
}
}
cout<<e[a].id<<" "<<e[b].id<<endl;
}
return 0;
}
第四题
题意:用数学语言来讲就是判断二个集合是否相同
暴力解法
//ac代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e2+5;
int main()
{
int n;
while(~scanf("%d",&n)){
int num1[maxn];
int num2[maxn];
int r1[maxn];
int r2[maxn];
for(int i=0;i<n;i++){
cin>>num1[i];
}
sort(num1,num1+n);
int ans=0,ct=0;
num1[n]=0;
for(int i=0;i<n;i++){
if(num1[i]!=num1[i+1]){
r1[ans++]=num1[i];
}
}
for(int i=0;i<n;i++){
cin>>num2[i];
}
sort(num2,num2+n);
num2[n]=0;
for(int i=0;i<n;i++){
if(num2[i]!=num2[i+1]){
r2[ct++]=num2[i];
}
}
int flag=1;
if(ct==ans){
for(int i=0;i<ans;i++){
if(r1[i]!=r2[i]){
flag=0;break;
}
}
if(flag){
cout<<"YES"<<endl;
}else cout<<"NO"<<endl;
}else cout<<"NO"<<endl;
}
return 0;
}
技巧解法
#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)){
set<int>s1;
set<int>s2;
int a;
for(int i=0;i<n;i++){
cin>>a;
s1.insert(a);
}
for(int i=0;i<n;i++){
cin>>a;
s2.insert(a);
}
if(s1.size()!=s2.size()){
cout<<"NO"<<endl;
}else{
int temp=s2.size();
for(set<int>::iterator it=s1.begin();it!=s1.end();it++){
s2.insert(*it);
}
if(temp==s2.size()){
cout<<"YES"<<endl;
}else cout<<"NO"<<endl;
}
}
return 0;
}
第五题 传送门
a+b问题
emmm注意格式问题
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e3+5;
int main()
{
int t;
int num1[maxn],num2[maxn];
int ans=0;
scanf("%d",&t);
while(t--){
char ch1[maxn];
char ch2[maxn];
if(ans)printf("\n\n");
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
scanf("%s %s",ch1,ch2);
printf("Case %d:\n",++ans);
printf("%s + %s = ",ch1,ch2);
int len1=strlen(ch1);
int len2=strlen(ch2);
for(int i=0;i<len1;i++){
num1[i]=ch1[len1-i-1]-'0';
}
for(int i=0;i<len2;i++){
num2[i]=ch2[len2-i-1]-'0';
}
for(int i=0;i<len2;i++){
num1[i]+=num2[i];
if(num1[i]>=10){
num1[i]-=10;
num1[i+1]++;
}
}
int len=maxn-1;
while(num1[len]==0&&len>=0)len--;
if(len==-1)printf("0");
else{
for(int i=len;i>=0;i--){
printf("%d",num1[i]);
}
}
}
printf("\n");
return 0;
}
第六题 传送门
本题为我们刚刚所学最小生成树问题
prim算法实现
#include<iostream>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e2+5;
int mp[maxn][maxn];
int dis[maxn],vit[maxn];
int n,m;
int main()
{
while(cin>>n>>m&&n){
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(i!=j)mp[i][j]=inf;
else mp[i][j]=0;
}
}
int a,b,c;
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
if(c<mp[a][b]){
mp[a][b]=c;
mp[b][a]=c;
}
}
for(int i=1;i<=m;i++){
dis[i]=mp[1][i];
vit[i]=0;
}
vit[1]=1;
int minn,p=-1;
int ans=0,re=0;
for(int i=1;i<=m-1;i++){
minn=inf;p=-1;
for(int j=1;j<=m;j++){
if(dis[j]<minn&&!vit[j]){
minn=dis[j];
p=j;
}
}
if(p==-1){
ans=1;
break;
}
vit[p]=1;
re+=dis[p];
for(int k=1;k<=m;k++){
if(dis[k]>mp[p][k]&&!vit[k]){
dis[k]=mp[p][k];
}
}
}
if(!ans){
cout<<re<<endl;
}else cout<<'?'<<endl;
}
return 0;
}
第七题 传送门
并查集+模拟综合题
重点在Reject与Accept的判断,根据题目第三、四段的描述可知
Accept情况是这个公司还存在,并非名存实亡
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int num[maxn];
int pre[maxn];
int _find(int x)
{
return x==pre[x]?x:pre[x]=_find(pre[x]);
}
void join(int x,int y)
{
int rt1=_find(x);
int rt2=_find(y);
if(rt1!=rt2){
pre[rt2]=rt1;
_find(y);
}
return ;
}
int main()
{
int n,k,m;
string str;
int x,y;
while(cin>>n>>k>>m){
for(int i=0;i<n;i++){
pre[i]=i;
num[i]=inf;
}
int a,b;
for(int i=1;i<=k;i++){
cin>>a>>b;
num[b]=min(num[b],a);
}
for(int i=1;i<=m;i++){
cin>>str;
if(str=="AP"){
cin>>x>>y;
if(_find(y)==y){
printf("Accept\n");
num[y]=min(num[y],x);
}else printf("Reject\n");
}else if(str=="MG"){
cin>>x>>y;
if(x==_find(x)&&y==_find(y)&&x!=y){
printf("Accept\n");
join(x,y);
num[x]=min(num[x],num[y]);
num[y]=inf;
}else printf("Reject\n");
}else if(str=="GT"){
cin>>x;
int rt=_find(x);
if(rt==x){
if(num[x]!=inf){
printf("Lowest rate: %d.\n",num[x]);
}else{
printf("Company %d is empty.\n",x);
}
}else{
printf("Company %d is a part of company %d.\n",x,rt);
}
}
}
printf("\n");
}
return 0;
}
如有不对的地方,欢迎大家指正!!!