题意:
给出n和m,表示n个数,之后会给出m个下标xi和值yi,a[xi]=yi,n个数是不下降的,且总和>0,要使得(x1+x2)/∑(xi)最大。
分析:
尽可能使得前两个数最大,其他数尽可能小即可。
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <iostream> #include <algorithm> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <bitset> using namespace std; #define LL long long #define dou double #define For(i,a,b) for (int i=(a),_##i=(b); i<=_##i; i++) #define Rof(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--) #define rep(i,a,b) for (int i=(a),_##i=(b); i<=_##i; i++) #define rek(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--) #define mem(a,b) memset(a,b,sizeof(a)) #define Cpy(a,b) memcpy(a,b,sizeof(b)) int t,n,m,xi,yi,maxx,minx,a[110],x[110]; int gcd(int a,int b) { return (b==0)?a:gcd(b,a%b); } int main() { //freopen("in.txt","r",stdin); for(scanf("%d",&t);t--;) { mem(x,0); ans=1; scanf("%d %d",&n,&m); For(i,1,m) { scanf("%d %d",&xi,&yi); a[xi]=yi; x[ans++]=xi; } if(m==0) {printf("1/1\n");continue;} count=1; else { for(int i=1;i<=n;i++) { if(i<a[count]) a[] } } For(i,1,n) printf("%d ",a[i]); int fenzi,fenmu=0; fenzi=a[1]+a[2]; For(i,1,n) fenmu+=a[i]; int p=gcd(fenmu,fenzi); printf("%d/%d\n",fenzi/p,fenmu/p); } return 0; }
HDU5742:It's All In The Mind
时间: 2024-10-13 16:00:08