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;
}