没人陪我玩好无聊=.=
让我拿了1,2血.......
都是切了第一套不来第二套了么=.=
A
貌似这个事训练指南上的uva例题改编
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1822
这个是原题
http://blog.csdn.net/ronnoc/article/details/8703650
这个是我的代码
这道题是阉割版
只用考虑时间就好
两个蚂蚁碰来碰去本质没有变,整体是不变的
也就是可以单看蚂蚁而无视其他=.=
然后就是最长最短的计算了
里面的max,min,表示这只蚂蚁是想快走还是慢走
两种都要取max
#include<stdio.h>
#include<algorithm>
int a[100010];
int max(int a,int b){
if(a>b)return a;
return b;
}
int min(int a,int b){
if(a>b)return b;
return a;
}
int main(){
int k,z;
scanf("%d",&z);
for(k=1;k<=z;k++){
int i,n,L;
scanf("%d%d",&L,&n);
int resa=0,resb=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
resa=max( resa,max(a[i],L-a[i]) );
resb=max( resb,min(a[i],L-a[i]) );
}
printf("Case #%d: %d %d\n",k,resb,resa);
}
return 0;
}
这道题目貌似比较坑?
一开始没读懂题目
貌似应该是最小的B而不是B的和=.=
方法是贪心
贪心了2次
先贪B的最小值最大再贪最小的P
或者是贪心最小的P然后看这时候的B是啥
2重结果
贪心证明貌似很不爽?
大概感知下就好
要么B最优,要么P最优...
2Y...
1WA贪了1次
#include<stdio.h>
#include<algorithm>
int num[110];
int b[110][110];
int maxb[110],by[110];
int p[110][110];
int chop[110];
int main(){
int k,z;
scanf("%d",&z);
for(k=1;k<=z;k++){
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&num[i]);
for(j=1;j<=num[i];j++)scanf("%d%d",&b[i][j],&p[i][j]);
maxb[i]=-1;
for(j=1;j<=num[i];j++)if(b[i][j]>maxb[i])maxb[i]=b[i][j],by[i]=j;
}
int x=1,temp=maxb[1];
for(i=2;i<=n;i++){
if(maxb[i]<temp){
temp=maxb[i];
x=i;
}
}
for(i=1;i<=n;i++){
chop[i]=(int)1e9;
for(j=1;j<=num[i];j++)if(b[i][j]>=temp&&p[i][j]<chop[i])chop[i]=p[i][j];
}
// for(i=1;i<=n;i++)printf("%d ",maxb[i]);printf("maxb\n");
// for(i=1;i<=n;i++)printf("%d ",chop[i]);printf("chop\n");
int sum=0;
for(i=1;i<=n;i++)sum+=chop[i];
double res1=temp/(double)sum;
int B=1e9,P=0;
for(i=1;i<=n;i++){
int tP=p[i][1],tB=b[i][1];
for(j=2;j<=num[i];j++)if(tP>p[i][j]){
tP=p[i][j];
tB=b[i][j];
}
if(B>tB)B=tB;
P+=tP;
}
double res2=(double)B/P;
if(res2>res1)res1=res2;
printf("Case #%d: %.3lf\n",k,res1);
}
return 0;
}
C
就是一堆式子相乘
然后格式比较繁琐=.=
注意0 0的trick
3Y
1WA于long long && 0 0
2WA于0 0
#include<stdio.h>
#include<math.h>
#define LL long long
int fi;
LL abs(LL x){
if(x>0)return x;
return -x;
}
void out(int a,LL b){
if(b==0)return;
if(!fi){if(b>0)printf("+");else printf("-");}
else {fi=0;if(b<0)printf("-");}
if(abs(b)!=1)printf("%I64d",abs(b));
if(a>=2)printf("x^%d",a);
else if(a==1)printf("x");
else if(abs(b)==1)printf("%I64d",abs(b));
}
int main(){
int k,z;
scanf("%d",&z);
for(k=1;k<=z;k++){
fi=1;
int n,i,j;
scanf("%d",&n);
LL a[100];
for(i=1;i<=50;i++)a[i]=0;
scanf("%lld%lld",&a[2],&a[1]);
for(i=2;i<=n;i++){
int x,y;
scanf("%d%d",&x,&y);
LL b[100];
for(j=1;j<=50;j++)b[j]=0;
for(j=2;j<=50;j++)b[j]+=x*a[j-1];
for(j=1;j<=50;j++)b[j]+=y*a[j];
for(j=1;j<=50;j++)a[j]=b[j];
}
int max=0;
for(i=50;i>=1;i--)if(a[i])break;
max=i;
printf("Case #%d: ",k);
// for(i=max;i>=1;i--)printf("%d ",a[i]);
for(i=max;i>=1;i--)out(i-1,a[i]);
if(max==0)printf("0");
printf("\n");
}
return 0;
}
D
FB题目
就是找规律,一定有循环节
貌似是
0,1,2,0,1,2的简单循环,和n的性质完全一样=.=
#include<stdio.h>
int main(){
int k,z;
scanf("%d",&z);
for(k=1;k<=z;k++){
int n;
scanf("%d",&n);
printf("Case #%d: ",k);
if(n%3==0)printf("YES\n");
else printf("NO\n");
}
return 0;
}
一道找规律的题目,按照箭头填数字之后把每个点的结果写出来瞪眼法就好
#include<stdio.h>
int main(){
int k,z;
scanf("%d",&z);
for(k=1;k<=z;k++){
int x,y;
scanf("%d%d",&x,&y);
int res=0;
if(y>x&&y>=-x){
res=4*y-2;
}
else if(y<-x&&y>=x){
x=-x;
res=4*x-1;
}
else if(y>-x+1&&y<=x){
res=4*x-3;
}
else {
res=4*(-y);
}
printf("Case #%d: %d\n",k,res);
}
return 0;
}
F
就是数格子...
数据太小了=.=
有nlgn的算法都懒得写...
就是有l,r两个数组
一个正,一个负,绝对值排序,数每个负的前面有多少正的
排序是Onlgn的
总体就是nlgn
小数据吗=.=
直接n^2的数格子就好=.=
#include<stdio.h>
#include<math.h>
int map[40][40];
int l[40],r[40]; //l行r列
int main(){
int k,z;
scanf("%d",&z);
for(k=1;k<=z;k++){
int n;
scanf("%d",&n);
int i,j;
for(i=1;i<=2*n;i++)l[i]=0,r[i]=0;
for(i=1;i<=n;i++)for(j=1;j<=n;j++){
scanf("%d",&map[i][j]);
l[i]+=map[i][j];
r[j]+=map[i][j];
}
int res=0;
for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(r[i]>l[j])res++;
printf("Case #%d: %d\n",k,res);
}
return 0;
}
G
求出现的所有数字的数字和
水题了=.=
之前做过类似的
2血...
#include<stdio.h>
#include<string.h>
#define LL unsigned long long
char s[10010];
bool is_num(char x){
if(x>='0'&&x<='9')return 1;
return 0;
}
int main(){
int k,z;
scanf("%d%*c",&z);
for(k=1;k<=z;k++){
int i;
gets(s);
int len=strlen(s);
LL temp=0,res=0;
for(i=0;i<=len;i++){
if(is_num(s[i])){
temp*=10;
temp+=s[i]-'0';
}
else {
res+=temp;
temp=0;
}
}
printf("Case #%d: %I64u\n",k,res);
}
return 0;
}
H
双基回文数,貌似密度很大?
Matrix67的文貌似说到过?(可能记错...)
直接一个个的验证就好=.=
#include<stdio.h>
int is_pal(int x,int oct){
int a[50];
int pa=0;
int y=x,i;
for(i=1;i<=49;i++)a[i]=0;
while(x>0){
pa++;
a[pa]+=x%oct;
x/=oct;
}
for(i=1;i<=pa;i++){
if(a[i]!=a[pa+1-i])return 0;
}
return 1;
}
int is_2pal(int x){
int flag=0;
int i;
for(i=2;i<=10;i++)if(is_pal(x,i))flag++;
if(flag>=2)return 1;
return 0;
}
int main(){
int k,z;
scanf("%d",&z);
for(k=1;k<=z;k++){
int n,s,i=0;
scanf("%d%d",&n,&s);
++s;
printf("Case #%d:\n",k);
while(i<n){
if(is_2pal(s))i++,printf("%d\n",s);
s++;
}
}
return 0;
}