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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先上鏈接CodeCraft-21 and Codeforces Round #711 (Div. 2)
A:
從n開始往后找,不出幾十個 一定能找到的,所以暴力就好了

void sovle(){cin>>n;while(1){ll k=n;ll sum=0;while(k) sum+=k%10,k/=10;if(gcd(n,sum)>1) {cout<<n<<"\n";break;}n++;} } int main() {iosint t=1;cin>>t;while(t--){sovle();}return 0; }

B:
二分答案,然后使用優先隊列貪心,從大到小開始放,每次放都是放在剩余長度最大的那一層(好像這題 直接貪心就可以了)

#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <cstdlib> #define INF 0x3f3f3f3f3f3f3f3f #define inf 0x3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define re register #define lson rt<<1 #define rson rt<<1|1 #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); #define fi first #define rep(i,n) for(int i=0;(i)<(n);i++) #define rep1(i,n) for(int i=1;(i)<=(n);i++) #define se second #define scd(a) scanf("%d",&a) #define scdd(a,b) scanf("%d%d",&a,&b) #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c) #define ac cout<<ans<<"\n" using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pii; int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1}; const ll mod=998244353; const ll N =1e6+10; const double eps = 1e-4; //const double pi=acos(-1); ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);} ll n,w; ll a[N]; bool check(int x){priority_queue<int,vector<int>,greater<int>> q;for(int i=1;i<=x;i++) q.push(0);for(int i=n;i>=1;i--){int t=q.top();q.pop();t+=a[i];if(t>w) return 0;q.push(t);}return 1; } void sovle(){cin>>n>>w;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+n+1);int l=1,r=n;while(l<r){int mid=(l+r)/2;if(check(mid)) r=mid;else l=mid+1;}cout<<r<<"\n"; }int main() {iosint t=1;cin>>t;while(t--){sovle();}return 0; }

C: 一道顯而易見的dp題 dp【i】【k】【0/1】代表在第i個平面 輻射為k 1代表向右,0代表向左,這種狀態能產生多少粒子,具體轉移看代碼

#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <cstdlib> #define INF 0x3f3f3f3f3f3f3f3f #define inf 0x3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define re register #define lson rt<<1 #define rson rt<<1|1 #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); #define fi first #define rep(i,n) for(int i=0;(i)<(n);i++) #define rep1(i,n) for(int i=1;(i)<=(n);i++) #define se second #define scd(a) scanf("%d",&a) #define scdd(a,b) scanf("%d%d",&a,&b) #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c) #define ac cout<<ans<<"\n" using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pii; int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1}; const ll mod=1e9+7; const ll N =1e6+10; const double eps = 1e-4; //const double pi=acos(-1); ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);} ll n,k; ll dp[1100][1100][2]; ll dfs(int i,int k,int x){if(dp[i][k][x]!=-1) return dp[i][k][x];if(i==0||i==n+1) return 1;if(x==1) {if(k==1) return dp[i][k][x]=dfs(i+1,k,1)%mod;return dp[i][k][x]=(dfs(i+1,k,1)+dfs(i-1,k-1,0))%mod;}if(k==1) return dp[i][k][x]=dfs(i-1,k,0)%mod;return dp[i][k][x]=(dfs(i+1,k-1,1)+dfs(i-1,k,0))%mod; }void sovle(){cin>>n>>k;for(int i=0;i<=n+1;i++){for(int j=0;j<=k;j++){dp[i][j][0]=dp[i][j][1]=-1;}}cout<<dfs(1,k,1)<<"\n"; } int main() {// iosint t=1;cin>>t;while(t--){sovle();}return 0; }

D:dp+單調性質優化
很容易想出暴力解法:

dp【i】 代表有沒有哪一步達到i值,如果達到了,那肯定取前面的就可以了。 for(每一步){for(遍歷每個dp 1-m){if(dp【i】被更新過)for(遍歷a 從1到y){計算后面可以更新的值k,如果dp【k】沒有被更新過,則dp【k】=當前step }} }

這就是比較暴力的解法,我們可以發現每一次1到y的時候,我們只會更新它后面的值,所以我們可以每次只計算一次,用d數組來記錄 該點在此次step中被計算了多少次,如果d【i】等于y的時候 就不能再更新后面的值了。
這樣可以優化一維時間復雜度。
正解:

#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <cstdlib> #define INF 0x3f3f3f3f3f3f3f3f #define inf 0x3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define re register #define lson rt<<1 #define rson rt<<1|1 #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); #define fi first #define rep(i,n) for(int i=0;(i)<(n);i++) #define rep1(i,n) for(int i=1;(i)<=(n);i++) #define se second #define scd(a) scanf("%d",&a) #define scdd(a,b) scanf("%d%d",&a,&b) #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c) #define ac cout<<ans<<"\n" using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pii; int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1}; const ll mod=1e9+7; const ll N =1e6+10; const double eps = 1e-4; //const double pi=acos(-1); ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);} ll n,m; ll dp[N],d[N]; void sovle(){cin>>n>>m;FILL(dp,-1);ll B=1e5;dp[0]=0;for(int i=1;i<=n;i++){ll t,x,y;cin>>t>>x>>y;FILL(d,0);for(int j=0;j<=m;j++){if(dp[j]!=-1){if(d[j]==y) continue;ll k;if(t==1) k=j+(B-1+x)/B;else k=(j*x+B-1)/B;if(k>m) continue;if(dp[k]==-1) {dp[k]=i;d[k]=d[j]+1;}}}}for(int i=1;i<=m;i++) cout<<dp[i]<<" "; } int main() {// iosint t=1;// cin>>t;while(t--){sovle();}return 0; }

總結

以上是生活随笔為你收集整理的CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解的全部內容,希望文章能夠幫你解決所遇到的問題。

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