A
思路+題意:就是除了第一層有兩個單元的話,其余的樓層都有x個單元,自己動手推一推就知道了,然后就是取余跟做除,看看在當前這層,還是下一層,不要忘了 加上第一層,
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
if(n == 1 || n==2 ){
cout<<"1"<<endl;
continue;
}
else{
if(x==1){
cout<<n-1<<endl;
continue;
}
else{
int res = n - 2;
int tot = res/x;
int ans = res % x;
if(ans == 0){
cout<<1 + tot<<endl;
}
else{
cout<<2+tot<<endl;
}
}
}
}
return 0;
}
B
題意 + 思路:就是讓你求一個矩陣關于主對角線對稱,那么就是小矩陣的左下角跟右上角一樣就行了,自己推一推,
然后大矩陣還必須是偶數的,這樣子就行了,
#include<bits/stdc++.h>
using namespace std;
int a[5][5];
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
bool flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=2;j++){
for(int k=1;k<=2;k++){
cin>>a[j][k];
}
}
if(a[2][1] == a[1][2]) flag = 1;
//cout<<flag<<endl;
}
if(m%2==0 && flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
C
題意 + 思路:
就是給你兩個操作,一個是可以對序列選定的一個數 + 1,一個是對序列進行賦值加到當前序列,問你大于等于n至少需要多少次,然后我們就是列舉 +1即操作一的次數,然后這個時候看操作二要復制多少次才能>=n,然后我們維護跟新最小值就行,開到根號n就行了,
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int ans = n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans = min(ans,i-1+n/i);
}
else{
ans = min(ans,i-1+n/i+1);
}
}
ans--;
cout<<ans<<endl;
}
return 0;
}
D
題意 + 思路:就是給你一個序列,然后讓任意子序列和不為 0 ,那么我們首先肯定寫個前綴和!,然后呢?我們思考,如果一個區間和 為 0 ,然后我們在右端點左邊 加入一個無窮大的值,那么這個時候就相當于加入這個趾艚墟的子區間肯定不為 0了,所以就相當于一個新的前綴和從右端點開始的,如此回圈模擬,得到最少插入次數,
include<bits/stdc++.h>
#define maxn 200005
using namespace std;
typedef long long ll;
ll a[maxn],sum[maxn];
set<ll> s;
int tot = 0;
ll temp = 0;
int main(){
ll n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
sum[i] = sum[i-1]+a[i];
}
for(int i=0;i<=n;i++){
if(!s.count(sum[i]-temp)) s.insert(sum[i]-temp);
else{
tot++;
s.clear();
s.insert(0);
s.insert(a[i]);
temp = sum[i-1];
}
}
cout<<tot<<endl;
return 0;
}
E
題意 + 思路:就是石頭剪刀布卡片若干 兩個人博弈,數目不一樣,然后讓你求自己贏的最多的次數跟贏的最少的次數,贏的最好就是讓自己去贏就行了,贏的最少的話就是平局讓對面贏,然后最后迫不得已了讓自己再贏,
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll a[10];
ll b[10];
int main(){
ll n;
cin>>n;
for(int i=1;i<=3;i++){
cin>>a[i];
}
for(int i=1;i<=3;i++){
cin>>b[i];
}
ll tot = 0;//就讓自己贏最多
a[1] >= b[2] ? tot+=b[2]:tot+=a[1];
a[2] >= b[3] ? tot+=b[3]:tot+=a[2];
a[3] >= b[1] ? tot+=b[1]:tot+=a[3];
ll to =0;//盡量平局然后讓對方贏自己,
ll a1=0,a2=0,a3=0,b1=0,b2=0,b3=0;
ll aa1=0,aa2=0,aa3=0;//存下平局跟輸的
if(a[2] - b[1] -b[2] > 0){
aa2 = (a[2]-b[1]-b[2]);
}
ans = min(ans,aa2);
if(a[1] - b[1] - b[3] >0){
aa1 = (a[1]-b[1]-b[3]);
}
ans = min(ans,aa1);
if(a[3] - b[3] -b[2] >0){
aa3 =(a[3] - b[3]-b[2]);
}
to = aa1+aa2+aa3;
cout<<to<<" "<<tot<<endl;
return 0;
}
F
題意 + 思路:就是“?”可以改成 a ,b,c,然后讓求abc的個數,模擬這個程序然后暴力即可,
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5, mod = 1e9 + 7;
int n, m, _, k;
char s[N];
ll a[20], ans = 0;
int qpow(ll a, ll b) {
ll ans = 1; a %= mod;
for (; b; a = a * a % mod, b >>= 1)
if (b & 1) ans = ans * a % mod;
return ans;
}
int main() {
cin >> n;
cin >> s + 1;
for(int i=0;i<n;i++)
if (s[i] == 'a') ++a[1];
else if (s[i] == 'b') {
a[3] += a[1];
a[5] += a[2];
} else if (s[i] == 'c') {
a[7] += a[3];
a[9] += a[4];
a[10] += a[5];
a[13] += a[6];
} else {
a[14] += a[6];
a[12] += a[5];
a[11] += a[4];
a[8] += a[3];
a[6] += a[2];
a[4] += a[1];
++a[2];
}
if (a[7]) ans = a[7] % mod * qpow(3, a[2]) % mod;
if (a[8]) ans = (ans + a[8] % mod * qpow(3, a[2] - 1) % mod) % mod;
if (a[9]) ans = (ans + a[9] % mod * qpow(3, a[2] - 1) % mod) % mod;
if (a[10]) ans = (ans + a[10] % mod * qpow(3, a[2] - 1) % mod) % mod;
if (a[11]) ans = (ans + a[11] % mod * qpow(3, a[2] - 2) % mod) % mod;
if (a[12]) ans = (ans + a[12] % mod * qpow(3, a[2] - 2) % mod) % mod;
if (a[13]) ans = (ans + a[13] % mod * qpow(3, a[2] - 2) % mod) % mod;
if (a[14]) ans = (ans + a[14] % mod * qpow(3, a[2] - 3) % mod) % mod;
cout << ans;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/144447.html
標籤:其他
上一篇:改良版無邊界貪吃蛇(c語言做)
下一篇:CodeForces - 1426E Rock, Paper, Scissors(最小費用最大流+最大費用最大流)
