第一次参加codeforces比赛,只能做出来俩题,第三个题思路也就一半一半,估计是想不出来的那种,赛后问了下带佬,把我思路添加了点,最终还是A了
争取稳过第三题!
//A //统计1,-1出现的次数,然后如果-1是奇数,让他变成偶数,次数+1 //因为总乘积要是正1,然后再变-1为1,直到>=0为止,这里的-1每次都要+2,因为确保偶数性 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; int t,n,m,a[N],res; int main() { cin>>t; while(t--){ cin>>n; res=0; int num1=0,num2=0; for(int i=0;i<n;i++){ cin>>a[i]; if(a[i]<0) num2++; else num1++; } if(num2%2!=0&&num2!=0) num2--,num1++,res++; while(num1<num2) res+=2,num1+=2,num2-=2; cout<<res<<endl; } return 0; }
//B //int 128没什么用,就把两个字串串读进去,把短的字符串前导0 //然后找到第一个不相等的数,这个数和前面的数都是绝对值相减,这个数之后的都x9就可以了 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; int t; void print(__int128 num) { if(num>9) print(num/10); putchar(num%10+'0'); } int main() { cin>>t; while(t--){ string s1,s2; __int128_t res=0; cin>>s1>>s2; if(s1==s2){ cout<<0<<endl; continue; } if(s2.size()>s1.size()) swap(s1,s2); __int128_t x=s1.size()-s2.size(); __int128_t tmp=s1.size(); while(x--) s2.insert(0,1,'0'); int i=0,pos; while(s1[i]==s2[i]) i++; for(int j=0;j<=i;j++) res+=abs(s1[j]-s2[j]); res+=(9*(s1.size()-i-1)); print(res); cout<<endl; } return 0; }
//c //博弈论,如果是第二个,由于要先翻转,所以翻转统计s2的时候次数要加一,也就是在下面判断的时候更改一下 //我只想到了对s2进行变换,但是没想到s1也可以随着一起变,两者统计起来最小的次数就是最长总和 //由于alice是先手,所以两者取最小 #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+10; string s1,s2; long long t,res,n,ans; int main() { cin>>t; while(t--){ cin>>n; res=0,ans=0; cin>>s1>>s2; if(s1==s2){ cout<<0<<endl; continue; } for(int i=0;i<s2.size();i++) if(s1[i]!=s2[i]) ans++; if(ans==1){ cout<<1<<endl; continue; } reverse(s1.begin(),s1.end()); for(int i=0;i<s1.size();i++) if(s1[i]!=s2[i]) res++; if(res==0){ cout<<2<<endl; continue; } long long tmp=0x3f3f; if(ans%2==1) tmp=min(tmp,ans*2-1); else tmp=min(tmp,ans*2); if(res%2==0) tmp=min(tmp,res*2-1); else tmp=min(tmp,res*2); cout<<tmp<<endl; } return 0; }
标签:10,879,int,s2,s1,cin,Codeforces1,res,div.2 From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17490292.html