AIM Tech Round 4 (Div. 2)ABCD
這一場真的是血崩,a,b都被hack,還好結束前重交都過了
A:題意:找出得到k個不同的字符,所要更改的最小字符數
題解:首先如果k>字符串長度,直接impossible,然后直接記錄一下不重復的有多少個,如果不重復的個數比k小,輸出k-不重復的個數,否則輸出0(就是這里被hack)
#include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const double g=10.0,eps=1e-7; const int N=300000+10,maxn=100+10,inf=0x3f3f3f3f3f;bool vis[30]; int main() {ios::sync_with_stdio(false);cin.tie(0);int n;string s;cin>>s>>n;int ans=0;for(int i=0;i<s.size();i++){if(!vis[s[i]-'a']){vis[s[i]-'a']=1;ans++;}}if(n>s.size())cout<<"impossible"<<endl;else cout<<max(0,n-ans)<<endl;return 0; } /****************************************/ AB:題意:給一個n*m的數字(0,1)矩陣,求能組成團的有多少(每一個團里元素值相同,而且在同一行或同一列)
題解:對每一行和每一列計算1的個數(k),這樣每一行(列)里1構成的團有(1<<k)-1個(可以分1,2,,,k)來列舉出,0構成的有(1<<(m(列就是n)-k))-1
但是最大到了(1<<50)會爆longlong(就是這里被hack了)(后來實在腦殘了直接改寫成python交上去過了,之后發現原來把1改成1ll就能過了)
n,m = input().strip().split() n = int(n) m = int(m) a = [([0]*50) for i in range(50)] for i in range(n):p=input()a[i] = p.split(' ') ans = 0 for i in range(n):k = 0for j in range(m):if a[i][j] == '1':k = k+1ans=ans+2**k-1+2**(m-k)-1 for i in range(m):k = 0for j in range(n):if a[j][i] == '1':k = k+1ans=ans+2**k-1+2**(n-k)-1 print(ans-n*m) B---python #include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const double g=10.0,eps=1e-7; const int N=50+10,maxn=1000000+10,inf=0x3f3f3f;int a[N][N]; int main() {ios::sync_with_stdio(false);cin.tie(0);ll n,m;cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];ll ans=-n*m;for(int i=1;i<=n;i++){ll k=0;for(int j=1;j<=m;j++)if(a[i][j]==1)k++;ans+=(1ll<<k)-1;ans+=(1ll<<(m-k))-1;}for(int i=1;i<=m;i++){ll k=0;for(int j=1;j<=n;j++)if(a[j][i]==1)k++;ans+=(1ll<<k)-1;ans+=(1ll<<(n-k))-1;}cout<<ans<<endl;return 0; } /****************************************/ B---c++C:題意:給定一個數列,要求對其中某些數排序,排完序之后放在對應的位置,然后每個數最多排一次,要求排的次數最多,而且排完之后整個數列遞增
題解:先對其排序,按照下標的順序去找到最小的那個團,比如3 1 2,3應該放在2的位置,那么就再取2,2應該放在1的位置那么取1,則最小團就是1,2,3
D:題意:交互題,給定一個鏈表,每次查詢時會給你當前結點的價值和下一個節點的坐標,詢問的是坐標,鏈表價值遞增,要求找到最小的大于等于x的那個價值,且詢問次數不超過2000次
題解:先生成一個隨機數組,然后訪問前1600個,找到最大的小于等于x的那個坐標,然后沿著那個坐標走,就能得到結果了(剛開始直接訪問了不隨機的前1500個導致wa了,然后隨機數種子忘了寫又wa了)srand(time(NULL));
#include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const double g=10.0,eps=1e-7; const int N=50000+10,maxn=100+10,inf=0x3f3f3f3f3f;int main() {srand(time(NULL));ios::sync_with_stdio(false);cin.tie(0);int st,n,x;cin>>n>>st>>x;vector<int>v;for(int i=0;i<n;i++)v.push_back(i+1);random_shuffle(v.begin(),v.end());int ans=-1,p=st;for(int i=0; i<min(n,1600); i++){cout<<"? "<<v[i]<<endl;cout.flush();int v,id;cin>>v>>id;if(v>ans&&v<=x){p=id;ans=v;}}while(p!=-1&&ans<x){cout<<"? "<<p<<endl;cin>>ans>>p;}if(ans<x)ans=-1;cout<<"! "<<ans<<endl;cout.flush();return 0; } /****************************************/ D?
轉載于:https://www.cnblogs.com/acjiumeng/p/7426861.html
總結
以上是生活随笔為你收集整理的AIM Tech Round 4 (Div. 2)ABCD的全部內容,希望文章能夠幫你解決所遇到的問題。