Time limit : 1 s | Memory limit : 32 mb |
---|---|
Submitted : 6 | Accepted : 2 |
64bit Integer Format : %lld |
---|
#include <stdio.h> #include <stdlib.h> #include <cstdio> struct info{ double val; int pos; }; int amount(info a[],int n) { int i,j; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(a[j].val>a[i].val) { double t; t = a[i].val; a[i].val=a[j].val; a[j].val=t; int tt; tt=a[i].pos; a[i].pos=a[j].pos; a[j].pos=tt; } } } return 0; } int main() { int M,N; int i; while(1) { scanf("%d %d",&M,&N); if(M==-1&&N==-1) break; info price[N]={0}; int F[N]={0},J[N]={0}; for(i=0;i<N;i++) { scanf("%d %d",&J[i],&F[i]); price[i].val=(double)J[i]/F[i]; price[i].pos=i; } amount(price,N); double output=0; for(i=0;i<N;i++) { if(M>=F[price[i].pos]) { output+=price[i].val*F[price[i].pos]; M-=F[price[i].pos]; } else if(M>0&&M<F[price[i].pos]) { output+=price[i].val*M; M=0; break; } } printf("%.3lf\n",output); } return 0; }
然而在oj里面。。。Runtime Error
没办法啊,只好看看哪里可以改进
2.sort
#include<stdio.h> #include<stdlib.h> #include<algorithm> using namespace std; const int MAXN = 1010; struct node { double j,f; double r; }a[MAXN]; /* int cmp(const void *a,const void *b)//从大到小排序 { struct node *c=(node *)a; struct node *d=(node *)b; if(c->r > d->r) return -1; else return 1; } */ bool cmp(node a,node b) { return a.r > b.r; } int main() { int N; double M; double ans; while(scanf("%lf%d",&M,&N)) { if(M==-1&&N==-1) break; for(int i=0;i<N;i++) { scanf("%lf%lf",&a[i].j,&a[i].f); a[i].r=(double)a[i].j/a[i].f; } //qsort(a,N,sizeof(a[0]),cmp); sort(a,a+N,cmp); ans=0; for(int i=0;i<N;i++) { if(M>=a[i].f) { ans+=a[i].j; M-=a[i].f; } else { ans+=(a[i].j/a[i].f)*M; break; } } printf("%.3lf\n",ans); } return 0; }
key3:without sort:
#include<stdio.h> #include<stdlib.h> const int MAXN = 1010; struct node { double j,f; double r; }a[MAXN]; int cmp(const void *a,const void *b)//从大到小排序 { struct node *c=(node *)a; struct node *d=(node *)b; if(c->r > d->r) return -1; else return 1; } int main() { int N; double M; double ans; while(scanf("%lf%d",&M,&N)) { if(M==-1&&N==-1) break; for(int i=0;i<N;i++) { scanf("%lf%lf",&a[i].j,&a[i].f); a[i].r=(double)a[i].j/a[i].f; } qsort(a,N,sizeof(a[0]),cmp); ans=0; for(int i=0;i<N;i++) { if(M>=a[i].f) { ans+=a[i].j; M-=a[i].f; } else { ans+=(a[i].j/a[i].f)*M; break; } } printf("%.3lf\n",ans); } return 0; }
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
初玩can,接触第三天的一道水题
第一程序为最初所写,第二个为参考优化后,
#include"stdio.h"
main()
{
char c;
while((scanf("%c",&c))!=EOF)
{
char a[1300];
long long int b[1300],sum=0;
int state=0,temp,k=0,i,j,l;
for(i=0;c!='\t'&&c!='\n'&&c!=' ';i++)
{
a[i]=c;
scanf("%c",&c);
}
a[i]='\0';
for(j=0;j<i;j++)
{
if(a[j]=='5')
{
if(state==1)
b[k++]=sum;
state=0;
sum=0;
}
else if(a[j]=='0')
{
state=1;
sum=sum*10+a[j]-'0';
}
else
{
sum=sum*10+a[j]-'0';
state=1;
}
}
if(state==1)
b[k++]=sum;
k--;
for(j=0;j<k;j++)
for(l=0;l<k-j;l++)
{
if(b[l]>b[l+1])
{
temp=b[l];
b[l]=b[l+1];
b[l+1]=temp;
}
}
for(i=0;i<=k-1;i++)
{
printf("%lld ",b[i]);
}
printf("%lld\n",b[i]);
}
}
2.
对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std。
这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。
#include <iostream> using namespace std; namespace ZhangSan { int a=10; //张三把10赋值给了变量a } namespace LiSi { int a=5; //李四把10赋值给了变量a } void main() { int a=1; cout<<"张三定义的a="<<ZhangSan::a<<endl; cout<<"李四定义的a="<<LiSi::a<<endl; cout<<"主函数定义的a="<<a<<endl; }
上例中的“ZhangSan::a”和“LiSi::a”分别表示了调用张三命名空间中的a变量和李四命名空间中的a变量。这样的好处显而易见,那就是虽然张三和李四这两个程序员都定义了一个变量a,但是并不会出现重名的危险。
2. 关于using namespace *
std::cout |
#include <iostream> using namespace std; namespace ZhangSan { int a=10; //张三把10赋值给了变量a } namespace LiSi { int a=5; //李四把10赋值给了变量a } void main() { int a=1; using namespace ZhangSan; using namespace LiSi; cout<<a<<endl; }
#include <iostream> using namespace std; namespace ZhangSan { int a=10; //张三把10赋值给了变量a } namespace LiSi { int a=5; //李四把10赋值给了变量a } void main() { using namespace ZhangSan; using namespace LiSi; cout<<a<<endl; }
吃糖果问题
复杂方法:
#include<stdio.h> #include<math.h> #include<stdlib.h> main() { int i,t,j,N,f[50]={0}; scanf("%d",&t); for(i=0;i<t;i++) { scanf(" %d",&N); for(j=0;j<N;j++) { scanf(" %d",&f[j]); } int k; for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(f[i]<f[i+1]) { int middle = f[i]; f[i]=f[i+1]; f[i+1]=middle; } } } int flag=f[0]; for(k=0;k<N;k++) { flag=flag-f[k+1]; } if(flag>=2) printf("No\n"); else printf("Yes\n"); } }
简便算法:
# include<stdio.h> int main() { long T, N; double candy, max,sum; scanf("%d",&T); while(T--) { scanf("%d", &N); max = sum = 0; while(N--) { scanf("%lf", &candy); max = max > candy ? max : candy; sum += candy; } sum -= max; if(max <= sum + 1) printf("Yes\n"); else printf("No\n"); } }
#include <stdio.h> #include <stdlib.h> #include <math.h> int is_prime(int a) { int j; for(j=2;j<=sqrt(a);j++) { if(a % j ==0) { return 1; } } return 0; } int main() { int x,y; while(1) { int flag=0; scanf("%d%d",&x,&y); int i; if(x==0&&y==0) return 0; if(x>y) { int t=y; y=x; x=t; } for(i=x;i<=y;i++) { int s; s = i*i+i+41; if(is_prime(s)) { flag++; break; } } if(flag == 0) printf("OK\n"); else printf("Sorry\n"); } return 0; }
很简单的一道题,发出来纯粹是因为无聊。这个题一直不能Accept,本来以为是我写错了,最后老师查出来是hoj问题。。。
十一月 | ||||||
---|---|---|---|---|---|---|
日 | 一 | 二 | 三 | 四 | 五 | 六 |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |