先上鏈接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()
{ios
int 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;
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()
{ios
int 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;
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()
{int 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;
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()
{int t
=1;while(t
--){sovle();}return 0;
}
總結
以上是生活随笔為你收集整理的CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。