編程競賽真題
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int n,i,j;
char p[10000];
while(scanf("%d",&n)!=EOF)
{
getchar();
for(i=0;i<n;i++)
{
gets(p);
putchar(p[0]);
for(j=1;j<strlen(p);j++)
printf(" %c",p[j]);
printf("\n");
}
}
}
❷ 高中水平編程競賽題目一道
貪心
先排序,每次選擇最高的物品(因為無論怎麼選擇都要爬最高的物品),去掉相鄰的物品,再找此高物品,以此類推。
❸ 一道C#奧林匹克編程題
對題目的問題:
(b1, b2,... bm -1, bm)
這個命令,是指的必須從位置1到位置m變換,還是可以從位置i+1到位置i+m變換?這很關鍵
❹ C語言 編程題目 程序設計題目 高中信息科技競賽編程題目 【100分】
【第一道】
#include <iostream>
using namespace std;
#define pi 3.14159265
double maxvolume(double a,double b)
{
double v1,v2,r;
r=b/(2*pi+2);
v1=pi*r*r*a;
r=a/(2*pi+2);
v2=pi*r*r*b;
if(v1>v2)
return v1;
else
return v2;
}
int main()
{
double a,b;
cout<<"請輸入矩形的長寬:";
cin>>a;
cin>>b;
cout<<"最大圓柱體積:"<<maxvolume(a,b)<<endl;
return 0;
}
【第二道】
//事實上,塗色方案不止樣例上的一種,我把所有的可行方案都輸出了一下
#include <iostream>
using namespace std;
int data[][8]={ {0},
{0,0,1,0,0,0,1,1},
{0,1,0,1,1,1,1,0},
{0,0,1,0,1,0,0,0},
{0,0,1,1,0,1,0,0},
{0,0,1,0,1,0,1,0},
{0,1,1,0,0,1,0,1},
{0,1,0,0,0,0,1,0}
};
int total;
int color[8];
char COLOR[5]={' ','R','Y','B','W'};
void output()
{
total++;
cout<<"["<<total<<"]\t";
for(int i=1;i<=7;i++)
{
cout.width(2);
cout<<COLOR[color[i]];
}
cout<<endl;
}
bool checkcolor(int s)
{
for(int i=1;i<=7;i++)
{
if(data[i][s]==1&&color[i]==color[s])
return false;
}
return true;
}
void drawcolor(int s)
{
if(s>7)
output();
else
for(int i=1;i<=4;i++)
{
color[s]=i;
if(checkcolor(s))
drawcolor(s+1);
}
}
int main()
{
cout<<" \t";
for(int i=1;i<=7;i++)
{
cout.width(2);
cout<<i;
}
cout<<endl;
drawcolor(1);
cout<<endl<<" \t塗色方案總數:"<<total<<endl<<endl;
return 0;
}
❺ C語言編程,藍橋杯的真題,有C來解答
int t1=x[0]==0||x[1]==1;
//如果A參加,B也參加
???
❻ c語言程序設計大賽試題
我寫了個程序,不知道能達到你的要求不?
主要的演算法思路是若輸入的數不能被11整除,就先用一個數組將輸入數的每一位存起來,然後通過交換數組元素的位置達到重新排列數的目的,每次只需交換數組中兩個元素的位置即可,交換(即)重新排列後再將數組合,判斷能否被11整除,不能則繼續循環。
#include<stdio.h>
int main()
{
int num;
printf( "Please input your number:" );
scanf( "%d", &num );
if( num % 11 == 0 )
{
printf( "%d\n", num );
}
else
{
int a[10] = {0};
int ti = 10, i = 0, nable = 0;
while( num / ti != 0 )
{
a[i] = num % ti;
i++;
num = num / ti;
}
a[i] = num;
for(int k = i; k >= 0; k-- )
{
for(int j = 0; j < k; j++)
{
int temp, m = 0;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
for(int t = 0; t <= i; t++)
m = m * 10 + a[t];
if( m % 11 == 0)
{
printf( "%d\n", m );
nable = 1;
break;
}
}
if(nable == 1)
break;
}
if(nable == 0)
printf("Your number is undivisible!\n");
}
return 0;
}
❼ 關於編程大賽的一道題目,一個正整數有可能可以被表示為n(n>=2)個連續正整數之和,找出這樣的數並輸出!
這個問題看起來不是很簡單,需要設計一個演算法:
先講數學:
設:
an=a+(n-1)*d(這里d=1)
a1=a
an=a+n-1
sn=(a1+an)n/2=(2a-1+n)/2
再回到這個編程上來:
我們的輸入數據其實就是sn,需要找到以a開始的n個連續的遞增數列使得和為sn。
這里我們可以用循環來判定,給定一個n,sn已知,就可以求出a,如果a為正整數那麼就可以找到等差數列的首項,加上n給定,d=1,那麼就可以寫出這個和式子。
代碼如下:
#include<stdio.h>
voidmain()
{
intinput,i,n,flag;
floata;//等差數列的首項不一定為整數
flag=0;
printf("輸入判斷的整數: ");
scanf("%d",&input);
for(n=2;n<=input;n++)
{
a=(2*input+n-n*n)/(2.0*n);//求的首項
if(int(a)==a&&a>0)//如果為整整數,則滿足要求
{
printf("%d=%d",input,int(a));//輸出的序列為整數,a實質是整數,那麼強制轉化類型不影響結果
for(i=1;i<=n-1;i++)
printf("+%d",int(a+i));//等差數列的其他項也為整數,a+i實質是整數,裝換類型
printf(" ");
flag++;//flag記錄滿足要求的數列數
}
}
if(flag==0)//flag初始為0,通過上面的循環,如果有滿足的在則不為0,為0則說明不能寫成等差數列
printf("%d不能被表示成n連續正整數之和 ",input);
}