Educational Codeforces Round 42 (Rated for Div. 2)[A,B,C]【B题:暴力+贪心】【C题:暴力】【D题:思维+暴力【好】】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 int vis[30]; 6 int f(int x,int y){ 7 int s=1; 8 while(y){ 9 if(y%2){ 10 s*=x; 11 } 12 x=x*x; 13 y/=2; 14 } 15 return s; 16 } 17 int arr[561654]; 18 signed main(){ 19 int n; 20 cin>>n;int s=0; 21 for(int i=1;i<=n;i++){ 22 cin>>arr[i]; 23 s+=arr[i]; 24 } 25 int add=0;int t=s/2; 26 if(s%2) 27 t++; 28 for(int i=1;i<=n;i++){ 29 add+=arr[i]; 30 if(add>=t){ 31 cout<<i;return 0; 32 } 33 } 34 return 0; 35 }
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 int arr[666666]; 6 map<int,int> vis; 7 signed main(){ 8 int n,a,b; 9 cin>>n>>a>>b; 10 string str; 11 cin>>str; 12 int cnt=0; 13 int sum=0; 14 for(int i=0;i<n+1;i++){ 15 if(str[i]=='.'){ 16 sum++; 17 }else{ 18 if(sum) 19 arr[cnt++]=sum; 20 sum=0; 21 } 22 } 23 if(!cnt) { 24 cout<<"0"; 25 return 0; 26 } 27 int A=a; 28 int B=b; 29 int f=0; 30 for(int k=0;k<cnt;k++){ 31 if(a>b) f=1; 32 else f=0; 33 int cnt=0; 34 for(int i=0;i<arr[k];i++){ 35 cnt++; 36 if(f){ 37 if(cnt%2==1&&a>0){ 38 a--; 39 }else if(cnt%2==0&&b>0){ 40 b--; 41 } 42 }else{ 43 if(cnt%2==1&&b>0){ 44 b--; 45 }else if(cnt%2==0&&a>0){ 46 a--; 47 } 48 } 49 } 50 } 51 int ans=(A-a)+(B-b); 52 cout<<ans; 53 return 0; 54 }
思路:每次删除一些数,让删除了这些数之后,剩下的数能够是平方数,即x^2=y这种。因为数最大为2*10^9,只有10位,所以只用枚举10位数,把所有的可能枚举出来,然后转化为数字,再判断是否为平方数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 #define N 11 5 int arr[N]; 6 signed main(){ 7 string str; 8 cin>>str; 9 int len=str.size(); 10 for(int ans=0;ans<len;ans++){ 11 memset(arr,1,sizeof(arr)); 12 for(int i=0;i<ans;i++) arr[i]=0; 13 int F=1; 14 do{ 15 int f=1;int temp=0; 16 for(int i=0;i<str.size();i++){ 17 if(arr[i]){ 18 temp=str[i]-'0';break; 19 } 20 } 21 if(temp==0) f=0; 22 if(f){ 23 int sum=0; 24 for(int i=0;i<str.size();i++){ 25 if(arr[i]) sum=sum*10+(str[i]-'0'); 26 } 27 int T=(int)sqrt(sum*1.00); 28 if(T*T==sum){ 29 cout<<ans; 30 return 0; 31 } 32 } 33 }while(next_permutation(arr,arr+len)); 34 } 35 cout<<"-1"; 36 return 0; 37 }
题目大意:给定一串正整数,至少有两个相同的数。重复做以下操作:
找到相同的,最先出现的,最小的,两个数,把位置在前面的数去掉,位置排在后面的那个数翻倍。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 #define N 6666666 5 int arr[N]; 6 map<int,int> vis; 7 map<int,int> mp; 8 signed main(){ 9 int n; 10 cin>>n; 11 for(int i=1;i<=n;i++) cin>>arr[i]; 12 for(int i=1;i<=n;i++){ 13 if(!vis[arr[i]]){ 14 vis[arr[i]]=i; 15 }else{ 16 if(vis[arr[i]]){ 17 mp[vis[arr[i]]]=1; 18 vis[arr[i]]=0; 19 arr[i]=arr[i]*2; 20 while(vis[arr[i]]){ 21 mp[vis[arr[i]]]=1; 22 vis[arr[i]]=0; 23 arr[i]=arr[i]*2; 24 } 25 vis[arr[i]]=i; 26 } 27 } 28 } 29 int sum=0; 30 for(int i=1;i<=n;i++){ 31 if(!mp[i]) 32 sum++; 33 //cout<<arr[i]<<" "; 34 } 35 cout<<sum<<'\n'; 36 for(int i=1;i<=n;i++){ 37 if(!mp[i]) 38 cout<<arr[i]<<" "; 39 } 40 return 0; 41 }