又一次测试题

16 篇文章 0 订阅
7 篇文章 0 订阅

循环移动

给出一个字符串 S 与 N 个操作。每个操作用三元组(L, R, K)进行描述:操作将字 符串第 L 个到第 R 个位置构成的子串循环移动 K 次。一次循环移动就是将字符 串最后的这个字符移动到第一位,其余的字符顺次后移。
例如,对于字符串 abacaba,操作(L=3, R=6, K=1)后得到的字符串即为 abbacaa。 求出在 N 个操作后得到的字符串。

这个题模拟就行,第一次交的时候,调试的没保存
太尴尬了,机房的编译器有问题。。
总是保存不下来。。。

#include<cstdio>
#include<cstring>
using namespace std;
char a[31000],b[31000];
int n;
int main(){
    freopen("cyclic.in","r",stdin);
    freopen("cyclic.out","w",stdout);
    gets(a+1);

    scanf("%d",&n);
    while(n--){
        int x,y,k;
        scanf("%d%d%d",&x,&y,&k);
        k%=(y-x+1);
        for(int i=x;i<=y;i++)
        b[i]=a[i];
        for(int i=x;i<=y;i++)
        a[(i+k)<=y?(i+k):x+i+k-y-1]=b[i];
    }
    puts(a+1);
阅读计划
阅暑假到了,Rick 制定了一个长达 M 天的阅读计划。他一共有 N 本书,从 1N 进行标号;Rick 将它们从上至下摞成一堆。他每天都会读一本书,假设他要读 编号为 X 的书,他会按照以下步骤:
1.将这本书上方的所有书搬起来
2.将这本书拿出来
3.将搬起来的书摞回去
4.看完后把这本书放

每本书都会有各自的重量,Rick 不希望搬起太过重的书。于是他希望能重新安 排这 N 本书的顺序,使得读完 M 本书之后,搬书的重量之和最小。

这里写图片描述

#include<cstdio>
#include<cstring>
using namespace std;
int n,m,w[510],t[1100],a[510],ans,f[510],tot;
int main(){
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=m;i++) {
scanf("%d",&t[i]); 
if(!f[t[i]]) a[++tot]=t[i],f[t[i]]=1;
}
for(int i=1;i<=m;i++)
{
int s=0,j=1;
for(;j<=n;j++)
if(a[j]!=t[i])
s+=w[a[j]];
else break;
ans+=s;

int tmp=a[j];
for(int k=j-1;k>=1;k--)a[k+1]=a[k];
a[1]=tmp;
}
printf("%d",ans);
}
Gob 和 Michael 常在一起打乒乓球。他们是这样决定比赛的输赢的:比赛由若干 大局组成;谁最先赢下 s 大局谁就获得比赛的胜利;在每一大局中,谁先得 t 分 就获得本大局的胜利。

在一次比赛中,他们只记录了比赛中的每一分是谁得的,但忘记了记录 s 和 t。 现在给出比赛的每一分的得分情况,求出所有可能的 s 和 t。Gob 保证,得分表 是完整的,也就是在比赛恰好在最后一人,得到最后一分后结束。

枚举一个t,然后胡乱搞就行了。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
struct st{
    int s,t;
}a[110000]; 
bool cmp(const st&a,const st&b){
    return a.s<b.s||a.s==b.s&&a.t<b.t;
}
int s[3][110000],t1,t2,tot1,tot2,tot,q;
int main(){
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    scanf("%d",&n);
    for(int x,i=1;i<=n;i++) {

        scanf("%d",&x);
        s[1][i]=s[1][i-1];
        s[2][i]=s[2][i-1];
        s[x][i]++;
    }

    for(int t=1;t<=n;t++){
        q=0;
        tot1=0,tot2=0;

        while(1){
            t1=lower_bound(s[1],s[1]+n+1,s[1][q]+t)-s[1];
            t2=lower_bound(s[2],s[2]+n+1,s[2][q]+t)-s[2];

            if(t1>n&&t2>n) break;
            if(t1<t2) tot1++;
            else tot2++;
            q=min(t1,t2);
            if(q==n&&(tot1>tot2&&t1==n||tot1<tot2&&t2==n)) {
                a[++tot].s=max(tot1,tot2),a[tot].t=t;break;
            }
        }   
    }
    sort(a+1,a+tot+1,cmp);
    printf("%d\n",tot);
    for(int i=1;i<=tot;i++) printf("%d %d\n",a[i].s,a[i].t);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值