A. Keyboard
简单水水:
int n,m,tot=0;
char mp[55]={ "qwertyuiop asdfghjkl; zxcvbnm,./" };
int main()
{
//freopen("D:\data.txt","r",stdin);
int TT=1,tt=1,i=0,j=0,k=0;
//scanf("%d",&TT);
while(TT--){
char c; char s[199]; tot =strlen(mp);
scanf("%c",&c); scanf("%s",s);
if(c=='R') m= -1; else m= 1;
int l=strlen(s);
for(i=0;i<l;i++){
for(k=0;k<tot;k++){
if(mp[k]==s[i]) { printf("%c",mp[k+m]); break; }
}
}
}
return 0;
}
B. Worms
</pre><pre name="code" class="cpp">int n,m,tot=0;
int dat[100009];
int bsearch(int l,int r,int val){
//printf("find- %d %d %d\n",l,r,val);
int m;
while(l<=r){
m =(l+r)/2; //printf("m- %d xm- %d\n",m,x[m]);
if(dat[m]==val) return m;
else if(dat[m]>val) r=m-1;
else l=m+1;
}
return l; //原来为 return -1; 表示查找失败
//这里水了一下,想表示 查找到的第一个不大于val的位置;竟然过了
}
int main()
{
//freopen("D:\data.txt","r",stdin);
int TT=1,tt=1,i=0,j=0,k=0;
//scanf("%d",&TT);
while(TT--){
scanf("%d",&n); dat[0]= 0;
for(i=1;i<=n;i++){
scanf("%d",&tt); dat[i]= dat[i-1]+tt;
}
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d",&tt);
int ans =bsearch(1,n,tt);
printf("%d\n",ans);
/* 此题用如下库函数应也能解决
函数lower_bound()在first和last中的前闭后开区间进行二分查找,
返回大于或等于val的第一个元素位置。
如果所有元素都小于val,则返回last的位置,且last的位置是越界的!
lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置。
upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。
*/
}
}
return 0;
}