A.Summer Camp
题意:123456789101112```数字的字符串,询问第n个字符是什么(0<n<=1000)
思路:文件输出字符串存进数组
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<iostream>
using namespace std;
char str[10000]={"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500"};
int main()
{
//freopen("test.out","w",stdout);
int n;
while(scanf("%d",&n)==1)
printf("%c\n",str[n-1]);
}
B.Different is Good
题意:对于给定的小写字母字符串,问最少改变多少个字母使得字符串的所有字符都不同,如果无法做到,输出-1
思路:长度大于26时,输出-1,不然输出 长度-字符种类
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<iostream>
using namespace std;
char str[100005];
int A[30];
int main()
{
int n;
while(scanf("%d",&n)==1)
{
memset(A,0,sizeof(A));
scanf("%s",str);
int num=0;
if(n>26){
printf("-1\n");
continue;
}
for(int i=0;i<n;i++){
int x = str[i]-'a';
if(A[x]==0){
num++;
}A[x]++;
}
printf("%d\n",n-num);
}
}
C.Recycling Bottles
题意:两个给定初始位置的人和一个垃圾站的坐标,现在要捡完所有垃圾,每次捡一个垃圾后必须送回垃圾站才能继续捡下一个垃圾,所有垃圾的坐标给出,询问两人最小的路径和。
思路:捡完第一个垃圾后的路径长度都是一样的,所以只要选择最小的开始的组合就是答案
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<iostream>
#include<cmath>
const double EPS = 1e-9;
using namespace std;
double dis[100005];
int X[100005];
int Y[100005];
struct node
{
double x;
int id;
};
node d1[100005];
node d2[100005];
inline bool cmp(const node& a ,const node& b){
return a.x<b.x;
}
inline double DIS(int a,int b,int c,int d){
return sqrt(pow((double)a-c,2.0)+pow((double)b-d,2.0));
}
int main()
{
int x0,y0,x1,y1,x2,y2;
while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x0,&y0)==6)
{
double sum = 0;
int n;scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&X[i],&Y[i]);
dis[i]=DIS(X[i],Y[i],x0,y0);
sum+=dis[i]*2;
d1[i].x=DIS(X[i],Y[i],x1,y1)-dis[i];d1[i].id=i;
d2[i].x=DIS(X[i],Y[i],x2,y2)-dis[i];d2[i].id=i;
}
sort(d1,d1+n,cmp);
sort(d2,d2+n,cmp);
double mi = min(d1[0].x,d2[0].x);
for(int i=0;i<n;i++)if(d1[i].id!=d2[0].id)
mi = min(mi,d1[i].x+d2[0].x);
for(int i=0;i<n;i++)if(d2[i].id!=d1[0].id)
mi = min(mi,d2[i].x+d1[0].x);
printf("%.8f\n",sum+mi);
}
}
D.Robin Hood
题意:给定n个人手上的金币数,询问k次操作后最大和最小的金币数的差值,每次操作把拥有最多的金币数的人续一个金币给最小的金币数的人
思路:分别二分最小金币数和最大金币数,特判无论怎么都不能平均分配的情况,特判小心溢出。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<iostream>
using namespace std;
int n,k;
int A[500005];
inline bool judge1(int x)
{
int y = k;
for(int i=0;i<n&&y>=0&&A[i]<x;i++)
{
y -= ( x-A[i] );
}return y>=0;
}
inline bool judge2(int x)
{
int y = k;
for(int i=n-1;i>=0&&y>=0&&A[i]>x;i--)
{
y -= ( A[i]-x );
}return y>=0;
}
int main()
{
while(scanf("%d%d",&n,&k)==2)
{
long long sum = 0;
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
sum+=A[i];
}int x = (sum+n-1)/n;
sort(A,A+n);
long long a = 0;
int mi=0 ,mx= (long long)x*n==sum?0:1;
for(int i=0;i<n&&A[i]<x;i++){
a+=(x-A[i]);
}
if(a<=(long long)k){
printf("%d\n",mx-mi);
continue;
}
int s = A[0] , e = x ;
while(s<e)
{
int m = (s+e)/2;
if(m==s)break;
if(judge1(m)){
s = m;
}else {
e = m-1;
}
}mi=s;
if(s!=e)mi+=judge1(e);
s = x ; e = A[n-1];
while(s<e)
{
int m = (s+e)/2;
if(m==s)break;
if(judge2(m)){
e = m;
}else{
s = m+1;
}
}mx=e;
if(s!=e)mx -=judge2(s);
printf("%d\n",mx-mi);
}
}
E.Ultimate Weirdness of an Array
E不会做啊~~~~~