A题进行时--浙大PAT 1001-1010
pat链接:http://pat.zju.edu.cn
1 #include<stdio.h>
2 int main(){
3 int a,b;
4 int c;
5 while(scanf("%d %d",&a,&b)!=EOF){
6 c=a+b;
7 if(c<0){
8 c=-c;
9 printf("-");
10 }
11 if(c>=1000000)
12 printf("%d,%03d,%03d\n",c/1000000,(c/1000)%1000,c%1000);
13 else if(c>=1000)
14 printf("%d,%03d\n",c/1000,c%1000);
15 else
16 printf("%d\n",c);
17 }
18 return 0;
19 }
关键是代码的长度有限制所以简化了整个程序
1 #include<stdio.h>
2 int main(){
3 int k1,k2;
4 int m[10],n[10];
5 double a[10],b[10],c[10];
6 int i,count;
7 memset(m,0,sizeof(m));
8 memset(n,0,sizeof(m));
9 memset(a,0,sizeof(a));
10 memset(b,0,sizeof(a));
11 memset(c,0,sizeof(a));
12 scanf("%d",&k1);
13 for(i=0;i<k1;i++){
14 scanf("%d",&m[i]);
15 scanf("%lf",&a[m[i]]);
16 }
17 scanf("%d",&k2);
18 for(i=0;i<k2;i++){
19 scanf("%d",&n[i]);
20 scanf("%lf",&b[n[i]]);
21 }
22 count=0;
23 for(i=0;i<=(k1>k2?k1:k2);i++){
24 c[i]=a[i]+b[i];
25 if(c[i]!=0)
26 count++;
27 }
28 printf("%d",count);
29 for(i=count;i>=0;i--){
30 if(c[i]!=0&&i!=0){
31 printf(" %d %.1f",i,c[i]);
32 }
33 else if(c[i]!=0&&i==0)
34 printf(" %d %.1f\n",i,c[i]);
35 }
36 return 0;
37 }
AC代码:
1 #include<stdio.h>
2 #include<string.h>
3 using namespace std;
4
5 double a[1002];
6 double b[1002];
7
8 int main(void){
9 int n,i,temp;
10 memset(a,0,sizeof(a));
11 memset(b,0,sizeof(b));
12 scanf("%d",&n);
13 for(i=0;i<n;i++){
14 scanf("%d",&temp);
15 scanf("%lf",&a[temp]);
16 }
17 scanf("%d",&n);
18 for(i=0;i<n;i++){
19 scanf("%d",&temp);
20 scanf("%lf",&b[temp]);
21 }
22 int count = 0;
23 for(i=0;i<1002;i++){
24 a[i]+=b[i];
25 if(a[i]!=0) count++;
26 }
27 printf("%d",count);
28 for(i=1001;i>=0;i--)
29 if(a[i]!=0){
30 count--;
31 printf(count==0?" %d %.1f\n":" %d %.1f",i,a[i]);
32 }
33 return 0;
34 }
因为最大只有1000,所以完全可以利用空间来简化程序,建立容量为1000的数组,然后从1到1000开始遍历(其实好笨的方法)注意memeset的用法,初始化太重要,c语言没初始化各种弊病
1003:(重要!!)
#include<stdio.h>
#include<string.h>
int map[][];
int dis[];
bool mark[];
int team[];
int maxteam[];
int pathnum[];
const int max=;
int n,m,c1,c2;
void dij(){
int i,j;
int k;
dis[c1]=;
//mark[c1]=1;
pathnum[c1]=;
maxteam[c1]=team[c1]; for(i=;i<n;i++){
int min=max;
for(j=;j<n;j++){
if(dis[j]<min&&!mark[j]){
min=dis[j];
k=j;
}
}
if(k==c2) return; //因为终点已经固定,已经找到直接返回
mark[k]=;
for(j=;j<n;j++){
if(mark[j]==){
if(dis[k]+map[k][j]<dis[j]){
dis[j]=dis[k]+map[k][j];
pathnum[j]=pathnum[k];
maxteam[j]=maxteam[k]+team[j];
}
else if(dis[k]+map[k][j]==dis[j]){
pathnum[j]+=pathnum[k];
if(maxteam[k]+team[j]>maxteam[j]){
maxteam[j]=maxteam[k]+team[j];
}
}
}
}
}
}
int main(){
int i,j;
int a,b;
freopen("in.txt","r",stdin); scanf("%d%d%d%d",&n,&m,&c1,&c2);
for(i=;i<n;i++){
dis[i] = max;
mark[i] = ;
//maxteam[i] = 0;
//pathcount[i] = 0;
team[i]=;
for(j=;j<n;j++)
map[i][j]=map[j][i] = max;
}
for(i=;i<n;i++)
scanf("%d",&team[i]);
for(i=;i<m;i++){
scanf("%d%d",&a,&b);
scanf("%d",&map[a][b]);
map[b][a]=map[a][b]; //end of input
}
dij(); printf("%d %d\n",pathnum[c2],maxteam[c2]);
return ;
}
一直没解决的一个难题,只是因为涉及到最短路径算法,不熟悉就一直空着没做,终于还是做了。
这是标准的一个使用邻接矩阵的dijkstra算法的最短路径题目。看资料看了好久才明白了实现的思路,一定要记住这个思路,写出来的代码基本是差不多的:
1 #include<stdio.h>
2 #include<string.h>
3 char eng[10][10]={
4 "zero",
5 "one",
6 "two",
7 "three",
8 "four",
9 "five",
10 "six",
11 "seven",
12 "eight",
13 "nine"
14 };
15 int main(){
16 char snum[10000],rnum[100];
17 int i;
18 long r;
19 int count;
20 scanf("%s",snum);
21 r=0;
22 for(i=0;i<strlen(snum);i++){
23 r+=snum[i]-48;
24 }
25 sprintf(rnum,"%d",r);
26 for(i=0;i<strlen(rnum);i++){
27 count=rnum[i]-48;
28 if(i==strlen(rnum)-1)
29 printf("%s",eng[count]);
30 else
31 printf("%s ",eng[count]);
32 }
33 }
一遍AC!!感觉还是很爽的有木有!!关键是用好全局的数组来进行转换,利用好字符串和数字的转换!例如i=c-48;利用码来进行单个数字字符的转换,以及sprintf(char,"%d",int);进行整个数字转字符串。
1 #include<stdio.h>
2 #include<string.h>
3 struct PERSON{
4 char id[20];
5 char intime[10];
6 char outime[10];
7
8 }p[200];
9 int main(){
10 int i,n;
11 int first,last;
12 scanf("%d",&n);
13 for(i=0;i<n;i++){
14 scanf("%s %s %s",p[i].id,p[i].intime,p[i].outime);
15 }
16 first=0;
17 for(i=1;i<n;i++){
18 if(strcmp(p[i].intime,p[first].intime)<0)
19 first=i;
20 }
21 last=0;
22 for(i=1;i<n;i++){
23 if(strcmp(p[i].outime,p[last].outime)>0)
24 last=i;
25 }
26 printf("%s %s",p[first].id,p[last].id);
27 return 0;
28 }
还是挺简单的,一会就AC了,出了小问题是结构数组不够大,加大了就OK了。
1007:
#include<stdio.h>
#include<string.h>
int a[];
int main(){
int i,k;
int sum=,start=,end=,max=,rs=;
int flag=;
memset(a,,sizeof(a));
scanf("%d",&k);
for(i=;i<k;i++){
scanf("%d",&a[i]);
if(a[i]>) flag=;
sum+=a[i];
if(sum>max){
max=sum;
end=i;
rs=start;
}
if(sum<){
sum=;
start=i+;
}
}
if(flag==)
printf("0 %d %d",a[],a[k-]);
else
printf("%d %d %d",max,a[rs],a[end]);
return ;
}
动态规划最典型的一道题,也是入门级别的一道题。自己对动态规划理解还不够深刻,这是通过阅读别人的代码后自己再改写的。整个过程差不多理解了这道题的思想。其实不复杂,就是两种情况,sum大于max的话,把值赋给max,将当前的次序号当做end,重新记录一个rs来确定本段的起始;一旦sum<0,则前边的都舍弃不要,将start定为下一个。懂了基本思想就好些了。但是有一组过不去,不知道什么原因。。。
1008:
#include<stdio.h>
#include<string.h>
int main(){
int i,n,s;
int a[];
scanf("%d",&n);
memset(a,,sizeof(a));
for(i=;i<n;i++)
scanf("%d",&a[i]);
s=n*;
for(i=;i<n;i++){
if(a[i]>a[i-])
s+=*(a[i]-a[i-]);
else
s+=*(a[i-]-a[i]);
}
s+=a[]*;
printf("%d",s);
return ;
}
太简单了,懒得说。
1009:
#include<stdio.h>
#include<string.h>
double a[];
double b[];
double c[];
int main(){
int i,j,n;
int k1,k2;
int count;
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(c,,sizeof(c));
scanf("%d",&k1);
for(i=;i<k1;i++){
scanf("%d",&n);
scanf("%lf",&a[n]);
}
scanf("%d",&k2);
for(i=;i<k2;i++){
scanf("%d",&n);
scanf("%lf",&b[n]);
}
count=;
for(i=;i<;i++){
if(a[i]!=){
for(j=;j<;j++){
if(b[j]!=){
c[i+j]+=a[i]*b[j];
}
}
}
}
for(i=;i<;i++)
if(c[i])
count++;
printf("%d",count);
for(i=;i>=;i--){
if(c[i])
printf(" %d %.1lf",i,c[i]);
}
printf("\n");
return ;
}
核心的算法其实就一句话:c[i+j]+=a[i]*b[j];这题和1002很相似。PS:把最后输出条件c[i]!=0改成c[i]就A过了,不然有几组死活通不过,这是什么问题。。以后记得注意这个问题,少用!=0的判断式
1010:
#include<stdio.h>
#include<string.h>
#include<math.h>
long long todec(char *n,int rad);
int main(){
int tag,radt;
char n1[],n2[];
long long int d1=,d2=;
long long i;
scanf("%s %s %d %d",&n1,&n2,&tag,&radt);
if(tag==){
d1=todec(n1,radt);
for(i=;;i++){
if(d1==todec(n2,i)){
printf("%d",i);
break;
}
else if(todec(n2,i)>d1){
printf("Impossible");
break;
}
}
}
else{
d2=todec(n2,radt);
for(i=;;i++){
if(d2==todec(n1,i)){
printf("%d",i);
break;
}
else if(todec(n1,i)>d2){
printf("Impossible");
break;
}
}
}
return ;
}
long long todec(char *n,int rad){
int i,l;
long d=;
if(rad!=){
//sprintf(s1,"%d",n1);
l=strlen(n);
for(i=;i<l;i++){
if(n[i]<=''&&n[i]>='')
d+=(n[i]-)*pow(rad,l-i-);
else if(n[i]<='z'&&n[i]>='a')
d+=(n[i]-'a'+)*pow(rad,l-i-);
}
}
else
sscanf(n,"%ld",&d);//从n中读取%d格式的d1
return d; }
最崩溃的一道题。。本来觉得很难,根本无法下手,其实想清楚也没那么难,关键是要把所有的数据都转换为10进制然后再比较。结果发现只能过一小部分。接着把int改成long long型,还是有的过不去。。貌似我理解的题意有问题。。有一组超大数据要用二分法才能过去,先这样了,有时间再写个二分法的算法吧,待续。。
看到一个二分法搜索的具体做法:http://blog.csdn.net/whosemario/article/details/8734508
#include <iostream>
#include <string.h>
using namespace std; int equal(char* A, char* B){
int i,j;
for(int i=;i<strlen(A);i++) if(A[i]!='') break;
for(int j=;j<strlen(B);j++) if(B[j]!='') break;
int lenA = strlen(A);
int lenB = strlen(B);
if(lenA-i != lenB-j) return -;
for(int k=;k<lenA-i;k++)
if(A[lenA--k]!=B[lenB--k]) return false;
if(lenA-i==&&A[lenA-]=='') return ;
return ;
} long long str2Num(char * A, long long radix){
int len = strlen(A);
long long ret = ;
long long p =; for(int i=len-;i>=;i--){
int num ;
if(A[i]>='' && A[i]<='') num = A[i]-'';
else num = A[i]-'a'+;
ret += p*num;
p*=radix;
} return ret;
} long long calcRadix(char * B){
long long ret = ;
int len = strlen(B);
for(int i=;i<len;i++){
int num ;
if(B[i]>='' && B[i]<='') num = B[i]-'';
else num = B[i]-'a'+;
if(num+>ret) ret=num+;
}
return ret;
} int compare(char* B, long long radix, long long target){
int len = strlen(B);
long long ret = ;
long long p = ;
for(int i=len-;i>=;i--){
int num;
if(B[i]>='' && B[i]<='') num = B[i]-'';
else num = B[i]-'a'+;
ret += p*num;
if(ret > target) return ;
p*=radix;
}
if(ret > target) return ;
else if(ret<target) return -;
else return ;
} long long binarySearch(char* B, long long low, long long high, long long target){
long long mid;
while(low<=high){
mid = (low+high)/;
int res = compare(B,mid,target);
if(res > )
high = mid-;
else if(res<)
low = mid+;
else return mid;
}
return -;
} int main() {
char A[];
char B[];
int chose;
long long radix; cin>>A>>B>>chose>>radix;
int eq = equal(A,B);
if(eq==) printf("2\n");
else if(eq==) printf("%d\n",radix);
else{
if(chose==){
long long target = str2Num(A,radix);
long long least = calcRadix(B);
long long most = (target)>(least)?(target):(least); // input : 11 b 1 10
long long res = binarySearch(B,least,most,target);
if(res==-) cout<<"Impossible"<<endl;
else cout<<res<<endl;
}
else{
long long target = str2Num(B,radix);
long long least = calcRadix(A);
long long most = (target)>(least)?(target):(least);
long long res = binarySearch(A,least,most,target);
if(res==-) cout<<"Impossible"<<endl;
else cout<<res<<endl;
}
}
return ;
}
发现基本思想都不一样额。。最小的进制就是它的某位最大的数字,最大就是被比较的另一个变量的值,然后再进行二分法搜索。而我的算法是从0到最大暴力搜索。
#include<stdio.h>
#include<math.h>
int isp(long l);
int main(){
long int n,t,cnt;
long int i;
scanf("%ld",&n);
t=n;
i=;
if(n==||isp(n)){
printf("%d=%d",n,n);
return ;
}
printf("%ld=",n);
while(!isp(t)){
if(isp(i)){
cnt=;
if(t%i==){ while(t%i==){
t/=i;
cnt++;
}
if(cnt==)
printf("%ld",i);
else
printf("%d^%d",i,cnt); if(t!=)
printf("*"); i++;
}
else
i++;
}
else
i++;
}
printf("%d",t);
return ;
}
int isp(long l){
long i=;
while(i<sqrt(l)+){
if(l==)
return ;
if(l%i==){
return ;
}
if(i==l-)
return ;
i++;
} }
纠结了好久的一道题,终于还是过了。。首先是判断素数,可以用sqrt来简化复杂度。如果是素数则直接输出,如果不是则进入循环来寻找它的因数。之前最初我用两组数组来记录每一个因数和它的次方,实在是复杂多余,后来改成了直接算一个输出一个,明显简化了许多。还有要注意特殊情况的输出,素数直接输出自身即可。还有最重要的一点是:循环结束条件的判断。余数如果是素数即可结束循环,我的程序一直超时,就是没有利用这个循环结束条件。
PS:关于找出所有素数的解法,还有一个高效的方法:素数筛选法
void init(){
primgsize=;
for(int i=;i<=;i++){
if(mark[i]==true) continue;
prime[primesize++]=i;for(int j=i*i;j<=;j+=i){
mark[j]=true;
}
}
A题进行时--浙大PAT 1001-1010的更多相关文章
- A题进行时--浙大PAT 1011-1020
#include<stdio.h> #include<string.h> int main(){ ]; ]; ]; ]; ]; int i; float sum; memset ...
- A题进行时--浙大PAT 1021-1030
1021: #include<stdio.h> #include<string.h> #include<vector> #include<queue> ...
- PAT 乙级 1010
题目 题目地址:PAT 乙级 1010 思路 首先一个问题就是审题不清,导致代码返工了很多次,最后还没写对: 其次对于这道题来说每次输入一组数据之后就可以输出结果,太过机械地想要套用题目给出的输出样例 ...
- PAT 1001 A+B 解题报告
PAT 1001 A+B 代码链接:传送门 题目链接:传送门 题目简述: 给定两个值a,b: 范围-1000000 <= a, b <= 1000000: 按指定格式输出a+b的结果,例: ...
- PAT甲级1010. Radix
PAT甲级1010. Radix (25) 题意: 给定一对正整数,例如6和110,这个等式6 = 110可以是真的吗?答案是"是",如果6是十进制数,110是二进制数. 现在对于 ...
- 浙大PAT CCCC L3-013 非常弹的球 ( 高中物理题 )
题目链接 题意 : 刚上高一的森森为了学好物理,买了一个“非常弹”的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不 ...
- PAT 1001. A+B Format(水题)
#include<cstdio> #include<cstring> using namespace std; char s[10]; int main() { int a,b ...
- 浙大 PAT 乙级 1001-1075 目录索引
1001. 害死人不偿命的(3n+1)猜想 1002. 写出这个数 1003. 我要通过! 1004. 成绩排名 1005. 继续(3n+1)猜想 1006. 换个格式输出整数 1007. 素数对猜想 ...
- pat 甲级 1010. Radix (25)
1010. Radix (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a pair of ...
随机推荐
- 拓展:switch实现
拓展:switch实现 参考中谷教育 python视频:switch switch语句用于编写多分支结构的程序,类似于if ... elif ...else语句.switch语句表达的分支结构比if ...
- Python+Bottle+Sina SAE快速构建网站
Bottle是新生一代Python框架的代表,利用Bottle构建网站将十分简单. Sina SAE是国内较出名的云平台之一,十分适用于个人网站的开发或创业公司网站开发. 下面将介绍如果通过Pytho ...
- 一步步学习ASP.NET MVC3 (12)——FileResult
请注明转载地址:http://www.cnblogs.com/arhat 忙了两天,本来老魏昨天就应该写出新的文章,但是由于昨天雨夹雪而且加上昨天晚上加了班,到家都没饭吃了,一看时间都9点了,什么饭店 ...
- 破坏之王——ddos攻击与防范 读书笔记
好久没写博客了,最近把绿盟的<破坏之王——ddos攻击与防范>又翻了一下,整理了关于DDOS分类和原理的xmind图~~ 百度云盘:http://pan.baidu.com/s/1i3ms ...
- 洛谷 P1417 烹调方案
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- AJax跨域请求百度音乐接口数据展示页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Hibernate与数据库分表
数据库分片(shard)是一种在数据库的某些表变得特别大的时候采用的一种技术. 通过按照一定的维度将表切分,可以使该表在常用的检索中保持较高的效率,而那些不常用的记录则保存在低访问表中.比如:销售记录 ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理
Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the fa ...
- 轻松使用Nginx搭建web服务器
如果读者以前做过web开发的话,就应该知道如何去搭建一个web服务器来跑你的web站点,在windows下你可能会选择去用IIS,十分的快捷,在linux下,你可能首先会想到apache,“一哥”( ...
- matlab安装和入门
下载iso镜像: ISO镜像下载地址链接: http://pan.baidu.com/s/1i31bu5J 密码: obo1 单独破解文件下载链接: http://pan.baidu.com/s/1c ...