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 } 
posted @ 2020-01-16 13:03  pengge666  阅读(120)  评论(0编辑  收藏  举报