2019 Multi-University Training Contest 7
Final Exam
题意:一共有n道题,需要做对k道题,每个题有一个分数,要想做对这道题,需要准备的时间是这道题的分数加1,给出n道题的总分数m,问你做对k道题花费的最少时间,还有就是,你学了哪儿道题,出题人就会想办法阻止你,比如你学一道题1分钟,他会把这道题目的分数提高到>=1分,但是满足最后的总分数是m。
题解:他阻止我分数最小的n-k+1个,然后把剩下的k-1个变成前面n-k个里面“最大的数(相等或者加一)”(正好整除,就是前面的数加1,不整除就是前面的向下取整加一,然后把多于的平均分到前面的上面就好),然后前面的数再加1(正好整除随便分到前面任意一个数,不整除可以加到前面的没有平均分到的那个位置),这样保证前面n-k+1个的总和>m,这样总时间会更小.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,m,k,k2,k1; int main() { int _; scanf ( "%d" ,&_); while (_--) { scanf ( "%lld%lld%lld" ,&n,&m,&k); printf ( "%lld\n" ,m+1+(m/(n-k+1)+1)*(k-1)); } } |
Kejin Player
E[i]+a[i]=E[i+1]*p[i]+E[x[i]]*(1-p[i])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <bits/stdc++.h> using namespace std; const int mod=1e9+7; typedef long long ll; const int maxn=500010; ll n,q,r[maxn],s[maxn],x[maxn],a[maxn],p[maxn],f[maxn]; ll pow_mod(ll a,ll b) { ll res=1; while (b) { if (b&1) { res=res*a%mod; } a=a*a%mod; b>>=1; } return res; } ll inv(ll x) { return pow_mod(x,mod-2); } inline ll read() { ll res=0,f=1; char ch= getchar (); while (! isdigit (ch)) { if (ch== '-' ) { f=-f; } ch= getchar (); } while ( isdigit (ch)) { res=(res<<3)+(res<<1)+ch- '0' ; ch= getchar (); } return f*res; } int main() { int _; scanf ( "%d" ,&_); while (_--) { scanf ( "%lld%lld" ,&n,&q); for ( int i=1; i<=n; i++) { r[i]=read();s[i]=read();x[i]=read();a[i]=read(); p[i]=r[i]*inv(s[i])%mod; } for ( int i=2; i<=n+1; i++) { f[i]=(f[i-1]+a[i-1]%mod+f[x[i-1]]*(mod-(1-p[i-1]+mod))%mod)*inv(p[i-1])%mod; } while (q--) { ll l,r; scanf ( "%lld%lld" ,&l,&r); printf ( "%lld\n" ,(f[r]-f[l]+mod)%mod); } } } |
A + B = C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 5e5 + 10,limit = 3e5 + 6; int dis[maxn]; int solve( int c[], int lenc, int a[], int lena, int b[], int lenb) { for ( int i=0; i<limit; i++) { if (c[i]!=a[i]) { if (c[i]<a[i]) { return -1; } break ; } } for ( int i=0; i<limit; i++) { dis[i]=c[i]-a[i]; } for ( int i=limit-1; i; i--) { if (dis[i]<0) { dis[i-1]--; dis[i]+=10; } } int cur=0; while (dis[cur]==0&&cur<limit) { cur++; } if (cur==limit) { return -1; } for ( int i=0; i<lenb; i++) { if (dis[cur+i]!=b[i]) { return -1; } } for ( int i=lenb; i<limit; i++) { if (dis[i+cur]) { return -1; } } return limit-cur-lenb; } int a[maxn], b[maxn], c[maxn]; char s[maxn]; int main() { int lena,lenb,lenc,_; scanf ( "%d" ,&_); while (_--) { memset (a,0, sizeof (a)); memset (b,0, sizeof (b)); memset (c,0, sizeof (c)); scanf ( "%s" ,s); for ( int i=0; s[i]; i++,lena=i) { a[i+1]=s[i]- '0' ; } scanf ( "%s" ,s); for ( int i=0; s[i]; i++,lenb=i) { b[i+1]=s[i]- '0' ; } scanf ( "%s" ,s); for ( int i=0; s[i]; i++,lenc=i) { c[i+1]=s[i]- '0' ; } int res; if ((res=solve(c+1,lenc,a+1,lena,b+1,lenb))!=-1) { printf ( "%d %d %d\n" ,limit-lena,res,limit-lenc); continue ; } if ((res=solve(c+1,lenc,a,lena+1,b+1,lenb))!=-1) { printf ( "%d %d %d\n" ,limit-lena-1,res,limit-lenc); continue ; } if ((res=solve(c+1,lenc,b+1,lenb,a+1,lena))!=-1) { printf ( "%d %d %d\n" ,res,limit-lenb,limit-lenc); continue ; } if ((res=solve(c+1,lenc,b,lenb+1,a+1,lena))!=-1) { printf ( "%d %d %d\n" ,res,limit-lenb-1,limit-lenc); continue ; } printf ( "-1\n" ); } return 0; } |
Just Repeat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | #pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; unsigned long long k1, k2, mod; int n,m; const int maxn=1e5+5; int a[maxn],b[maxn],p,cnt,suma,sumb; unsigned long long rng() { unsigned long long k3 = k1, k4 = k2; k1 = k4; k3 ^= k3 << 23; k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26); return k2 + k4; } struct node { int num,a,b; bool operator<( const node &b) const { return num>b.num; } } c[maxn]; inline int read() { int res=0,f=1; char ch= getchar (); while (! isdigit (ch)) { if (ch== '-' ) { f=-f; } ch= getchar (); } while ( isdigit (ch)) { res=(res<<3)+(res<<1)+ch- '0' ; ch= getchar (); } return f*res; } int main() { int _; scanf ( "%d" ,&_); while (_--) { unordered_map < int , int > m1,m2; suma=sumb=cnt=0; scanf ( "%d%d%d" ,&n,&m,&p); if (p==1) { for ( register int i=0; i<n; ++i) { a[i]=read(); } for ( register int i=0; i<m; ++i) { b[i]=read(); } } else { scanf ( "%llu%llu%llu" ,&k1,&k2,&mod); for ( int i = 0; i < n; ++i) a[i] = rng() % mod; scanf ( "%llu%llu%llu" ,&k1,&k2,&mod); for ( int i = 0; i < m; ++i) b[i] = rng() % mod; } for ( int i=0; i<n; i++) { m1[a[i]]++; } for ( int i=0; i<m; i++) { m2[b[i]]++; } for ( register int i=0; i<m; ++i) { if (m1[b[i]]>0) { ++cnt; c[cnt].num=m1[b[i]]+m2[b[i]]; c[cnt].a=m1[b[i]]; c[cnt].b=m2[b[i]]; m1[b[i]]=-1; } else if (m1[b[i]]!=-1&&m2[b[i]]!=-1) { sumb+=m2[b[i]]; m2[b[i]]=-1; } } for ( register int i=0; i<n; i++) { if (m2[a[i]]==0) { suma+=m1[a[i]]; m2[a[i]]=-1; } } sort(c+1,c+cnt+1); for ( register int i=1; i<=cnt; ++i) { if (i&1) { suma+=c[i].a; } else { sumb+=c[i].b; } } if (suma>sumb) { printf ( "Cuber QQ\n" ); } else { printf ( "Quber CC\n" ); } } return 0; } |
Getting Your Money Back
Halt Hater
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步