其他分享
首页 > 其他分享> > vijos题解

vijos题解

作者:互联网

Vijos题解

网址:https://vijos.org/

P1001

题意:按照指定要求计算奖学金,直接用if判断即可

#include<iostream>

using namespace std;

struct STUDENT{

string name;

int n1,n2;

char xsgb,xb;

int lw;

int jxj;

};

int main(){

int n;

int sum=0;

cin>>n;

struct STUDENT stu[n];

struct STUDENT zdz;

zdz.jxj=0;

for(int i=0;i<n;i++)stu[i].jxj=0;

for(int i=0;i<n;i++){

cin>>stu[i].name>>stu[i].n1>>stu[i].n2>>stu[i].xsgb>>stu[i].xb>>stu[i].lw;

if(stu[i].n1>80&&stu[i].lw>=1)stu[i].jxj+=8000;

if(stu[i].n1>85&&stu[i].n2>80)stu[i].jxj+=4000;

if(stu[i].n1>90)stu[i].jxj+=2000;

if(stu[i].n1>85&&stu[i].xb=='Y')stu[i].jxj+=1000;

if(stu[i].n2>80&&stu[i].xsgb=='Y')stu[i].jxj+=850;

if(stu[i].jxj>zdz.jxj)zdz=stu[i];

sum+=stu[i].jxj;

}

cout<<zdz.name<<endl<<zdz.jxj<<endl<<sum;

return 0;

 

}

P1097

题意:每次找最小的两堆进行合并,边合并边排序

#include <iostream>

#include <algorithm>

using namespace std;

int main(){

  int n;

  cin>>n;

  int a[n];

  for(int i=0;i<n;i++)cin>>a[i];

  int ans=0;

  sort(a,a+n);

  for(int i=1;i<n;i++){

    a[i]=a[i]+a[i-1];

    ans+=a[i];

    sort(a+i,a+n);

  }

  cout<<ans<<endl;

  return 0;

}

P1103

题意:开数组把树的状态记录下来

#include <bits/stdc++.h>

using namespace std;

int main(){

    int l,m;

    cin>>l>>m;

    int left,right,road[100000];

    for(int i=1;i<=m;i++){

        cin>>left>>right;

        for(int j=left;j<=right;j++)road[j]=1;

    }

    int s=0;

    for(int i=0;i<=l;i++){

        if(!road[i])s++;

    }

    cout<<s;

    return 0;

}

P1104

题意:标准01背包问题

#include<bits/stdc++.h>

using namespace std;

int Time[10000],Value[10000];

int dp[100000];

int main(){

    int a,n;

    cin>>a>>n;

    for(int i=0;i<n;i++){

        cin>>Time[i]>>Value[i];

    }

    for(int i=0;i<n;i++){

        for (int j=a;j>=Time[i];j--){

            dp[j]=max(dp[j],dp[j-Time[i]]+Value[i]);

        }

    }

    cout<<dp[a];

    return 0;

}

P1113

#include <iostream>

using namespace std;

int bgx,a,b,zdz;

int main(){

for(int i=0;i<7;i++){

cin>>a>>b;

if(a+b>8&&a+b>bgx)bgx=a+b,zdz=i+1;

}

cout<<zdz;

return 0;

}

P1115

题意:对数做排列,可以用STL的next_permutation函数

#include<bits/stdc++.h>

using namespace std;

int A[10000];

int n;

int a;

int main(){

  int n;

  cin>>n>>a;

  for(int i=0;i<n;i++)

    cin>>A[i];

  for(int i=0;i<a;i++)

    next_permutation(A,A+n);

  for(int i=0;i<n;i++)

    cout<<A[i]<<' ';

  return 0;

}

P1316

题意:先去掉重复的,然后做排序,直接STL的sort函数即可

#include<iostream>

#include<algorithm>

using namespace std;

int main(){

  int n;

  scanf("%d",&n);

  int f=n;

  int a[n];

  for(int i=0;i<n;i++)scanf("%d",a+i);

  for(int i=0;i<n;i++){

  for(int j=i+1;j<n;j++){

  if(i!=j && a[i]==a[j] && a[i]!=-1 && a[j]!=-1 )f--,a[j]=-1;

  }

  }

  sort(a,a+n);

  printf("%d\n",f);

  for(int i=0;i<n;i++){

  if(a[i]!=-1)printf("%d ",a[i]);

  }

  return 0;

}

P1911

题意:找出集合中一个数等于其他两数之和,三层循环枚举

#include<bits/stdc++.h>

using namespace std;

int n,*a,s,t,u,ans;

bool f[10001]; 

int main(){

  cin>>n;

  a=(int*)malloc(n*sizeof(int));

  for(int i=0;i<n;i++)

  cin>>a[i];

  for(int i=0;i<n;i++){

  s=a[i];

  for(int j=0;j<n;j++){

  if(j==i)continue;//不同的数 

  t=a[j];

  for(int k=0;k<n;k++){

  if(k==i||k==j)continue;

  u=a[k];

  if(s+t==u && !f[u]){

  ans++;f[u]=1;//已经算过的

}

}

}

  }

 cout<<ans<<endl;

  return 0;

}

P1912

题意:将A 比 B 化简为 A’比 B’,要求在 A’和 B’均不大于 L 且 A’和 B’互质(两个整数的最大公约数是 1)的前提下,A’/B’ ≥ A/B 且 A’/B’ - A/B 的值尽可能小。

#include<bits/stdc++.h>

using namespace std;

int gcd(int x,int y){

    if(y==0)return x;

    return gcd(y,x%y);

}

int main(){

  int a,b,l,a1=100000,b1=1;

  cin>>a>>b>>l;

  for(int i=1;i<=l;i++){

    for(int j=1;j<=l;j++){

      if(gcd(i,j)==1 && i*b>=j*a)

        if(i*b1<=j*a1)a1=i,b1=j;

    }

  }

  cout<<a1<<' '<<b1;

  return 0;

}

P1913

题意:模拟,按照顺序构造符合条件的螺旋矩阵

#include<stdio.h>

int n,x,y;

int min(int n1,int n2){

if(n1<n2)return n1;

else return n2;

}

int solve(){

  scanf("%d%d%d",&n,&x,&y);

  int layer=min(x,n+1-x);//确定层,n方阵,如n=7,x=5就是第二层

  layer=min(layer,min(y,n+1-y));

  int num=0,side=n-1;

  for(int i=1;i<layer;i++,side-=2){

    int layer_total;

    if(side==0)layer_total=1;

    else layer_total=side*4;//当前层一圈总个数

    num+=layer_total;

  }

  num++;

  int nx=layer,ny=layer;

  if(nx==x && ny==y)return num;

  for(int i=1;i<=side;i++){

    ny++;num++;//y列向右递增

    if(nx==x && ny==y)return num;

  }

  for(int i=1;i<=side;i++){

    nx++;num++;//x行向下递增

    if(nx==x && ny==y)return num;

  }

  for(int i=1;i<=side;i++){

    ny--;num++;//y列向左递增

    if(nx==x && ny==y)return num;

  }

  for(int i=0;i<side;i++){

    nx--;num++;//x行向上递增

    if(nx==x && ny==y)return num;

  }

  return -1;

}

int main(){

  int res=solve();printf("%d",res);

  return 0;

}

标签:return,int,题解,cin,stu,&&,include,vijos
来源: https://www.cnblogs.com/jisuanjizhishizatan/p/14998627.html