The 2024 CCPC National Invitational Contest (Northeast) ADEJ
A.PaperWatering
思路:有兩種型別的操作,對一個數開根號或平方。
平方沒有什麼問題,開根號由於是向下取整再平方就會產生不一樣的數。
那麼做法也很簡單了。
對於一個數\(x\),\(k\)步,首先它能平方往後變\(k\)步,往前能變\(min(開根能變的步數,k)\)。我們去看往前開根的數,如果它的平方不等於它的下一個數,那麼它的貢獻就是\((k-x變成它的個數)\)。
注意,如果變成了1,它將不會產生任何貢獻了。
// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
ll x,k; cin>>x>>k;
if(x == 1)
{
cout<<1<<"\n";
return 0;
}
ll tmp = x;
ll used = 0;
ll ans = k;
ll cnt = 0;
while(x != 1)
{
cnt++;
if(cnt < k && (ll)sqrt(x)*(ll)sqrt(x) != x && (ll)sqrt(x) != 1)
{
// cout<<"(ll)sqrt(x) = "<<(ll)sqrt(x)<<" k-cnt = "<<k-cnt<<"\n";
ans += (k-cnt);
}
x = (ll)sqrt(x);
// cout<<"x = "<<x<<"\n";
}
cout<<ans + min(cnt,k)+ 1ll<<"\n";
return 0;
}
這題本身難度不大,但是寫的時候還是出了問題。
一開始是認為找到第一個完全平方數就停止。其實並不是的,因為完全平方數開根之後不一定也是完全平方,所以需要看前面的所有數。
D.nIMgAME
思路:好好好,這題就充分體現了出題人的惡趣味了。一開始以為是正經博弈找規律。考慮他什麼時候能贏?寫了前幾個之後發現,都不可能贏啊,他贏的條件實在是太難了。就想難不成永遠都是lose?交一發,好好好過了。
// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int t; cin>>t;
while(t--)
{
ll n; cin>>n;
cout<<"lose\n";
}
return 0;
}
E.Checksum
思路:考慮去列舉B有i個1。總的1的個數就是\(i+cnt(A中1的個數)\)。然後去check:\(C=i+cnt\)對應的二進位制的低位k個1的個數\(D\)(如果大於k位就截掉,小於k位就補0),是否等於我們列舉的\(i\)。
// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int t; cin>>t;
while(t--)
{
ll n,k; cin>>n>>k;
int cnt = 0;
string s; cin>>s;
for(int i = 0;i < s.size(); i++)
cnt += (s[i]=='1');
string ans = "99999999999999999999";
for(int i = 0;i <= k; i++)
{
ll now = cnt+i;//十進位制B
string t = "";//二進位制低k位B
while(now && t.size() < k)
{
t += ((now&1) + '0');
now >>= 1;
}
for(int j = t.size();j < k; j++)
t += '0';
reverse(t.begin(),t.end());
int cnt1 = count(t.begin(),t.end(),'1');//二進位制B中1的個數
if(cnt1 == i)
ans = min(ans,t);
}
if(ans == "99999999999999999999")cout<<"None\n";
else cout<<ans<<"\n";
}
return 0;
}
J. Breakfast
簽到不多說。
// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
double n, m; cin>>n>>m;
printf("%.2lf\n",0.6*n+m);
return 0;
}