http://codeforces.com/contest/234
做出来三题。第一题感觉不难,但是一直想不到好的做法。就先做了B,C。B很简单。C想到了也很简单。。
记录下做法:
A:感觉我的应该算作贪心。。。不知道是不是想复杂了。我是这么想的,要不是L多余R,要不是R多余L。于是可以先把左右位置确定下来,再判断是否满足左右相差大于1。
假如不大于1的话。比如 3 4.那么右边除了2以外。其他的都可以代替4。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <queue> 7 #include <stack> 8 using namespace std; 9 10 #define MAXN 110 11 int n; 12 char s[110]; 13 14 15 int main() 16 { 17 //freopen("input.txt","r",stdin); 18 //freopen("output.txt","w",stdout); 19 while(cin>>n) 20 { 21 cin>>s; 22 int left[MAXN]; 23 int right[MAXN]; 24 int le,re; 25 queue<int>L; 26 while(!L.empty()) 27 L.pop(); 28 queue<int>R; 29 while(!R.empty()) 30 R.pop(); 31 for(int i=0;i<n;i++) 32 if(s[i]=='L') 33 L.push(i+1); 34 else 35 R.push(i+1); 36 le=0; 37 re=0; 38 while(le<n/2) 39 { 40 if(L.empty()) 41 break; 42 left[le++]=L.front(); 43 L.pop(); 44 } 45 while(!L.empty()) 46 { 47 right[re++]=L.front(); 48 L.pop(); 49 } 50 while(le<n/2) 51 { 52 if(R.empty()) 53 break; 54 left[le++]=R.front(); 55 R.pop(); 56 } 57 while(!R.empty()) 58 { 59 right[re++]=R.front(); 60 R.pop(); 61 } 62 sort(left,left+(n/2)); 63 sort(right,right+(n/2)); 64 for(int i=0;i<(n/2);i++) 65 { 66 if(abs(left[i]-right[i])<=1) 67 { 68 if(abs(left[i]-right[(i+1)%(n/2)])<=1) 69 { 70 int t=right[i]; 71 right[i]=right[(i+2)%(n/2)]; 72 right[(i+2)%(n/2)]=t; 73 } 74 else 75 { 76 int t=right[i]; 77 right[i]=right[(i+1)%(n/2)]; 78 right[(i+1)%(n/2)]=t; 79 } 80 } 81 } 82 for(int i=0;i<(n/2);i++) 83 cout<<left[i]<<" "<<right[i]<<endl; 84 85 } 86 return 0; 87 }
B:排序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <queue> 7 #include <stack> 8 using namespace std; 9 10 struct node 11 { 12 int id; 13 int light; 14 }; 15 node lie[1010]; 16 int n,k; 17 bool cmp(const node & a,const node &b) 18 { 19 return a.light>b.light; 20 } 21 22 int main() 23 { 24 freopen("input.txt","r",stdin); 25 freopen("output.txt","w",stdout); 26 while(~scanf("%d%d",&n,&k)) 27 { 28 for(int i=1;i<=n;i++) 29 { 30 scanf("%d",&lie[i].light); 31 lie[i].id=i; 32 } 33 sort(lie+1,lie+n+1,cmp); 34 printf("%d\n",lie[k].light); 35 printf("%d",lie[1].id); 36 for(int i=2;i<=k;i++) 37 printf(" %d",lie[i].id); 38 printf("\n"); 39 } 40 return 0; 41 }
C:
int sum[MAXN];表示从2->i的这些数中>=0的有多少
int sum2[MAXN];表示从n-1->i的这些数中<=0的有多少。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <queue> 7 #include <stack> 8 using namespace std; 9 10 #define MAXN 100010 11 int n,ans; 12 int num[MAXN]; 13 int sum[MAXN]; 14 int sum2[MAXN]; 15 int main() 16 { 17 //freopen("input.txt","r",stdin); 18 // freopen("output.txt","w",stdout); 19 while(scanf("%d",&n) != EOF) 20 { 21 ans=MAXN; 22 int cnt=0; 23 memset(sum,0,sizeof(sum)); 24 memset(sum2,0,sizeof(sum2)); 25 scanf("%d",&num[1]); 26 for(int i=2;i<n;i++) 27 { 28 scanf("%d",&num[i]); 29 sum[i]=sum[i-1]; 30 if(num[i]>=0) 31 sum[i]++; 32 } 33 scanf("%d",&num[n]); 34 for(int i=n-1;i>=2;i--) 35 { 36 sum2[i]=sum2[i+1]; 37 if(num[i]<=0) 38 sum2[i]++; 39 } 40 ans=MAXN*100; 41 for(int i=1;i<=n-1;i++) 42 { 43 if(sum[i]+sum2[i+1]<ans) 44 ans=sum[i]+sum2[i+1]; 45 } 46 if(num[1]>=0) 47 ans++; 48 if(num[n]<=0) 49 ans++; 50 printf("%d\n",ans); 51 } 52 return 0; 53 }