7.28 练习题

A题 CodeForce 1011A

#include <algorithm>
#include<iostream>
#include<string.h>
using namespace std;
int n,c,k,i,L,jjk,sum,arr[27];
int main()
{

	cin>>n>>k;
	char ch[51];//存放字母 
	memset(arr,0,sizeof(arr));//初始为0 
	for(i=1;i<=n;i++)
	{
		cin>>ch[i];
		arr[ch[i]-'a'+1]=1;//有该字母的,对应数字为1 
	}
	//int c=arr[1];
//		for(i=1;i<=26;i++)
//	{cout<<arr[i]<<" ";} 
	L=0,sum=0;
	for(i=1;i<=26;i++)
	{	
	    //cout<<"   i为"<<i<<endl;
		if( arr[i] )
		{
			 
			sum+=i;
			i++;
			L++;
			//cout<<"   L为"<<L<<endl; 
			if(L==k)   
			{
				cout<<sum<<endl;
				return 0;
			}
		}
					
	}
	cout<<"-1"<<endl;	 
	return 0;
}

B题

Sergei B.,波克曼斯的年轻教练,已经找到了从左到右排成一排的由N套公寓组成的大房子。从街上进入每个单位是可能的。从每个公寓出去是可能的。同时,每个单位与左边的单位和右边的单位相连。平号1只与平号2相连,平号N只与平号N-1相连。
在每个公寓里都有一种不同类型的宠物小精灵。Sergei B.要求房子里的居民让他进入他们的公寓,以便捉到pokemon。在咨询了住户后,Sergei B.决定让他从街上进入一个公寓,参观几个公寓,然后从某个公寓出去。但他们不会让他去同一间公寓大于一次。
Sergei B.非常高兴,现在他想尽可能少的公寓,以便收集在这所房子里出现的各种类型的宠物小精灵。你的任务是帮助他,确定他必须去的最小单位数目。

输入:

第一行包含整数N(1≤N≤100000)——房子中的单位数。
第二行包含有长度为N的字符s,它由大写字母和小写字母组成,第i个字母为第i公寓里pokemon的类型。
输出:
打印出Sergei B.应该去公寓的最小单位数量,以便捕获房子里所有类型的小精灵。

E题  Trailing Zeroes (III)

(二分, 给出N!末尾有连续的Q个0,让你求最小的N)

#include <stdio.h>
#include <string>
#include <algorithm>
#define LL long long
#include<iostream>
using namespace std;
LL sum(LL N)//求N阶乘中 末尾连续的0的个数
{
    LL ans = 0;
    while(N)
    {
        ans += N / 5;
        N /= 5;
    }
    return ans;
}
int k = 1;
int main()
{
    int t;
    LL Q;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%lld", &Q);
        LL left = 1, right = 1000000000000;
        LL ans = 0;
        while(right >= left)
        {
            int mid = (left + right) >> 1;//mid = (left + right)/2
            if(sum(mid) == Q)//相等时 要赋值给ans
            {
                ans = mid;
                right = mid - 1;
            }
            else if(sum(mid) > Q)
                right = mid - 1;
            else
                left = mid + 1;
        }
        printf("Case %d: ", k++);
        if(ans)
            cout<<ans<<endl;
        else
            cout<<"impossible"<<endl;;
    }
    return 0;
}

I题 hdu5477

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5477

题意:一个人要骑车过一个[0, L]的区间,区间里面有n个沼泽其余全是平坦的道路。第i个沼泽的区间为[l[i], r[i]],所有沼泽都不会重叠,且r[i] < l[i+1]。已知骑车过沼泽每单位长度需要花费a点力气,走平路每单位长度可以收获b点力气。问你这个人至少需要准备的力气。

WA
// 忽略了在这个过程中这个人的最小体力值为0,不可以小于0;

#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
using namespace std;
int vis[100005];
int main()
{
	int t,s=0,i;
	cin>>t;
	while(t--)
	{
		
		s++;//case
		int n,L,a,b;
		memset(vis,0,sizeof(vis));
		cin>>n>>a>>b>>L;
		while(n--)
		{
			int l,r;
			cin>>l>>r;
			for(i=l;i<r;i++)
			{
				vis[i]=1;//沼泽区标为1 
			}
			
		}
		int ans=0;
		for(i=0;i<L;i++)
		{
			if(vis[i])
			{
				ans=ans-a;cout<<ans<<endl;
			 } 
			else
			{
				ans=ans+b;cout<<ans<<endl;
			}
			
		}
		if(ans>=0)
		printf("Case #%d: %d\n",s,0);
		else
		printf("Case #%d: %d\n",s,-ans);
	}
	
	return 0;
}
AC

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
	int n,a,b,L,t;
	int l,r;//沼泽的范围 
	int k=1;
	scanf("%d",&t);
	while(t--)
	{
		int sum=0,minn=100000,end=0;//end用来记录上一个沼泽结束的位置
		scanf("%d%d%d%d",&n,&a,&b,&L);
		while(n--)
		{
			scanf("%d%d",&l,&r);
			sum=sum+(l-end)*b-(r-l)*a;//累加体力
			minn=min(sum,minn);//更新minn,求过程中的最小体力.
			end=r; //更新end
		}
		printf("Case #%d: ",k++);
		if(minn<0)
		  printf("%d\n",-minn);
		else
		  printf("0\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/tingtingyuan/article/details/81262902