比賽:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324) A-same 1.常規方法 int main() { int n; cin >> n; vector<int> s(n) ...
比賽:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324)
A-same
1.常規方法
int main()
{
int n;
cin >> n;
vector<int> s(n);//利用vector容器可以不需要確定記憶體大小
for (auto &n : s)
{
cin >> n;
}
for (int i = 0; i < n - 1; i++)
{
if (s[i] != s[i + 1])
{
cout << "No" << endl;
return 0;//如果不相等就直接退出程式,否則輸出"Yes"
}
}
cout << "Yes" << endl;
return 0;
}
總結:
1.對於這類數組大小動態變化的題目,利用vector容器,就可以動態的改變數組的大小,不需要去確定數組大小,比較方便
2.再main函數中去寫,利用return 0;隨時退出程式,結束迴圈。就不需要考慮利用其它變數,在迴圈結束後再去判斷輸出內容
3.利用auto &n : s;輸入數據,簡化代碼量(auto缺點:必須遍歷完整個容器,無法遍歷到某一中間值然後就退出)
2.a faster way
int main()
{
int n, s;
cin >> n >> s;
for (int i = 0; i < n - 1; i++)
{
int s2;
cin >> s2;
if (s2 != s)
{
cout << "No" << endl;
return 0;
}
}
cout << "Yes" << endl;
return 0;
}
總結:
在輸入時就做出判斷。先輸入第一個數,然後通過迴圈,在每次輸入數據時就做出判斷,就不需要遍曆數組了
其餘同常規方法
B - 3-smooth Numbers
1.數學基礎
題目中對x,y的限制是整數,但由於給定的數字N>=1,所以並不需要考慮x,y<0,(即if (x<0||y<0);N<1;),proof is under:
1.if we assume that x<0 and y<0,then
0 < N = 2x*3y<1.
so x<0 and y<0 is not satisfied this condition.
2.if we assume that x>0 and y<0,then
N*2xϵ(2k,kϵZ);
3xϵ(2k+1,kϵZ)
it is obvious that equation is fause.in a similar way,if we assume y>0 and x<0,
the equation is fause still.
therefore we have shown if (x<0||y<0),N<1.
2.代碼實現
void test01()
{
long long N;//根據所給數據點,需要用long long 來儲存
cin >> N;
while (N % 3 == 0)//如果是3的倍數,就除3
{
N /= 3;
}
while (N % 2 == 0)//同理
{
N /= 2;
}
if (N == 1)最後只有1和其他兩種情況
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
總結:利用while,避免了利用for迴圈的複雜
C - Error Correction
思路:根據題目的操作,可以用輸入的string的長度將輸入的字元串分為三類,根據三種情況分別進行討論
void test01()
{
long long n,time = 0,k[999999],q = 0;//註意數據範圍
cin >> n;
string t,s;
cin.get();//char ch = getchar();//前面接收了一個數字,緩衝區中還有一個空格,需要清除
getline(cin, t);//利用getline(cin,變數名)去接收一個含有空格的字元串
for (int i = 0; i < n; i++)
{
getline(cin, s);
//如果兩string長度相等,那麼有兩種情況,相等和更改一個字元
if (t.size() == s.size())
{
int a = 2;//利用a去判斷有幾個字元是不相等的
for (int j = 0; j < t.size(); j++)
{
//根據題意,最多有一個字元不相等,所以當a==0時,即兩個點不相等,就退出
if (a == 0)
{
break;
}
if (t[j] != s[j])//不相等就a--
{
a--;
}
//當迴圈將要結束時,判斷是否滿足條件
//為防止最後一位才不滿足條件,所以要加上a>=1
if (j == t.size() - 1&& a >= 1)
{
time++;//次數加1
k[q] = i + 1;//將下標輸入數組中
q++;//數組位置後移
}
}
}
//如果t的長度大於s,那麼只能是刪除了一個字元
else if(t.size() == s.size()+1)
{
int l = 2;
//用h,j分別控制t和s後移
for (int j = 0,h = 0; j < t.size();h++, j++)
{
if (l == 0)
{
break;
}
if (t[j] != s[h])
{
l--;
//如果到了不相同的那一位,就令s該位不動,j++,然後令s和t的下一位進行比較
h--;
}
if (j == t.size() - 1 && l == 1)
{
time++;
k[q] = i + 1;
q++;
}
}
}
//這種情況同第二種
else if (t.size() == s.size()-1)
{
int m = 2;
for (int j = 0, h = 0; j < t.size(); h++, j++)
{
if (m == 0)
{
break;
}
if (t[j] != s[h])
{
m--;
j--;
}
if (j == t.size() - 1 && m>= 1)
{
time++;
k[q] = i + 1;
q++;
}
}
}
}
//正常輸出
cout << time << endl;
for (int i = 0; i < q; i++)
{
cout << k[i] << ' ';
}
}
D - Square Permutation
思路:題目中說明最終要得到的數是一個完全平方數,那就列舉10000000以內的平方數,看他們是否可以由輸入的四個數字經過全排列得到
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <ctype.h>
#include <ctime>
#include <stack>
#include <list>
#include <queue>
#include <algorithm>
using namespace std;
//n:輸入的數字個數,bug:儲存輸入數字中含有數字1-9的個數,dig:儲存完全平方數中含有數字1-9的個數,ans:結果
int n, dig[10], bug[10],ans;
string s;
int main()
{
ios::sync_with_stdio(false);
cin >> n >> s;//因為輸入的各個數據是連續輸入,所以用字元串進行儲存
for (int i = 0; i < n; i++)
{
bug[s[i]%48]++;//利用ASCII將每一個字元轉化為數字
}
//因為數據上限是10的13次方,所以迴圈到10的7次就結束迴圈
for (int i = 0; i < 10000000; i++)
{
memset(dig, 0, sizeof(dig));//初始化dig數組為0
//利用i*i構建完全平方數
//(1)因為數據上限超出int類型,所以用long long 去儲存
//(2)為防止數據越界,所以先將i轉化為long long 類型,然後再進行計算
//(3)註意要先將i轉化為long long 類型,所以要用1ll*i*i,而不是i*i*1ll;
//第二種方式在計算i*i時就已經炸掉了,這時再去轉化為long long 類型就已經沒用了
long long x = 1ll*i * i;
//下麵去獲取每一位數字
/*這裡有一個細節,我預設的位數就是字元串的長度,所以當x的長度小於預設位數時,就會多記錄0的個數,然而因為數字位數不相等時結論肯定不成立,所以該種情況並不需要特殊考慮*/
for (int j = 0; j <n; j++)
{
dig[x % 10]++;
x /= 10;
}
if (x)continue;//if(x!=0)也就是x不等於0,就不去進行下麵的判斷
for (int k = 0; k < 10; k++)
{
if (dig[k] != bug[k])
{
ans--;//如果不滿足,就ans--;使ans的值不被改變
break;
}
}
ans++;//如果上面的迴圈不退出迴圈,也就是相等,就對ans++
}
cout << ans << endl;
return 0;
}