比赛页面:http://codeforces.com/contest/486
官方题解:http://codeforces.com/blog/entry/14678
A. Calculating Function
第3分钟AC,这手速也是拼了,虽然页面刷了1分多钟才刷出来。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<iostream> 5 #include<algorithm> 6 #include<set> 7 #include<map> 8 #include<stack> 9 #include<vector> 10 #include<queue> 11 #include<string> 12 #include<sstream> 13 #define eps 0.000001 14 #define ALL(x) x.begin(),x.end() 15 #define INS(x) inserter(x,x.begin()) 16 using namespace std; 17 typedef long long LL; 18 int i,j,k,n,m,x,y,T,ans,big,cas; 19 bool flag; 20 int main() 21 { 22 LL n,ans; 23 scanf("%I64d",&n); 24 ans=n/2; 25 if (n%2) ans-=n; 26 printf("%I64d ",ans); 27 return 0; 28 }
B. OR in Matrix
对于m行n列的01矩阵A,构造相同规格的01矩阵B,对于第i行第j列,如果A矩阵中第i行或者第j列中存在有数字1,那么B中该位置也为1,现在给出B求A。
依然是手速题,显然B中如果有0的话,A中该行该列不可能有1,因此,一开始将A全设置为1,然后如果B中第i行第j列是0,就将A中第i行和第j列的元素全设为1。到最后对求得的A再检查一次,如果合法则输出YES,不合法输出NO。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<iostream> 5 #include<algorithm> 6 #include<set> 7 #include<map> 8 #include<stack> 9 #include<vector> 10 #include<queue> 11 #include<string> 12 #include<sstream> 13 #define eps 0.000001 14 #define ALL(x) x.begin(),x.end() 15 #define INS(x) inserter(x,x.begin()) 16 using namespace std; 17 typedef long long LL; 18 int i,j,k,n,m,x,y,T,ans,big,cas,b[105][105],a[105][105]; 19 bool flag; 20 int main() 21 { 22 scanf("%d%d",&n,&m); 23 memset(b,-1,sizeof(b));//为了memset方便,全设为-1,之后将-1看成1即可 24 for (i=1;i<=n;i++) 25 { 26 for (j=1;j<=m;j++) 27 { 28 scanf("%d",&a[i][j]); 29 if (a[i][j]==0) 30 { 31 for (k=1;k<=n;k++) 32 { 33 b[k][j]=0; 34 } 35 for (k=1;k<=m;k++) 36 { 37 b[i][k]=0; 38 } 39 } 40 } 41 } 42 for (i=1;i<=n;i++) 43 { 44 for (j=1;j<=m;j++) 45 { 46 if (a[i][j]) 47 { 48 flag=false; 49 for (k=1;k<=n;k++) 50 { 51 if (b[k][j]!=0) 52 { 53 flag=true; 54 break; 55 } 56 } 57 if (!flag) 58 { 59 for (k=1;k<=m;k++) 60 { 61 if (b[i][k]!=0) 62 { 63 flag=true; 64 break; 65 } 66 } 67 } 68 if (!flag) 69 { 70 printf("NO "); 71 return 0; 72 } 73 } 74 } 75 } 76 77 printf("YES "); 78 for (i=1;i<=n;i++) 79 { 80 for (j=1;j<m;j++) 81 { 82 printf("%d ",-b[i][j]); 83 } 84 printf("%d ",-b[i][m]); 85 } 86 return 0; 87 }
C. Palindrome Transformation
给出一串小写字母,再给一个指针,一开始指向第p个元素(输入中给p),然后规定左右操作,分别为指针向左移一位和向右移一位,规定第一个元素向左是最后一个元素,最后一个元素向右是第一个元素。再规定上下操作,分别是将该位置的字母换为字母表中的上一位或者下一位,规定字母表也是循环的,即A的上一位是Z,Z的下一位是A。问至少需要多少步能将这串小写字母变成回文串。
贪心+分类讨论
其实不用模拟出指针的操作步骤。不妨假设p小于n/2(p在字符串的左半部分),设st~ed为需要修改的范围(也就是,1~st-1和ed~n/2已经和右半部分对应位置相等了)。
如果指针p不在st~ed范围内,那么首先可能要移动p到st~ed范围内,再一个一个修改,(我们所说的修改就是将p位置的字符修改成字符串右半部分对应位置的字符,这比再将指针移到右半部分修改字符更优)。那么代价=修改字符的代价(题目中所说的上下操作次数)+ed-st+将p移动到st或者ed上的最小代价。
如果指针p在st~ed范围内,当我们修改完st~p的部分的时候肯定要回过头修改p+1~ed的部分,显然可以先将p移动到st或者ed上。代价的计算方法显然与上边相同,代价=修改字符的代价(题目中所说的上下操作次数)+ed-st+将p移动到st或者ed上的最小代价。
1 /*MADE BY zhyfzy~~~~~~*/ 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 #include<set> 8 #include<map> 9 #include<stack> 10 #include<vector> 11 #include<queue> 12 #include<string> 13 #include<sstream> 14 #define eps 0.000001 15 #define ALL(x) x.begin(),x.end() 16 #define INS(x) inserter(x,x.begin()) 17 using namespace std; 18 typedef long long LL; 19 int i,j,k,n,m,x,y,T,ans,big,cas,p,st,ed,st2,ed2; 20 bool flag; 21 char s[100005]; 22 int main() 23 { 24 scanf("%d%d",&n,&p); 25 scanf("%s",s+1); 26 if (n==1) 27 { 28 printf("0 "); 29 return 0; 30 } 31 m=(n+1)/2; 32 ans=0; 33 st=1; ed=m; 34 for (i=1;i<=m;i++) 35 if (s[i]==s[n-i+1]) st++; 36 else break; 37 for (i=m;i>=1;i--) 38 if (s[i]==s[n-i+1]) ed--; 39 else break; 40 41 if (st>m) 42 { 43 printf("0 "); 44 return 0; 45 } 46 47 for (i=1;i<=m;i++) 48 { 49 j=n-i+1; 50 ans+=min(abs((int)s[i]-(int)s[j]),26-abs((int)s[i]-(int)s[j])); 51 } 52 //cout<<ans<<endl; 53 st2=n-ed+1; 54 ed2=n-st+1; 55 if (n%2) 56 { 57 ans+=ed-st; 58 if (p>m) 59 { 60 if (p>=st2&&p<=ed2) ans+=min(p-st2,ed2-p); 61 if (p<st2) ans+=st2-p; 62 if (p>ed2) ans+=p-ed2; 63 } 64 else 65 if (p<m) 66 { 67 if (p>=st&&p<=ed) ans+=min(p-st,ed-p); 68 if (p<st) ans+=st-p; 69 if (p>ed) ans+=p-ed; 70 }else 71 if (p==m) 72 { 73 ans+=m-ed2; 74 } 75 printf("%d ",ans); 76 }else 77 { 78 ans+=ed-st; 79 if (p>m) 80 { 81 if (p>=st2&&p<=ed2) ans+=min(p-st2,ed2-p); 82 if (p<st2) ans+=st2-p; 83 if (p>ed2) ans+=p-ed2; 84 }else 85 { 86 if (p>=st&&p<=ed) ans+=min(p-st,ed-p); 87 if (p<st) ans+=st-p; 88 if (p>ed) ans+=p-ed; 89 } 90 printf("%d ",ans); 91 } 92 93 return 0; 94 }
D. Valid Sets
还没有更新
E. LIS of Sequence
还没有更新