http://codeforces.com/contest/1206
第一次rating,之前几次都是赛后补题。时间实在有点晚,打完差不多24点了,一觉醒来判后A了3道,却掉了59分,不是很懂计分规则。
主要是B题WA了4发太伤了。
给定两个数组,各选其中一个元素使得其和不属于任意一个数组。
排序,找两个元素的最大值即可。(注意到数组中的元素大于等于1)
1 #include<iostream> 2 #include<sstream> 3 #include<fstream> 4 #include<algorithm> 5 #include<cstring> 6 #include<iomanip> 7 #include<cstdlib> 8 #include<cctype> 9 #include<vector> 10 #include<string> 11 #include<cmath> 12 #include<ctime> 13 #include<stack> 14 #include<queue> 15 #include<map> 16 #include<set> 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define random(a,b) (rand()%(b-a+1)+a) 19 #define ll long long 20 #define ull unsigned long long 21 #define e 2.71828182 22 #define Pi acos(-1.0) 23 #define ls(rt) (rt<<1) 24 #define rs(rt) (rt<<1|1) 25 #define lowbit(x) (x&(-x)) 26 using namespace std; 27 const int MAXN=105; 28 int a[MAXN],b[MAXN]; 29 int read() 30 { 31 int s=1,x=0; 32 char ch=getchar(); 33 while(!isdigit(ch)) {if(ch==‘-‘) s=-1;ch=getchar();} 34 while(isdigit(ch)) {x=10*x+ch-‘0‘;ch=getchar();} 35 return x*s; 36 } 37 int main() 38 { 39 int n=read(); 40 for(int i=1;i<=n;++i) 41 a[i]=read(); 42 int m=read(); 43 for(int i=1;i<=m;++i) 44 b[i]=read(); 45 46 sort(a+1,a+n+1); 47 sort(b+1,b+m+1); 48 49 cout<<a[n]<<‘ ‘<<b[m]<<endl; 50 51 }
给定一个序列,每次操作使得一个数加一或减一使得序列中元素的乘积为1,求最少操作数。
分情况讨论,正数的个数是0、奇数还是偶数,负数的个数是0、奇数还是偶数,0的个数是否为0
出的bug有:考虑不全面,复制前面部分代码忘修改。
这是当时交的代码,缝缝补补太难看了。以后注意判断一下0和偶数的情况。
1 #include<iostream> 2 #include<sstream> 3 #include<fstream> 4 #include<algorithm> 5 #include<cstring> 6 #include<iomanip> 7 #include<cstdlib> 8 #include<cctype> 9 #include<vector> 10 #include<string> 11 #include<cmath> 12 #include<ctime> 13 #include<stack> 14 #include<queue> 15 #include<map> 16 #include<set> 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define random(a,b) (rand()%(b-a+1)+a) 19 #define ll long long 20 #define ull unsigned long long 21 #define e 2.71828182 22 #define Pi acos(-1.0) 23 #define ls(rt) (rt<<1) 24 #define rs(rt) (rt<<1|1) 25 #define lowbit(x) (x&(-x)) 26 using namespace std; 27 const int MAXN=1e5+5; 28 const int INF=0x7fffffff; 29 ll read() 30 { 31 ll s=1,x=0; 32 char ch=getchar(); 33 while(!isdigit(ch)) {if(ch==‘-‘) s=-1;ch=getchar();} 34 while(isdigit(ch)) {x=10*x+ch-‘0‘;ch=getchar();} 35 return x*s; 36 } 37 int main() 38 { 39 ll n=read(); 40 ll z=0,f=0,o=0; 41 ll t; 42 ll sumz=0,sumf=0; 43 ll minz=INF,minf=INF; 44 for(int i=1;i<=n;++i) 45 { 46 t=read(); 47 if(t>0) z++,sumz+=t,minz=t<minz?t:minz; 48 else if(t==0) o++; 49 else f++,sumf+=-t,minf=min(minf,-t); 50 } 51 52 ll ans=0; 53 if(z==0&&f!=0) 54 { 55 if(f%2==1) 56 { 57 if(o==0) ans=sumf-f+2; 58 else ans=sumz-z+sumf-f+o; 59 } 60 else 61 { 62 ans=sumf-f+o; 63 } 64 } 65 else if(f==0&&z!=0) 66 { 67 ans=sumz-z+o; 68 } 69 else if(z%2==0&&f%2==0) 70 { 71 ans=sumz-z+sumf-f+o; 72 } 73 else if(z%2==1&&f%2==1) 74 { 75 if(o==0) 76 { 77 /*ans= sumz-minz-(z-1)+sumf-minf-(f-1); 78 if(minz+1<minf+1) 79 ans+= minz+1+minf-1; 80 else ans+= minz-1+minf+1;*/ 81 ans=sumz+sumf-z-f+2; 82 } 83 else if(o%2==0) 84 { 85 ans=sumz-z+sumf-f+o; 86 } 87 else 88 { 89 ans=sumz-z+sumf-f+o; 90 } 91 } 92 93 else if(z%2==1&&f%2==0) 94 { 95 if(o==0) 96 { 97 //ans=sumz-z+sumf-minf-(f-1)+minf+1; 98 ans=sumz-z+sumf-f+2; 99 } 100 else 101 { 102 ans=sumz-z+sumf-f+o; 103 } 104 } 105 else 106 { 107 if(o==0) 108 { 109 ans=sumz-z+sumf-f+2; 110 111 } 112 else 113 { 114 ans=sumz-z+sumf-f+o; 115 } 116 } 117 cout<<ans<<endl; 118 return 0; 119 }
修改:
1 #include<iostream> 2 #include<sstream> 3 #include<fstream> 4 #include<algorithm> 5 #include<cstring> 6 #include<iomanip> 7 #include<cstdlib> 8 #include<cctype> 9 #include<vector> 10 #include<string> 11 #include<cmath> 12 #include<ctime> 13 #include<stack> 14 #include<queue> 15 #include<map> 16 #include<set> 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define random(a,b) (rand()%(b-a+1)+a) 19 #define ll long long 20 #define ull unsigned long long 21 #define e 2.71828182 22 #define Pi acos(-1.0) 23 #define ls(rt) (rt<<1) 24 #define rs(rt) (rt<<1|1) 25 #define lowbit(x) (x&(-x)) 26 using namespace std; 27 const int MAXN=1e5+5; 28 const int INF=0x7fffffff; 29 ll read() 30 { 31 ll s=1,x=0; 32 char ch=getchar(); 33 while(!isdigit(ch)) {if(ch==‘-‘) s=-1;ch=getchar();} 34 while(isdigit(ch)) {x=10*x+ch-‘0‘;ch=getchar();} 35 return x*s; 36 } 37 int main() 38 { 39 ll n=read(); 40 ll z=0,f=0,o=0; 41 ll t; 42 ll sumz=0,sumf=0; 43 for(int i=1;i<=n;++i) 44 { 45 t=read(); 46 if(t>0) z++,sumz+=t; 47 else if(t==0) o++; 48 else f++,sumf+=-t; 49 } 50 51 ll ans=0; 52 53 //先这样吧,头疼 54 if(z==0&&f!=0) 55 { 56 if(f%2==1&&o==0) ans=sumz-z+sumf-f+2; 57 else ans=sumz-z+sumf-f+o; 58 } 59 else if(f==0&&z!=0) 60 { 61 ans=sumf-f+sumz-z+o; 62 } 63 else if(z%2==0&&f%2==0) 64 { 65 ans=sumz-z+sumf-f+o; 66 } 67 else 68 { 69 if(o==0) 70 ans=sumz-z+sumf-f+2; 71 else 72 ans=sumz-z+sumf-f+o; 73 } 74 cout<<ans<<endl; 75 return 0; 76 }
给定一个n,找到一个1~2n的(环状)排列使得任意连续n个数的和的差值不超过1 。
也就是说该环状排列中连续n个数的和只有两种可能,出现第三种数则不满足。
一开始想暴力找规律的,浪费挺多时间,其实画一下图就能想明白了:
令第1位摆1,那么第n+1位一定要摆2,因为第1到第n位的和 与 第2到n+1位的和 的差值就是第1位和第n+1位的差值,所以第n+1位一定只能摆2;
然后摆3,要么摆第2位要么摆第n+2位,但是摆第2位时,和会出现第三种数(手动模拟一下很容易发现)。因此3只能摆第n+2为,相应地4摆第2位;
然后5摆第3位,6摆第n+3位;
然后7摆第n+4位,8摆第4位;
....
还可以发现一个规律,上述这样操作,n是偶数的时候 第n+2位到第1位的和 会是第三个值,即不满足条件。
1 #include<iostream> 2 #include<sstream> 3 #include<fstream> 4 #include<algorithm> 5 #include<cstring> 6 #include<iomanip> 7 #include<cstdlib> 8 #include<cctype> 9 #include<vector> 10 #include<string> 11 #include<cmath> 12 #include<ctime> 13 #include<stack> 14 #include<queue> 15 #include<map> 16 #include<set> 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define random(a,b) (rand()%(b-a+1)+a) 19 #define ll long long 20 #define ull unsigned long long 21 #define e 2.71828182 22 #define Pi acos(-1.0) 23 #define ls(rt) (rt<<1) 24 #define rs(rt) (rt<<1|1) 25 #define lowbit(x) (x&(-x)) 26 using namespace std; 27 const int MAXN=1e5+5; 28 ll a[MAXN<<1]; 29 ll read() 30 { 31 ll s=1,x=0; 32 char ch=getchar(); 33 while(!isdigit(ch)) {if(ch==‘-‘) s=-1;ch=getchar();} 34 while(isdigit(ch)) {x=10*x+ch-‘0‘;ch=getchar();} 35 return x*s; 36 } 37 int main() 38 { 39 int n=read(); 40 if(n%2==0) 41 { 42 puts("NO"); 43 return 0; 44 } 45 int cur=0; 46 for(int i=1;i<=n;++i) 47 { 48 if(i%2==1) 49 { 50 a[i]=++cur; 51 a[n+i]=++cur; 52 } 53 else 54 { 55 a[n+i]=++cur; 56 a[i]=++cur; 57 } 58 } 59 puts("YES"); 60 for(int i=1;i<=2*n;++i) 61 cout<<a[i]<<‘ ‘; 62 63 }
Codeforces Round #580 (Div. 2)
原文:https://www.cnblogs.com/wangzhebufangqi/p/11375673.html