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 }
可用Floyd算法求解最小环。
看见别人有用bfs的,先存一下
1 #include <iostream> 2 #include <cstring> 3 #include <vector> 4 #include <queue> 5 6 const int N = 1e5 + 10; 7 std::vector<int> d(N, -1); 8 std::vector<int> p(N, -1); 9 10 std::vector<int> g[N]; 11 12 void bfs(int v, int &ans) { 13 std::fill(d.begin(), d.end(), -1); 14 std::fill(p.begin(), p.end(), -1); 15 16 std::queue<int> q; 17 q.push(v); 18 19 d[v] = 0; 20 21 while(!q.empty()) { 22 int v = q.front(); 23 q.pop(); 24 25 for(int i = 0; i < g[v].size(); ++i) { 26 int to = g[v][i]; 27 if(d[to] == -1) { 28 d[to] = d[v] + 1; 29 p[to] = v; 30 q.push(to); 31 } else if(p[v] != to) { 32 ans = std::min(ans, d[v] + d[to] + 1); 33 return; 34 } 35 36 } 37 38 } 39 40 } 41 42 signed main() { 43 44 int n; 45 std::cin >> n; 46 47 std::vector<int> cnt(66, 0); 48 std::vector<long long> a; 49 for(int i = 0; i < n; ++i) { 50 long long x; std::cin >> x; 51 if(x) a.push_back(x); 52 for(int j = 0; j < 64; ++j) { 53 if((x >> j) & 1) { 54 cnt[j]++; 55 } 56 } 57 } 58 59 for(int i = 0; i < 66; ++i) { 60 if(cnt[i] >= 3) { 61 std::cout << 3 << std::endl; 62 return 0; 63 } 64 } 65 66 for(int i = 0; i < a.size(); ++i) { 67 for(int j = i + 1; j < a.size(); ++j) { 68 if(a[i] & a[j]) { 69 g[i].push_back(j); 70 g[j].push_back(i); 71 } 72 } 73 } 74 75 int ans = 20282028; 76 for(int i = 0; i < a.size(); ++i) { 77 bfs(i, ans); 78 } 79 80 if(ans == 20282028) { 81 std::cout << -1 << std::endl; 82 } else { 83 std::cout << ans << std::endl; 84 } 85 86 87 return 0; 88 }