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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【题目记录】——2021 年百度之星·程序设计大赛 - 初赛二

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【题目记录】——2021 年百度之星·程序设计大赛 - 初赛二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1001 簽到 數學 模擬
  • 1002 隨機題意 思維
  • 1003 魔怔 圖論 歐拉回路
  • 1004 凈化 數學,思維

題目地址 2021 年百度之星·程序設計大賽 - 初賽二
題目原地址 2021 年百度之星·程序設計大賽 - 初賽二

1001 簽到 數學 模擬

題目地址1001 簽到
題意:給a,b ,每次 a,b 會變為a+b,a?b ,問 k 次之后變成了哪兩個數,對998244353 取模,多組數據。
思路:模擬一下,算幾個數,發現是有規律的,如果k是奇數,結果就是(a+b)?2k/2modmo,(a?b+mo)?2k/2modmo(a+b)*2^{k/2}\mod mo,(a-b+mo)*2^{k/2}\mod mo(a+b)?2k/2modmo,(a?b+mo)?2k/2modmo,這里a-b需要加一個mo保證他是正數,因為對負數取模還是負數,我在這里卡了好幾發。如果k是偶數就是ak/2modmobk/2modmoa^{k/2}\mod mo b^{k/2}\mod moak/2modmobk/2modmo就好了,用個快速冪就好了。
AC代碼:

#include <bits/stdc++.h> #define ll long long using namespace std;const ll mo = 998244353; ll qpow(ll a, ll n,ll m){ll ans = 1;while(n){if(n&1){ans = a * ans % m;}a = a * a % m;n >>= 1;}return ans; } void solve() {ll a, b, k;scanf("%lld%lld%lld",&a,&b,&k);ll x = qpow(2,k/2,mo);ll ans1, ans2;if(k%2){ans1 = (a+b)%mo*x%mo;ans2 = (a-b+mo)%mo*x%mo;printf("%lld %lld",ans1,ans2);}else{ans1 = a%mo*x%mo;ans2 = b%mo*x%mo;printf("%lld %lld",ans1,ans2);} } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout);int t;scanf("%d",&t);for(int i =1;i <= t;i++){solve();printf("\n");}return 0; }

1002 隨機題意 思維

題目地址1002 隨機題意
題意:給一個整數數組 a1,a2,?,an 和 k ,你想要找到一個最大的值 x ,使得存在另一個整數數組 b1,b2,?,bn 滿足 |ai?bi|≤k(1≤i≤n) 且 bn 中共有 x 個不同的數。
思路:給定k值后,每給一個數,對應的b值都有一個取值范圍,[ai-k,ai+k],把所有區間并到一起求區間長度就可以了。
AC代碼:

/* ** Author: ** Time: ** function: */ #include <bits/stdc++.h> #define ll long long using namespace std; struct qujian{int l,r;bool operator<(const qujian& a)const{return l > a.l;} }; void solve() {int n, k;cin >> n >> k;priority_queue<qujian> pqq;vector<qujian> vq;for(int i = 1;i <= n;i++){int a;qujian q;cin >> a;q.l = a - k;q.r = a + k;pqq.push(q);}for(int i = 1;i <= n;i++){qujian q1 = pqq.top();pqq.pop();if(pqq.empty()){vq.push_back(q1);break;}else{qujian q2 = pqq.top();if(q1.r >= q2.l){q1.r = q2.r;pqq.pop();pqq.push(q1);}else{vq.push_back(q1);}}}ll ans = 0;for(int i = 0;i < vq.size();i++){ans += vq[i].r-vq[i].l+1;}if(ans > n){cout << n << endl;}elsecout << ans << endl; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout);cin.sync_with_stdio(0);cin.tie(0);int t;cin >> t;while(t--){solve();}return 0; }

1003 魔怔 圖論 歐拉回路

題目地址1003 魔怔

參考地址 2021 年百度之星·程序設計大賽 - 初賽二 1003 魔怔(并查集,聯通性,歐拉回路)
AC代碼:

