1001:害死人不偿命的(3n+1)猜想 (15)(完成)
#include<iostream>
using namespace std;
int main(){
int n,a=0;
scanf("%d",&n);
while(n!=1){
if(n%2==0){
n/=2;
}
else{
n=(3*n+1)/2;
}
a++;
}
printf("%d",a);
return 0;
}
1002:写出这个数 (20)(完成)
注意要点:
1.字符串数组的使用。使用方式:点击打开链接。
2.sprint的使用。点击打开链接。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
//有两个点:1.sprintf的使用。2.可以一边输入一边直接累加。//
char s[100];
char ans[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main(){
char ch;
int sum=0;
while((ch=getchar())!='\n'){
sum+=(ch-'0');
}
sprintf(s,"%d",sum);
for(int i=0;s[i]!=0;i++){
if(i>0){
printf(" ");
}
printf("%s",ans[s[i]-'0']);
}
return 0;
}
1003:我要通过! (20 分)(AC:模拟)
注意要点:
完了补吧。第一个卡了好久。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n;
scanf("%d" , &n);
for(int i = 0 ;i < n ; i ++){
string s;
int a = -1000, b = -1000 , c = -1 , d = -1 , pcount = 0 , tcount = 0;;//d的值控制j的下标 //
cin >> s;
for(int j = 0 ; j < s.size() ; j ++){
//判断所有的满足和不满足的字母//
if(s[j]!= 'P'){
if(s[j] != 'A'){
if(s[j] != 'T'){
break;
}
else{
tcount ++;
}
}
}
else{
pcount ++;
}
if(s[j] == 'P'){// 记录第一个a的数值//
a = j;
}
if(s[j] == 'T'){// 记录第一个b的数值//
b = j - a - 1;
d = j;
}
}
c = s.size() - d - 1 ;//记录c的数值//
if(a * b == c && b > 0 && pcount == 1 && tcount == 1){//p和t的个数只能出现一次。a和b的个数需要拉的大一点,要不然容易出毛病。//
printf("YES");
}
else{
printf("NO");
}
if(i != n - 1){
printf("\n");//最后一行不打印//
}
}
return 0;
}
1004:成绩排名 (20)(完成)
注意要点:
1.结构体的编程格式。
#include<iostream>
using namespace std;
struct student{
char name[15];
char num[15];
int grade;
}stu,M,m;
//这个地方有个技巧:我们不必把所有信息都输进去。我们只是判断最大值和最小值。//
int main(){
int n,max=0,min=101;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s %s %d",stu.name,stu.num,&stu.grade);
if(stu.grade>max){
max=stu.grade;
M=stu;
}
if(stu.grade<min){
min=stu.grade;
m=stu;
}
}
printf("%s %s\n",M.name,M.num);
printf("%s %s",m.name,m.num);
return 0;
}
1005:继续(3n+1)猜想 (25)(AC)
注意要点:
1.这题目是写的真是令人绝望。sum放在里面死活都不对,一拉到外面就全对了,你是不是坑爹了。
#include<iostream>
using namespace std;
int main() {
int N , b , sum = 0;
int a[10005] = { 0 };
scanf("%d" , &N);
for(int i = 0 ; i < N ; i++) {
scanf("%d" , &b);
if(a[b] == 2);
else a[b] = 1 ;
while(b != 1) {
if(b % 2 == 0) b /= 2;
else b = (3 * b + 1) / 2;
a[b] = 2;
}
}
for(int i = 0 ; i < 10000; i ++) {
if(a[i] == 1) sum ++;//放在外面的sum//
}
for(int i = 10000; i >= 0 ; i --) {
if(a[i] == 1) {
printf("%d" , i);
sum--;
if(sum > 0) printf(" "); //再次注意这个写法。//
}
}
return 0;
}
1006:换个格式输出整数 (15)(完成)
注意要点:
1. 新C++中不再支持gets,需要换回C了。
#include<stdio.h>
char s[10];
int main(){
int len;
gets(s);
len=strlen(s);
if(len==1){
for(int i=1;i<=(s[0]-'0');i++){
printf("%d",i);
}
}
if(len==2){
for(int i=1;i<=(s[0]-'0');i++){
printf("S");
}
for(int i=1;i<=(s[1]-'0');i++){
printf("%d",i);
}
}
if(len==3){
for(int i=1;i<=(s[0]-'0');i++){
printf("B");
}
for(int i=1;i<=(s[1]-'0');i++){
printf("S");
}
for(int i=1;i<=(s[2]-'0');i++){
printf("%d",i);
}
}
return 0;
}
1007: 素数对猜想 (20)(完成)
注意要点:
1.埃氏筛法的写法。
2.在一开始定义的时候最好都能定义成一致的。
#include<iostream>
using namespace std;
int a[100005],primeNum=0;
bool flag[100005]={0};
//素数技巧:埃氏筛法//
void prime(int c){
for(int i=2;i<=c;i++){
if(flag[i]==0){
a[primeNum++]=i;
for(int j=i+i;j<=c;j+=i){
flag[j]=1;
}
}
}
}
int main(){
int n,ans=0;
scanf("%d",&n);
prime(n);
for(int i=0;i<primeNum;i++)
if(a[i+1]-a[i]==2)
ans++;
printf("%d",ans);
return 0;
}
1008:数组元素循环右移问题 (20)
注意要点:
1.什么鬼,这个题目真的佛了,这个点100%想不到。比如说 ,我左移九位,其实等于转了一圈,只是往左移了一位。
#include<iostream>
using namespace std;
int main(){
int n , m;
int a[105] = {0};
scanf("%d%d" , &n , &m);
m = m % n;//这个是在等比例缩小//
for(int i = 0 ; i < n ; i ++) {
scanf("%d" , &a[i]);
}
for(int i = n - m ; i < n ; i ++) {
printf("%d " , a[i]);
}
for(int i = 0 ; i < n - m ; i ++) {
if(i == n - m - 1) printf("%d" , a[i]);
else printf("%d " , a[i]);
}
return 0;
}
1009:说反话 (20)(完成)
注意要点:
1.在EOF下需要手动更新数值。ctrl+z
#include<iostream>
using namespace std;
//利用字符串数组解决问题。//
int main(){
char s[85][85];
int i=0;
while(scanf("%s",s[i])!=EOF){
i++;
}
int n=i;
for( i=n-1;i>=0;i--){
if(i<n-1){
printf(" ");
}
printf("%s",s[i]);
}
return 0;
}
1010:一元多项式求导 (25) (AC)
注意要点:
1.行末没有空格这种要求怎么办?可以设置一个计数器先--,判断这个值只要不是0,就输出一个空格。
2.注意数组空间。但凡涉及到两个数字的关系的时候,考虑数组。
3.还要注意EOF的用法。同时此题目也可用=2来做。
#include<iostream>
using namespace std;
int main() {
int a[10005] = { 0 };
int n1 , n2, count = 0;
while(scanf("%d%d" , &n1 , &n2) != EOF) {
a[n2] = n1;
}
a[0] = 0;
for(int i = 1 ; i <= 1000 ; i ++) {//空间报错//
a[i-1] = a[i] * i ;
a[i] = 0 ;//更新完后的数值必须舍弃,否则倒着输出会有问题出现//
if(a[i - 1] != 0) count ++;
}
if(count == 0) printf("0 0");
else {
for(int i = 1000 ; i >=0 ; i --) {
if(a[i] != 0) {
printf("%d %d" , a[i] , i);
count --;
if(count != 0) printf(" ");//行末没有多余的空格的标准写法//
}
}
}
return 0;
}
1013:数素数 (20) (完成)
注意要点:
1. 还有一个地方没有改对。不知道为什么。(这就是一个打表,注意输出的问题。)
#include<iostream>
using namespace std;
const int maxn=10005;
int prime[maxn],pNum=1;
bool p[maxn]={0};
void Find_prime(int b){
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[pNum++]=i;
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
}
int main(){
int a,b,i=1;
scanf("%d%d",&a,&b);
Find_prime(b);
for( ;a<=b;a++){
if(i%10==1) printf("%d",prime[a]);
else printf(" %d",prime[a]);
if(i==10) {printf("\n");i=1;continue;}
i++;
}
return 0;
}
修正之后的版本:有几个地方擅自修改了,结果答案错了。一脸懵逼。
#include<iostream>
using namespace std;
const int maxn=1000005;
int prime[maxn],pNum=0;
bool p[maxn]={0};
void Find_prime(int b){
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[pNum++]=i;
if(pNum>=b) break;
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
}
int main(){
int a,b,i=0;
scanf("%d%d",&a,&b);
Find_prime(b);
for(int k=a;k<=b;k++){//这些地方能不要省就不要省,容易错//
printf("%d",prime[k-1]);
i++;
if(i%10!=0 && k<b) printf(" ");
else printf("\n");
}
return 0;
}
1017:A除以B (20)(20 分)(完成)
注意要点:
1.大数计算。注意三板斧,前两板斧都是套路,最后一板斧变化一下即可。
#include<iostream>
#include<cstring>
using namespace std;
int r=0;
struct bign{
int d[1000];
int len;
bign(){
len=0;
memset(d,0,sizeof(d));
}
};
bign change(char c[]){
bign a;
a.len = strlen(c);
for(int i=0;i<a.len;i++){
a.d[i]=c[a.len-i-1]-'0';
}
return a;
}
bign divide(bign A,int b,int &r){
bign ans;
ans.len = A.len;
for(int i=A.len-1;i>=0;i--){
r = r * 10 +A.d[i];
if(r<b) ans.d[i]=0;
else{
ans.d[i]= r/b;
r = r % b;
}
}
while(ans.len-1>=1 && ans.d[ans.len-1]==0){
ans.len--;
}
return ans;
}
void print(bign ans,int &r){
for(int i = ans.len-1;i>=0;i--){
printf("%d",ans.d[i]);
}
printf(" %d",r);
}
int main(){
char a[1005];
int b;
scanf("%s%d",a,&b);
bign A = change(a);
bign C = divide(A,b,r);
print(C,r);
return 0;
}
1019:数字黑洞(20 分)(AC)
注意要点:
1.这个题的思路不是很难,注意sort的写法就行。
#include<iostream>
#include<algorithm>
using namespace std;
int a[5] = { 0 };
bool cmp(int a , int b) {
return a > b ;
} //cmp的基础用法//
void isarray(int N ) {
for(int i = 0 ; i < 4 ; i ++) {
a[i] = N % 10;
N /= 10;
}
}
int isnumber(int A[]) {
int sum = 0;
for(int i = 0 ; i < 4 ; i ++) {
sum = sum * 10 + a[i];
}
return sum;
}
int main() {
int N , min , max;
scanf("%d" , &N);
while(1) { //这个循环的条件要注意//
isarray(N);
sort(a , a + 4);
min = isnumber(a);//最小值//
sort(a , a + 4 , cmp);
max = isnumber(a); //最大值//
N = max - min ;
printf("%04d - %04d = %04d\n" , max , min , N);
if(N == 0 || N == 6174) break;
}
return 0;
}
1021:个位数统计 (15) (完成)
#include<iostream>
using namespace std;
int main(){
char s[10000];
int a[10]={0},i=0;
while(scanf("%c",&s[i])==1){
a[s[i]-'0']++;
i++;
}
for(int i=0;i<=9;i++){
if(a[i]!=0)
printf("%d:%d\n",i,a[i]);
}
return 0;
}
1022:D进制的A+B (20)(20 分)(完成)
注意要点:
1.这个题是典型的进制转换题型,对于P进制转换Q进制,中间加一个10进制作为转换的接口。
2.所谓的除基取余法,其实就是手动模拟除法。
#include<iostream>
using namespace std;
int main(){
int e,b,c,sum,a[40] ,num = 0;;
scanf("%d%d%d",&e,&b,&c);
sum = e + b ;
do{
a[num++] = sum % c ;
sum /= c ;
} while(sum != 0);
for(int i=num-1;i>=0;i--){
printf("%d",a[i]);
}
return 0;
}
1023:组个最小数 (20)(20 分)(完成)
注意要点:
1.有思路->按照思路写代码。
#include<iostream>
using namespace std;
int a[10]={0};
int main(){
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<10;i++){
if(a[i]!=0){
printf("%d",i),a[i]-=1;
break;
}
}
for(int i=0;i<10;i++){
if(a[i]!=0){
for(int j=0;j<a[i];j++){
printf("%d",i);
}
}
}
return 0;
}
1026:程序运行时间(15) (AC)
注意要点:
1.怎么写四舍五入?只能是手动判断,当这个数值大于100 的一半的时候,我们就能这样做。
#include<iostream>
using namespace std;
int main(){
int a , b , c;
scanf("%d%d" , &a , &b);
int m = b - a ;
if(m %100 >= 50) //手动四舍五入//
c = (b - a) / 100 + 1;
else c = (b - a) / 100;
printf("%02d:%02d:%02d" , c / 3600 , (c % 3600) / 60 , c % 60);
return 0;
}
1029:旧键盘(20)(20 分)(AC)
注意要点:
1.第一次接触到Hash思想,以后可以多注意。
2.注意分析问题的时候,在脑子里面自己要考虑清楚会发生什么样子的情况。
3.Hash + 动态更新。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char a[85],c[85];
int b[100000] = { 0 };
scanf("%s" , a);
int len1 = strlen(a);
for(int i = 0 ; i < len1 ; i ++) {
if(a[i] >= 'a' && a[i] <= 'z') {
a[i] = a[i] - 32 ;
b[a[i] - '0'] = 1;
}
else b[a[i]-'0'] = 1 ;
}
getchar();
scanf("%s" , c);
int len2 = strlen(c);
for(int i = 0 ; i < len2 ; i ++) {
if(c[i] >= 'a' && c[i] <= 'z') {
c[i] = c[i] - 32 ;
b[c[i] - '0']= 2;
}
else b[c[i]-'0'] = 2 ;
}
for(int i = 0; i < len1 ; i ++) {
if(b[a[i]-'0'] == 1) {
printf("%c" , a[i]);
b[a[i]-'0'] = 0;
}
}
return 0;
}
1031:查验身份证(15)(AC)
注意要点:
1.再次说明思路的问题。做题之前必须有一个合理的思路,这样可以提高很大的正确率。
2.注意你每一行的写法,一个小的错误都会是致命的。
3.全对输出这个怎么做?直接设置一个flag放进去等就行了。前提是flag不是一个判断条件。
4.非数字的写法判断。
#include<iostream>
#include<cstring>
using namespace std;
int main() {
int N;
scanf("%d" , &N);
char s[19];
char M[15] = {'1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2'};
int w[20] = {7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2};
bool flag = true;
for(int i = 0 ; i < N ; i ++) {
int sum = 0;
scanf("%s" , s);
getchar();
int j;
for( j = 0 ; j < 17 ; j ++) {
if(! (s[j] >= '0' && s[j] <= '9'))//看好这个非数字的写法//
break;
sum += (s[j] -'0') * w[j];
}
//当不够的时候,说明里面有字母//
if(j < 17) {
flag = false;
printf("%s\n" , s);
}
//验证不对,输出//
else {
if(M[sum % 11] != s[17]){
flag = false;
printf("%s\n" , s);
}
}
}
//如果全对的时候,设置一个外变量,看其是否变化.//
if(flag == true){
printf("All passed");
}
return 0;
}
1032:挖掘机技术哪家强(20)(20 分)(完成)
注意要点:
1.输入。
#include<iostream>
using namespace std;
int main(){
int a[100005]={0};
int n,max=0,k,num,score;
scanf("%d",&n);
for(int i=1;i<=n;i++){
//scanf("%d %d",&c,&a[c]);这样写有点问题//
scanf("%d%d",&num,&score);
a[num]+=score;
}
for(int i=1;i<=n;i++){
if(max<=a[i]) {
max = a[i];
k=i;
}
}
printf("%d %d",k,max);
return 0;
}
1033 :旧键盘打字(20 分)(WA)
还未完成,13分,三个未通过。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char a[100005] , b[100005];
int c[300] = { 0 };
int G = 0;
scanf("%s" , a);
int len1 = strlen(a);
for(int i = 0 ; i < len1 ; i ++) {
if(a[i] == '+'){
G = 1;
}
c[a[i] - '0'] = 1;
if(a[i] >= 'A' && a[i] <= 'Z'){
a[i] = a[i] + 32;
c[a[i]-'0'] = 1;
}
}
getchar();
scanf("%s" , b);
int len2 = strlen(b);
for(int i = 0 ; i <len2 ; i++) {
if(G == 1) {
if(b[i] >= 'A' && b[i] <= 'Z') {
c[b[i] - '0'] = 1;
}
}
}
for(int i = 0 ; i <len2 ; i ++) {
if(c[b[i] - '0'] == 0)
printf("%c" , b[i]);
}
return 0;
}
1036:跟奥巴马一起编程(15)(15 分)(完成)
注意要点:
1.除(÷)这个符号会直接截取。
#include<iostream>
using namespace std;
int main(){
int n,b;
char a;
scanf("%d %c",&n,&a);
if(n%2==0) b=n/2;
else b=n/2+1;
for(int i=1;i<=b;i++){
for(int j=1;j<=n;j++){
if(i==1 || i==b || j==1 || j==n) printf("%c",a);
else printf(" ");
if(j==n) printf("\n");
}
}
return 0;
}
1037:在霍格沃茨找零钱(20 分)(AC)
注意要点:
1.认真考虑进制转换的那个地方。
#include<iostream>
using namespace std;
int main() {
int G1 , S1 , K1 , G2 , S2 , K2;
scanf("%d.%d.%d %d.%d.%d" , &G1 , &S1 , &K1 , &G2 , &S2 , &K2);
int P = 17 * 29 * G1 + 29 * S1 + K1;
int A = 17 * 29 * G2 + 29 * S2 + K2;
if(P <= A) {
printf("%d.%d.%d" , (A - P) / (29 * 17) , ((A - P) % (29 * 17)) / 29 , (A - P) % (29 * 17) % 29 );
}
else printf("-%d.%d.%d" , (P - A) / (29 * 17) , ((P - A) % (29 * 17)) / 29 , (P - A) % (29 * 17) % 29 );
return 0;
}
1038:统计同成绩学生(20)(20 分)(AC)
注意要点:
1.行末不得有空格的写法。
#include<iostream>
using namespace std;
int main() {
int grade[105] = { 0 };
int find[100005] = { 0 };
int N , a , n , b;
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
scanf("%d" , &a);
grade[a] ++;
}
scanf("%d" , &n);
for(int i = 0 ; i < n ; i++) {
scanf("%d" , &find[i]);
}
for(int i = 0 ; i < n ; i++) {
if(i == n - 1) { printf("%d" , grade[find[i]]); break;}
printf("%d " , grade[find[i]]);
}
return 0;
}
1039:到底买不买(20)(AC)
注意要点:
1.转换HashTable下标这个地方需要注意。搞清楚问什么它会这么做,不只是将这个变成ASCII码数值。
2.这个地方只是让求 miss 个数,所以没有必要去搞什么循环。
#include<iostream>
#include<cstring>
using namespace std;
int change(char a) {
if(a >= '0' && a <= '9') return a - '0';
if(a >= 'a' && a <= 'z') return a - 'a' + 10;
if(a >= 'A' && a <= 'Z') return a -'A' + 36;
}
int main() {
int miss = 0 ;
int HashTable[200] ={0};
char s1[1005] , s2[1005];
int sum = 0 ;
scanf("%s" , s1);
int len = strlen(s1);
for(int i = 0 ; i < len ; i ++) {
HashTable[change(s1[i])] ++;
}
getchar();
scanf("%s" , s2);
int len2 = strlen(s2);
for(int i = 0 ; i < len2 ; i ++) {
HashTable[change(s2[i])] --;
if( HashTable[change(s2[i])] < 0)
miss ++;
}
if(miss > 0) //第一串中没有第二串的材料//
printf("No %d" , miss);
else
printf("Yes %d" , len - len2);
return 0;
}
1040:有几个PAT(25)(AC)
注意要点:
1.这个题的思路很巧妙。利用PAT三个数之间的关系来解决问题。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[100005];
scanf("%s",s);
int len = strlen(s),t=0,p=0,sum=0;
for(int i=0;i<len;i++){
if(s[i]=='T'){
t++;
}
}
for(int i=0;i<len;i++){
if(s[i]=='T') t--;
if(s[i]=='P') p++;
if(s[i]=='A') sum=(sum+(t*p)%1000000007)%1000000007;//有点问题。//
}
printf("%d",sum);
return 0;
}
1041:考试座位号(15 分)(AC)
注意要点:
1.结构体问题。怪不得上次天梯赛的那个题目会是那个样子,原来如此。using namespace std 会出现撞车的情况报错,显示已经定义过。redeclared as different kind of symbol。
#include<iostream>
using namespace std;//撞车//
struct Std{
char s[20];
int a ;
int b ;
}sd[1005];//这个地方写成会与上面撞车。//
int main() {
int N , M;
int P[1005] = {0};
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
scanf("%s %d %d" , sd[i].s , &sd[i].a , &sd[i].b);
}
getchar();
scanf("%d" , &M);
for(int i = 0 ; i < M ; i ++) {
scanf("%d" , &P[i]);
}
for(int i = 0 ; i < M ; i ++) {
for(int j = 0 ; j < N ;j ++) {
if(P[i] == sd[j].a)
printf("%s %d\n", sd[j].s , sd[j].b);
}
}
return 0;
}
1042:字符统计(20 分)(AC)
注意要点:
1.按照最小的怎么来?去掉等于号就可以了。
#include<iostream>
using namespace std;
int main() {
char a , d;
int max = -10000;
int b[30] = { 0 };
while(scanf("%c" , &a) == 1) {
if(a >= 'a' && a <= 'z' )
b[a - 'a'] ++;
if(a >= 'A' && a <= 'Z')
b[a - 'A'] ++;
}
for(int i = 0 ; i < 27 ; i ++) {
if(b[i] > max) {
max = b[i] ;
d = i;
}
}
printf("%c %d" , d + 'a' , max);
return 0;
}
1043:输出PATest(20 分)(AC)
注意要点:
1.while scanf写法注意符号“&”的控制。
2.这个输出的思路很精妙。
3.平行Hash技巧。可以省去很多的麻烦。
#include<iostream>
using namespace std;
int main() {
char a , b[6] = {'P' , 'A' , 'T' , 'e' , 's' , 't'};
int c[6] = { 0 };
int sum = 0;
while(scanf("%c" , &a) == 1) {
for(int i = 0 ; i < 6 ; i ++) {
if(a == b[i]) {
c[i] ++;
sum ++;
}
}
}
while(sum > 0) {
for(int i = 0 ; i < 6 ; i ++) {
if(c[i] > 0) {
printf("%c" , b[i]);
c[i] --;
sum --;
}
}
}
return 0;
}
1045:Quick Sort(25 分)(AC)
注意要点:
1.思路很清晰,但是这个地方可以利用这个小技巧,因为你每次前面的数据就是这个这个最小值了,所以完全没有必要每次都去遍历前面的数据,直接可以与上一个数据进行比较就行。
2.本题目和QS完全没有任何关系,倒像是在给你介绍QS的原理。
2.这个地方注意有个坑,最后需要输出一个回车。我其实很费解这个东西。以后建议所有的题目之后都去写一个回车以防万一。
#include<iostream>
#include<algorithm>
using namespace std;
const int INF = 1000000000;
int main() {
int N , sum = 0;
int a[100005] = {0};
int leftmax[100005] = {0};
int rightmin[100005] = {0};
//input//
scanf("%d" , &N);
leftmax[0] = 0;
rightmin[N - 1] = INF;
for(int i = 0 ; i < N ; i ++) {
scanf("%d" , &a[i]);
}
//leftmax:可修正,其实完全不必每次都把数据遍历一次//
for(int i = 1 ; i < N ; i ++) {
leftmax[i] = max(leftmax[i - 1] , a[i - 1]);
}
//rightmin,这个地方你想,如果要是N - 1 的话,N - 1 + 1 不就翻出数组外头去了。。//
for(int i = N - 2; i >= 0 ; i --) {
rightmin[i] = min(rightmin[i + 1] , a[i + 1]);
}
//statistic//
for(int i = 0 ; i < N ; i ++) {
if(a[i] > leftmax[i] && a[i] < rightmin[i]) {
sum ++;
}
}
//output//
printf("%d\n" , sum);
for(int i = 0 ; i < N ; i ++) {
if(a[i] > leftmax[i] && a[i] < rightmin[i]) {
printf("%d" , a[i]);
sum--;
if(sum != 0) printf(" ");
}
}
printf("\n");//无厘头的要求。//
return 0;
}
1046:划拳(15 分)(AC)
水题没啥说的。
#include<iostream>
using namespace std;
int main(){
int N , x = 0, y = 0;
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
int s[4] = {0};
for(int j = 0 ; j < 4 ; j ++ ) {
scanf("%d" , &s[j]);
}
//如果两个人都赢了,或者都输了 ,下一轮//
if(s[0] + s[2] == s[1] && s[0] + s[2] == s[3]) continue;
if(s[0] + s[2] != s[1] && s[0] + s[2] != s[3]) continue;
//甲赢了 乙喝酒//
if(s[0] + s[2] == s[1]) x ++;
//乙赢了 甲喝酒//
if(s[0] + s[2] == s[3]) y ++;
}
printf("%d %d" , y , x);
return 0;
}
1047:编程团体赛(20 分)
注意要点:
1.注意题目给的范围,在此基础之上增加一点即可,但是注意一定要大。(+ 5即可。)
#include<iostream>
using namespace std;
int main() {
int N;
int grade[1005] = { 0 };//注意范围大小//
int max1 = -10000 , max2 = -1000;
int x , y, z;
scanf("%d" , &N);
while(N --) {
scanf("%d-%d %d" , &x , &y , &z);
grade[x] += z ;
if(grade[x] > max1) {
max1 = grade[x];
max2 = x;
}
}
printf("%d %d" , max2 , max1);
return 0;
}
1052:卖个萌(20 分)(AC)(01:21:33)
注意要点:
1.AC了两次老是报错,后来才发现是根本写不出来这几个字符。
2.更加高级一点的 string 用法。加深了一遍印象。
3.注意出现的转义字符的用法。
#include<iostream>
#include<cstring>
using namespace std;
int get(string a , string b[]) {
int k = 0 ;
for(int i = 0 ; i < a.size() ; i ++) {
if(a[i] != '[' && a[i] != ']' && a[i] != ' ') {
b[k] += a[i];//这一步是为什么?//
}
if(a[i] == ']')
k ++;
}
return k;
}
string s[3];//这个地方是三个string.//
string shou[15] , yan[15] , kou[15];
int main() {
for(int i = 0 ; i < 3 ; i ++) {
getline(cin , s[i]);
}
int len1 = get(s[0] , shou);
int len2 = get(s[1] , yan);
int len3 = get(s[2] , kou);
int N ;
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
int face [5] = { 0 };
for(int j = 0 ; j < 5 ; j ++) {
cin >> face[j] ;
}
if(face[0]> len1 || face[1] >len2 || face[2] > len3 || face[3] > len2 || face[4] > len1 || face[0] <= 0 || face[1] <= 0 || face[2] <= 0 || face[3] <= 0 || face[4] <= 0) {
cout << "Are you kidding me? @\\/@" << endl;//这个地方的转义字符//
}
else {
cout << shou[face[0] - 1] << "(" << yan[face[1] - 1] << kou[face[2] - 1] << yan[face[3] - 1] << ")" << shou[face[4] - 1] << endl;
}
}
return 0;
}
1056:组合数的和(15 分)(AC)
注意要点:
无。
#include<iostream>
using namespace std;
int main() {
int N;
int sum = 0;
int a[15] = { 0 };
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
scanf("%d" , &a[i]);
}
for(int i = 0 ; i < N ; i ++) {
for(int j = 0 ; j < N ; j ++) {
if(i != j) sum += a[i]*10 + a[j];
}
}
printf("%d" , sum);
return 0;
}
1057:数零壹(20 分)(AC)
注意要点:
1.注意那个判断二进制的问题。do while 不行的原因就是它会先做,所以需要用while。
#include<iostream>
#include<cstring>
using namespace std;
int m = 0 , n = 0;
int main() {
int sum = 0;
char a;
while(scanf("%c" , &a) == 1){
if(a >= 'A' && a <= 'Z') {
sum += (a - 'A' + 1) ;
}
if(a >= 'a' && a <= 'z'){
sum += (a - 'a' + 1);
}
}
while(sum != 0) {
if(sum % 2 == 0) m ++;
else n ++;
sum = sum / 2;
}
printf("%d %d" , m , n);
return 0;
}
1059:C语言竞赛(20 分)(AC)
注意要点:
1.送巧克力的记得也别再要了。
#include<iostream>
using namespace std;
int isprime(int i) {
if(i <= 0) return false;
for(int j = 2 ; j * j <= i ; j ++){
if(i % j == 0) return false;
}
return true;
}
int main() {
int M , N , d;
int name[10005] = {0};
int judge[10005] = {0};
scanf("%d" , &M);
for(int i = 1 ; i <= M ; i ++) {
scanf("%d" , &name[i]);
judge[name[i]] = i;
}
scanf("%d" , &N);
for(int i = 1 ; i <= N ; i ++) {
scanf("%d" , &d);
if(judge[d] == 1){
printf("%04d: Mystery Award\n" , d);
judge[d] = -1;
}//神秘大奖//
else if(isprime(judge[d]) == 1) {
printf("%04d: Minion\n" , d);
judge[d] = -1;
}//小黄人//
else if(judge[d] == -1){
printf("%04d: Checked\n" , d);
} //已经领过//
else if(judge[d] == 0) {
printf("%04d: Are you kidding?\n" , d);
}//没参与//
else {printf("%04d: Chocolate\n" , d);//巧克力//
judge[d] = -1; //#少加一个判断//
}
}
return 0;
}
1060:爱丁顿数(25 分)(AC)
注意要点:
1.sort 的用法出现了,cmp1。
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp1(int a , int b) {
return a > b;
}
int main() {
int N , i;
int a[100000] ;
scanf("%d" , &N);
for(int i = 1 ; i <= N ; i ++) {
scanf("%d" , &a[i]);
}
sort(a + 1 , a + N + 1, cmp1);
i = 1;
int count =0 ;
while( i <= N && a[i] > i) {
i++;
count++;
}
printf("%d" , count);
return 0;
}
1061:判断题(15 分)
注意要点:一行写完之后,不能有语法错误。快准狠。
#include<iostream>
using namespace std;
int main() {
int M , N;
int c , sum = 0;
int a[100] = { 0 };
int b[100] = { 0 };
scanf("%d %d" , &M , &N);
for(int i = 0 ; i < N ; i ++) {
scanf("%d" , &a[i]);
}
for(int i = 0 ; i < N ; i ++) {
scanf("%d" , &b[i]);
}
for(int i = 0 ; i < M ; i ++) {
for(int j = 0 ; j < N ; j ++) {
scanf("%d" , &c);
if(c == b[j]) {
sum += a[j];
}
}
printf("%d\n" , sum);
sum = 0;
}
return 0;
}
1062:最简分数(20 分)
注意要点:
1.辗转相除法的使用。
2.强调思路的重要性。先写主函数,主函数框架思路搭好,补充其他函数就行。
3.题目,每个题目每句话必有用。两个数字大小还能不一样,真的服了。
#include<iostream>
using namespace std;
int gcd(int a , int b) {
if(b == 0) return a;
else gcd(b , a % b);
}
int lcm (int b , int d , int e) {
int f , h;
f = gcd(b , d);
f = b / f * d;
h = gcd(f , e);
h = f / h * e;
return h;
}
int main() {
//先找最小公倍数//
int a , b , c , d , e;
int count = 0;
int g[1005] = {0} ;
scanf("%d/%d %d/%d %d" , &a , &b , &c , &d , &e);
int f = lcm(b , d , e);
// 变换分子//
a = f / b * a ;
c = f / d * c ;
//踩坑点:有可能两个正分数大小不等//
if(a > c){
int temp = a; a = c; c = temp;
temp = b; b = d; d = temp;
}
//分子分母变换,余数不为 0 则输出//
for(int i = a + 1 ; i < c ; i ++) {
if(f % e == 0){
if(i % (f / e) == 0 && gcd(i / (f / e) , e) == 1) {
g[count ++] = i / (f / e);
}
}
}
for(int i = 0 ; i < count ; i ++) {
if(i == count - 1) {
printf("%d/%d" , g[i] , e);
break;
}
printf("%d/%d " , g[i] , e);
}
return 0;
}
1063:计算谱半径(20 分)(AC)
注意要点:
1.注意开方函数 sqrt, 没了。
2.此题有一个疑点尚未解决,那就是四舍五入的问题。
#include<iostream>
#include<math.h>
using namespace std;
double fun(int a , int b) {
return sqrt(a * a + b * b);//注意四舍五入和开方用法//
}
int main() {
int N , a , b;
double max = -1000.0;
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
scanf("%d%d" , &a , &b);
if(fun(a , b) > max) {
max = fun(a , b);
}
}
printf("%.2f" , max);
return 0;
}
1064:朋友数(20 分)(AC)
注意要点:
1.注意看输出的内容。
#include<iostream>
#include<cstring>
using namespace std;
int main() {
int N , sum = 0 , count = 0;
int d[100] = { 0 };
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
char a[1005];
scanf("%s" , a);
int len = strlen(a);
for(int j = 0 ; j < len ; j ++) {
sum += (a[j] - '0');
}
d[sum] = 1 ;
sum = 0;
}
for(int i = 0 ; i < 99 ; i ++) {
if(d[i] == 1) count ++;
}
printf("%d\n" , count);
for(int i = 0 ; i < 99 ; i ++) {
if(d[i] == 1) {
printf("%d" , i );
count--;
if(count != 0)
printf(" ");
}
}
return 0;
}
1065:单身狗(25 分)(AC)
注意要点:
1.呵呵,这个题目真的侥幸,没有让输出 00000,要不然拿不了满分。
2.注意补齐0的写法:在输出的前面写上,%05d。0代表占位格,5代表个数。
#include<iostream>
using namespace std;
int main() {
int N , d , e ,count = 0;
int a[100005] = { 0 }, c[100005] = { 0 };
//输入//
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
scanf("%05d%05d" , &d , &e);
a[d] = 1;
a[e] = 1;
c[d] = e;
c[e] = d;
}
scanf("%d" , &N);
for(int i = 0 ; i < N ; i ++) {
scanf("%05d" , &d);
a[d] = 2;
}
//数数值//
for(int i = 0 ; i < 100005 ; i ++) {
if(a[i] == 2) count ++;
}
//判断条件是否成立//
for(int i = 0 ; i < 100005 ; i ++) {
if(a[i] == 2 && a[c[i]] == 2) {
a[i] = 1;
a[c[i]] = 1;
count -= 2;
}
}
//输出//
printf("%d\n" , count);
for(int i = 0 ; i < 100005 ; i ++) {
if(a[i] == 2) {
printf("%05d" , i);
count -- ;
if(count != 0) printf(" ");
}
}
return 0;
}
1066:图像过滤(15 分)(AC)
注意要点:
1.注意数组开辟的时候的定义。
#include<iostream>
using namespace std;
int main() {
int M , N , A , B , h;
int d[505][505] = { 0 };//注意//
scanf("%d%d%d%d%d" , &M , &N , &A , &B , &h);
for(int i = 0 ; i < M ; i ++) {
for(int j = 0 ; j < N ; j ++) {
scanf("%d" , &d[i][j]);
if(A <= d[i][j] && d[i][j] <= B) {
d[i][j] = h;
}
}
}
for(int i = 0 ; i < M ; i ++) {
for(int j = 0 ; j < N ; j ++) {
if(j == N - 1)
printf("%03d\n" , d[i][j]);
else
printf("%03d " , d[i][j]);
}
}
return 0;
}
1067:试密码(20 分)(AC)
注意要点:
1.首次使用getline放在循环里使用。getline现在还不会对string类进行操作,会了的话可以代替 %s 了。
#include<iostream>
#include<cstring>
using namespace std;
int main() {
string a , b;
int N , c = 0 , sum = 0;
cin >>a>>N;
getchar();
while(getline(cin , b)) {
if(b == "#") break;
if(a != b && c != 1){
cout<<"Wrong password: "<<b<<endl;
sum ++;
}
else c = 1;
}
if(sum == N){
printf("Account locked\n");
}
if(c == 1 && sum != N) {
printf("Welcome in\n");
}
return 0;
}
1076:Wifi密码(15 分)(AC)
注意要点:
1.map的头文件是 #include <map> ,仅仅只是演示了一下map 的用法。其实就是映射(数组),没有什么。
#include<iostream>
#include<map>
using namespace std;
int main(){
map<char , int>a;
a['A'] = 1;
a['B'] = 2;
a['C'] = 3;
a['D'] = 4;
int N;
char c , b;
int print[105] = { 0 };
scanf("%d",&N);
getchar();
for(int i = 1; i <= N; i ++) {
for(int j = 1; j <= 4; j ++) {
scanf( "%c-%c" , &c , &b);
getchar();
if( b == 'T')
print[i] = a[c];
}
}
for( int i = 1;i <= N ; i++) {
printf( "%d" , print[i]);
}
return 0;
}
1078:字符串压缩与解压(20 分)(AC)
注意要点:
1.getline。getline有点类似于gets,作用于string之上。晚上补一个博客链接。getline()
2.这个题目分成两种形态做比较舒服。各管各的,不需要多操心。
#include<iostream>
#include<cstring>
using namespace std;
string a;
void fun1(){
getline(cin,a);
for(int i = 0; i <a.length() ; i ++){
int num = 0;
while(a[i]==a[i+1]){
i++;
num++;
}
if(num != 0){
printf("%d" , num+1);
}
printf("%c" , a[i]);
}
}
void fun2(){
getline(cin , a) ;
for(int i=0 ; i < a.length() ; i ++){
int sum = 0 ;
while( a[i] >= '0' && a[i] <= '9'){
sum = sum * 10 + (a[i ++] - '0') ;
}
for(int j = 0 ; j < sum ; j++){
printf("%c" , a[i]) ;
}
if(sum == 0){
printf("%c" , a[i]);
}
}
}
int main(){
char N;
scanf("%c" , &N);
getchar();
if(N=='C') fun1();
else fun2();
printf("\n");
return 0;
}
1081:检查密码(15 分)(已完成)
注意要点:
1.小心为空,这次之后%s可能会换成getline了。
2.如何查找一个字符串中是否没有一个东西?答:设置一个标记。定义的时候记得放在循环里面。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int N;
int m1 = 0,m2 = 0,m4 = 0;
string a;
scanf("%d", &N);
getchar();
while(N --) {
int m1 = 0,m2 = 0,m4 = 0;
getline(cin,a);
int s = a.length();
//密码太短
if(s < 6) {
printf("Your password is tai duan le.\n");
continue;
}
for(int i = 0; i < s; i ++){
if(a[i] >= '0'&& a[i] <= '9') m1 = 1;
else if(a[i] >= 'a' && a[i] <='z') m2 = 1;
else if(a[i] >= 'A' && a[i] <='Z') m2 = 1;
else if(a[i] == '.') ;
else m4 = 1;
}
if(m2 == 0) {
printf("Your password needs zi mu.\n");
continue;
}
if(m1 == 0) {
printf("Your password needs shu zi.\n");
continue;
}
if(m4 == 1) {
printf("Your password is tai luan le.\n");
continue;
}
//密码合法
printf("Your password is wan mei.\n");
}
return 0;
}
1082:射击比赛(20 分)(已完成)
注意要点:
1.复习结构体。上次踩过的坑不要再踩一次。
2.string 和 char 字符串不是一个概念,不能混用,且string.h下的函数也不能使用。
3.复习结构体的strcpy函数。
#include<iostream>
#include<cstring>
using namespace std;
struct per{
char id[1005];
int x;
int y;
}P;
int main() {
int N;
char idmax[1000],idmin[1005];
scanf("%d" , &N);
int max = -10000 , min = 10000;
while(N --) {
scanf("%s" , P.id);
getchar();
scanf("%d%d" , &P.x , &P.y);
if(P.x * P.x + P.y * P.y >= max) {
max = P.x * P.x + P.y * P.y;
strcpy(idmax , P.id);
}
if(P.x * P.x + P.y * P.y <= min) {
min = P.x * P.x + P.y * P.y;
strcpy(idmin , P.id);
}
}
printf("%s %s" , idmin , idmax);
return 0;
}
1083:是否存在相等的差(20 分)(已完成,需要补充函数)
注意要点:
1.小心0的情况。这些特殊的观察点一定要注意到,否则不容易想出。
2.针对函数可以在优化,我是不太了解algorithm下的函数变化,随后补充函数abs等等。
#include<iostream>
using namespace std;
int absa(int a, int b) {
if(a >= b) return a - b ;
else return b - a ;
}
int main() {
int N , n;
int count[10005] = { 0 };
scanf("%d" , &N);
for(int i = 1; i <= N ; i ++) {
scanf("%d" , &n);
count[absa(n , i)] ++;
}
for(int i = N ; i >= 0 ; i --){
if(count[i] != 0 && count [i] >= 2) {
printf("%d %d\n" , i , count[i]);
}
}
return 0;
}
1091:N-自守数 (15 分)(AC)
这次之后,感觉风格更偏向函数化编程了。
#include<iostream>
#include<vector>
using namespace std;
int sum_s(int a){
int s = 0;
while(a > 0){
s ++;
a /= 10;
}
return s;
}
bool ans(int a , int j){
vector<int> v;
int answer = j * a * a;
while(answer > 0){
v.push_back(answer % 10);
answer /= 10;
}
int s = sum_s(a);
if(s == 1 && v[0] == a){
return true;
}
else if(v[1] * 10 + v[0] == a && s == 2){
return true;
}
else if(s == 3 && v[2] * 100 + v[1] * 10 + v[0] == a){
return true;
}
else if(s == 4 && v[3] * 1000 + v[2] * 100 + v[1] * 10 + v[0] == a){
return true;
}
else{
return false;
}
}
int main(){
int M , num[25];
scanf("%d" , &M);
for(int i = 0 ; i < M ; i ++){
scanf("%d" , &num[i]);
}
for(int i = 0 ; i < M ; i ++){
bool flag = false;
for(int j = 1 ; j < 10 ; j ++){
if(ans(num[i] , j) == true){
printf("%d %d\n" , j , j * num[i] * num[i]);
flag = true;
break;
}
}
if(flag == false){
printf("No\n");
}
}
return 0;
}
1093 字符串A+B (20 分)
注意要点:
1.对于string类型的可以直接使用循环,而且用法类似于char类型,除了不能使用printf()以外。
#include<iostream>
#include<string.h>
using namespace std;
bool judge[150] = {false};
void print(string a){
for(int i = 0 ; i < a.length() ; i ++){
if(judge[a[i] - '0'] == false){
cout << a[i];
judge[a[i] - '0'] = true;
}
}
}
int main(){
string a , b;
getline(cin , a);
getline(cin , b);
print(a);
print(b);
return 0;
}