日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NOIP2011提高组day2

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NOIP2011提高组day2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NOIP 2011 提高組 Day 2

T1 :

題意:

? ? ? ? ?這道題題意很顯然,方法就是利用數學中的二項式定理 : ( x + y ) ^ n = C ( i , n ) * x ^ i * y ^ ( n - i ),i ∈ [ 0 , n ],所以求x ^ n * y ^ m的系數,就是求C( n , k ) * a ^ n * b ^ m再模上10007,注意求C( n , k ) % mod時要求逆元。

代碼:

?

#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std;const int mod = 10007;long long fac, vfac, vvfac, facc, M; long long a, b, k, n, m;long long exgcd(long long a1, long long b1, long long &x, long long &y) {if (b1 == 0) {x = 1;y = 0;return b1;} else {long long x0, y0;long long dd = exgcd(b1, a1 % b1, x0, y0);x = y0;y = x0 - (a1 / b1) * y0;return dd;} }long long rv(long long i, long long mo) {long long x, y;exgcd(i, mo, x, y);return (x % mo + mo) % mo; }int main() {freopen("factor.in", "r", stdin);freopen("factor.out", "w", stdout);scanf("%I64d%I64d%I64d%I64d%I64d", &a, &b, &k, &n, &m);fac = 1;facc = 1;M = 1;for (int i = 1; i <= k; i++) M = M * i % mod;for (int i = 1; i <= n; i++) fac = fac * i % mod;for (int i = 1; i <= m; i++) facc = facc * i % mod;vfac = rv(fac, mod);vvfac = rv(facc, mod);long long w = (M % mod * vfac % mod * vvfac % mod) % mod;long long l = 1, r = 1;for (int i = 1; i <= n; i++) l = l * a % mod;for (int i = 1; i <= m; i++) r = r * b % mod;printf("%I64d\n", (l % mod * r % mod * w % mod) % mod);return 0; } View Code

?

T2 :

題意:

? ? ? ? 不難想到這道題求W要用到二分答案,二分的條件也不難想,注意求L到R中有多少個滿足W[ i ] >= W的時候可以借助前綴和。

#include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std;const int N = 200001;const long long INF = 1e15 + 1;long long n, m, S, ans = INF, Y; long long w[N], v[N], ll[N], rr[N], sum[N], cnt[N];bool check(long long x) {memset(sum, 0, sizeof(sum));memset(cnt, 0, sizeof(cnt));Y = 0;for (int i = 1; i <= n; i++) {if (w[i] >= x) sum[i] = sum[i - 1] + v[i], cnt[i] = cnt[i - 1] + 1;else sum[i] = sum[i - 1], cnt[i] = cnt[i - 1];}for (int i = 1; i <= m; i++)Y += (cnt[rr[i]] - cnt[ll[i] - 1]) * (sum[rr[i]] - sum[ll[i] - 1]);if (abs(Y - S) <= ans) {ans = abs(Y - S);return true;}return false; }int main() {freopen("qc.in", "r", stdin);freopen("qc.out", "w", stdout);scanf("%I64d%I64d%I64d", &n, &m, &S);long long ma = -1;for (int i = 1; i <= n; i++) {scanf("%I64d%I64d", &w[i], &v[i]);if (w[i] > ma) ma = w[i];}for (int i = 1; i <= m; i++) scanf("%I64d%I64d", &ll[i], &rr[i]);long long lf = 0, rg = ma;while (lf != rg) {long long mid = (lf + rg) >> 1;if (check(mid) && Y <= S) rg = mid;if (check(mid) && Y > S) lf = mid + 1;if (!check(mid) && Y <= S) rg = mid;if (!check(mid) && Y > S) lf = mid + 1;}int mid = (lf + rg) >> 1;check(mid);printf("%I64d\n", ans);return 0; } View Code

T3 :

題意:

? ? ? ? ??這道題要求的是乘客的總旅行時間最短,不難想到要讓每一個乘客旅行時間都最短,所以我們想到可以用貪心算法來求解,所以現在的問題是,我們要怎么使用這些氮氣瓶?我們應該給哪些段加速?

? ? ? ? 首先,如果有這樣的一段路,觀光車比下一個站點最晚到的一個人還要到得晚,很顯然我們該使用加速器了;其次,如果有很多段這樣的路段,我們便選擇對結果影響最大的一段,就是在下一站下車人數最多的那一段,這樣一直找下去,直到氮氣用盡或者是不存在這樣的路段。

需要用到的數組:

latest[ i ]:站點i乘客最晚到的時間;

arrive[ i ]:觀光車最晚到i站點的時間;

next[ i ]:離第i個站點最近的站點滿足latest[ i ] >= arrive[ i ](意思就是說從i到next[ i ] - 1的路段都滿足觀光車到得比游客晚);

sum[ i ]:前i個站中下車的人數;

這是網上找的有批注版的,便于理解:

#include<iostream> #include<cstdio> #include<cmath> using namespace std; int n,m,k; int Di[1005]; int t[10005],a[10005],b[10005]; int arrive[1005],latest[1005]; int sum[1005],next[1005]; int minn,sta; int ans; int maxl; int main() {freopen("bus.in","r",stdin);freopen("bus.out","w",stdout);scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n-1;i++)scanf("%d",&Di[i]);for(int i=1;i<=m;i++){scanf("%d%d%d",&t[i],&a[i],&b[i]);sum[b[i]]++;if(t[i]>latest[a[i]])latest[a[i]]=t[i];}//前綴累加和for(int i=2;i<=n;i++)sum[i]+=sum[i-1];while(1){//每次更新距離后(用了加速器)都要更新arrive[] arrive[1]=0;for(int i=2;i<=n;i++)arrive[i]=max(arrive[i-1],latest[i-1])+Di[i-1];//且要更新next[],因為用了加速器后,有些點是不滿足區間條件next[n]=n;for(int i=n-1;i>=1;i--){//滿足條件區間連續 1(*) 2 3(*) 4(*) 5(*) 6 7(*) 8 // 3---next[3]-1 3 6 6 6 6 8 8 8 next[i]=next[i+1];if(arrive[i+1]<=latest[i+1])//第i+1個點不滿足next[i]=i+1;}//貪心需找區間maxl=1;while(!Di[maxl]&&maxl<=n-1)++maxl;if(maxl==n||k==0)break;//尋找最優區間//i+1--next[i]-1,sum[next[i]]-sum[i]=i+1--for(int i=maxl+1;i<=n-1;i++)if(Di[i]&&sum[next[maxl]]-sum[maxl]<sum[next[i]]-sum[i])maxl=i;if(sum[next[maxl]]-sum[maxl]==0)break;//后面已無乘客int dd=100005;for(int i=maxl+1;i<=next[maxl]-1;i++)dd=min(dd,arrive[i]-latest[i]);//最小時間差,乘客先到,汽車后到dd=min(dd,k);//這段區間中使用加速器,所有乘客都受益,所以不存在人數最多相同區間dd=min(dd,Di[maxl]);k-=dd;//區間沒人都受益,受益總和確定Di[maxl]-=dd;} //此時所以bus都比乘客先到達 for(int i=1;i<=m;i++)ans+=abs(arrive[b[i]]-t[i]);//防止沒有加速器 ,可能為負cout<<ans<<endl;return 0; } View Code

這是自己寫的:

#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std;const int N = 10001;int t[N], a[N], b[N], latest[N], arrive[N], d[N], next[N], sum[N]; int n, m, k, ans;int main() {freopen("bus.in", "r", stdin);freopen("bus.out", "w", stdout);scanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= n - 1; i++) scanf("%d", &d[i]);for (int i = 1; i <= m; i++) {scanf("%d%d%d", &t[i], &a[i], &b[i]);if (t[i] > latest[a[i]]) latest[a[i]] = t[i];sum[b[i]]++;}for (int i = 1; i <= n; i++) sum[i] += sum[i - 1];while (1) {int maxl = 1;arrive[1] = 0;for (int i = 2; i <= n; i++)arrive[i] = max(arrive[i - 1], latest[i - 1]) + d[i - 1];next[n] = n;for (int i = n - 1; i; i--) {next[i] = next[i + 1];if (arrive[i + 1] <= latest[i + 1]) next[i] = i + 1;}while (!d[maxl] && maxl <= n - 1) maxl++;if (maxl == n || k == 0) break;for (int i = maxl + 1; i <= n - 1; i++)if (d[i] && sum[next[maxl]] - sum[maxl] < sum[next[i]] - sum[i]) maxl = i;if (sum[next[maxl]] - sum[maxl] == 0) break;int least = 1e8 + 7;for (int i = maxl + 1; i <= next[maxl] - 1; i++)least = min(least, arrive[i] - latest[i]);least = min(least, k);least = min(least, d[maxl]);k -= least;d[maxl] -= least;}for (int i = 1; i <= m; i++) ans += (arrive[b[i]] - t[i]);printf("%d", ans);return 0; } View Code

?

轉載于:https://www.cnblogs.com/ganster/p/8833209.html

總結

以上是生活随笔為你收集整理的NOIP2011提高组day2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩国产麻豆 | 久久不卡 | 一区二区三区亚洲 | 中文字幕11页中文字幕11页 | 色综合天天综合网国产成人网 | 91麻豆精品国产午夜天堂 | 欧美人妖69xxxxxhd3d | 成人久久18免费网站图片 | 欧美精品首页 | 成人免费黄色片 | 91福利视频网 | 欧美色图11p | 日日噜噜夜夜狠狠久久丁香五月 | 青草草在线视频 | 欧洲久久久 | 青青国产在线观看 | 公侵犯人妻一区二区 | 无码人妻精品一区二区三应用大全 | 精品久久成人 | 国产字幕在线观看 | 一级特级毛片 | 四虎影视在线 | 日韩亚州 | 亚洲精品成人av | 91国产在线播放 | 成人动漫免费观看 | 欧美群交射精内射颜射潮喷 | 野花av | 亚洲自拍色 | 亚洲 欧美 日韩 国产综合 在线 | 九色av| 日本一本久草 | 一级片久久 | 丰满护士巨好爽好大乳 | 婷色| 国产野外作爱视频播放 | 中文在线字幕免费观看 | 黑人玩弄人妻一区二区三区影院 | 可以免费看污视频的网站 | 秋霞午夜影院 | 色老二导航 | 国产明星换脸xxxx色视频 | 四虎永久网站 | 久久伊人婷婷 | 欧美日韩一区视频 | www夜插内射视频网站 | 久久久久这里只有精品 | 中文字幕一级片 | 免费黄色片子 | wwww在线观看| 天天色天天干天天 | 性网| 伊是香蕉大人久久 | 欧美粉嫩videosex极品 | av动漫网站| 黄瓜视频污在线观看 | 国产sm调教一区二区 | 久久综合久久久久 | 秋霞福利影院 | 无码人妻精品一区二区三区66 | 超碰不卡 | 免费荫蒂添的好舒服视频 | 猛1被调教成公厕尿便失禁网站 | 亚洲丝袜在线观看 | 亚洲男人影院 | 亚洲不卡免费视频 | 制服丝袜av电影 | 蜜臀av粉嫩av懂色av | 精品人妻伦一二三区久 | 男人添女人下部高潮视频 | 久久一区二区三区四区 | 久久久人人人 | 久久精品www | 伊人中文字幕在线 | 国产第十页 | 久草香蕉在线 | 韩国福利一区 | 国产成人在线观看免费 | 亚洲videos| 黄色三级在线视频 | 999久久久久 | 男生和女生一起搞鸡 | 久久久久久久久久久久久久久久久久 | 亚洲综合免费视频 | 国产玖玖视频 | 午夜精品一区二区三区免费视频 | 日韩h在线| 日本一区二区三区久久久久 | 亚洲av无码国产精品永久一区 | 久插视频 | 国产日韩精品在线观看 | 国产免费黄色网址 | www.国产成人 | 国产色婷婷一区二区三区竹菊影视 | 韩日一级片 | 国产区123 | 少妇做爰免费理伦电影 | 国产欧美一区二区三区沐欲 | 3344成人|