//沒補完.jpg #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 1010;int fa[maxn+10]; void init(int n){for(int i = 1; i <= n; i++)fa[i]=i;} int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} void merge(int x, int y){x=find(x);y=find(y);if(x!=y)fa[x]=y;}int e[maxn][maxn], in[maxn];int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int T; cin>>T;while(T--){memset(e,0,sizeof(e));memset(in,0,sizeof(in));int n, rt; cin>>n>>rt;int cnt = 0; init(n);for(int i = 2; i <= n; i++){string s; cin>>s;for(int j = 0; j < i-1; j++){e[i][j+1] = e[j+1][i]= s[j]-'0';if(e[i][j+1]==0){cnt++; in[i]++; in[j+1]++;//累加度數merge(i,j+1);}}}//cout<<cnt+2<<"\n";LL ans = 0, sum = 0, ok=0;map<int,int>mp;for(int i = 1; i <= n; i++){if(in[i]%2==1)ans++;sum += in[i];if(in[i]){int s = find(i);if(mp[s]==0){ok++; mp[s]=1;}}}if(sum==0){cout<<"0\n"; continue;}sum = sum/2+(ok-1)*2;if(ans>2){cout<<"-1\n"; continue;}else{if(in[rt]){//在if(in[rt]%2==0){//偶數if(ans)cout<<"-1\n";else cout<<sum<<"\n";}else{//奇數cout<<sum<<"\n";}}else{//不在if(ans==0)cout<<sum+2<<"\n";else cout<<"-1\n";}}continue;for(int i = 1; i <= n; i++){for(int j=1; j <= n; j++)cout<<e[i][j]<<" ";cout<<"\n";}}return 0; }

1004 凈化 數學,思維

1004 凈化
思路:找規律,用sumnsum_nsumn?表示前n項和,分兩種情況,sumnsum_nsumn?>0和sumnsum_nsumn?<=0
sumnsum_nsumn?>0:分兩種情況
每一個sumisum_isumi?>=0,第一輪初值為0,后面初值都每次增加sumnsum_nsumn?,注意不一定是sumnsum_nsumn?最大,可能是sumisum_isumi?
存在sumisum_isumi?小于零,將最小的sumisum_isumi?記錄下來minx,第一輪初值為零,第二輪初值為sumnsum_nsumn?-min,后面初值每次增加sumnsum_nsumn?

sumnsum_nsumn?<=0:
第一輪初值為0,第二輪初值為sumnsum_nsumn?-minx,后面每輪初值跟第二輪相同

/* ** Author: ** Time: ** function: */ #include <bits/stdc++.h> #define ll long long const int maxn = 1e5+5; using namespace std; ll sum1[maxn],sum12[maxn]; ll sum2[maxn]; int a[maxn];void solve() {int n;ll m;bool flag = false;cin >> n >> m;ll minx = 0,maxx = 0;for(int i = 1;i <= n;i++)//直接暴力求第一輪的結果{cin >> a[i];sum1[i] = sum1[i-1] + a[i];//變零sum12[i] = sum12[i-1]+a[i];//不變零if(sum1[i] < 0){sum1[i] = 0;}maxx = max(maxx,sum12[i]);if(sum1[i] >= m){flag = 1;}}if(flag){cout << 1 << endl;return;}ll ans = 0;ll b = sum1[n];//第二輪的初值是第一輪的末尾值,此后每輪增加sum12[n]if(sum12[n] > 0){if(maxx + b>=m){ans = 2;}else{ans = ceil((m - maxx - b * 1.0)/(sum12[n])) + 2;}}else{b = sum1[n];sum2[0] = b;for(int i = 1;i <= n;i++){sum2[i] = sum2[i-1] + a[i];if(sum2[i] < 0){sum2[i] = 0;}if(sum2[i] >= m){ans = 2;}}if(!ans){ans = -1;}}cout << ans << endl;memset(sum1,0,sizeof(sum1));memset(sum2,0,sizeof(sum2)); } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout);cin.sync_with_stdio(0);cin.tie(0);int t;cin >> t;while(t--){solve();}return 0; }

總結

以上是生活随笔為你收集整理的【题目记录】——2021 年百度之星·程序设计大赛 - 初赛二的全部內容,希望文章能夠幫你解決所遇到的問題。

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