第七屆ACM程式設計競賽 (SDIBT)
1.淘氣的蠟筆小鑫
蠟筆小鑫真是又閒又淘氣,他看到走廊上的燈都是滅的,就跑過去搗亂。每個燈泡都有自己的開關,用來控制燈的狀態(開或者關)。如果燈滅了,按一下開關即開燈,再按一次即關燈。假設走廊裡有n個燈泡,蠟筆小鑫就沿著走廊來回走n次。每次都是沿走廊走下去然後再回來,並且當他在走第i次時,都會按一下所有位置可被i整除的燈的開關(每次他都只在去的時候按下開關,回來的時候未進行任何操作),例如:n=8,i=3時,他在走第3次的時候按下了序號為3和6的燈的開關。他想知道最後一個燈泡的最終狀態到底是開還是關,你能幫幫他嗎?
Input輸入包含一個正整數n(n≤232-1),表示蠟筆小鑫沿著走廊來回走了n次。
Output輸出單行結果,如果最後一個燈泡是開的,輸出“yes”,否則,輸出“no”。
Sample Input
3
6241
8191
Sample Output
no
yes
no
#include <stdio.h> #include <string.h> int main() { int n,a[10000],i,j; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) if(i%j==0) { if(a[i]==0) a[i]=1; else a[i]=0; } } if(a[n]==1) printf("yes\n"); else printf("no\n"); } return 0; }
(暴力肯定時間超限,下面是簡單做法,直接判斷因子個數)
#include<stdio.h> #include <math.h> int main() { int n,i,k; while(~scanf("%d",&n)) { int ans=0; k=sqrt(n); for(i=1;i<k;i++) if(n%i==0) ans+=2; if(k*k==n) ans++; if(ans%2==0) printf("no\n"); else printf("yes\n"); } return 0; }
2.
今天是星期三,是本週的第三天,明天是2015年的最後一天。在2016年,小壯打算買些水晶玫瑰花送給他的女朋友!他設計了兩種購買方案。第一種方案是在每週固定的某天購買一枝水晶玫瑰,第二種方案是在每月固定的某天購買一枝。他只可選擇其中一種方案。小壯想知道他在2016年總共能買多少枝水晶玫瑰,小壯笨笨的,你能幫幫他嗎?
Input
輸入只可能有兩種格式:
(1)"x of week" ,(1 ≤ x ≤ 7),即在每週的第X天購買一枝水晶玫瑰花。
(2)"x of month" ,(1 ≤ x ≤ 31),即在每月的第X天購買一枝水晶玫瑰花。
Output
輸出單行,表示小壯在2016年所購買的水晶玫瑰的總數。
Sample Input
4 of week
30 of month
Sample Output
52
11
是否是閏年的判斷方法(year%4==0&&year%100!=0||year%400==0)
所以2016是閏年,2月29天,平年2月28天
#include <stdio.h>
int main()
{
int a[14]={0,31,29,31,30,31,30,31,31,30,31,30,31},i,n,sum=0;
char s[10];
while(~scanf("%d",&n))
{
sum=0;
getchar();
gets(s);
if(s[3]=='w')
{
if(n==5||n==6)(2016年第一天是星期5,366%7=2)
sum=53;
else
sum=52;
}
if(s[3]=='m')
{
for(i=1;i<=12;i++)
if(n<=a[i])
sum++;
}
printf("%d\n",sum);
}
return 0;
}
3.小茜的減肥之路
今天,多年未見的小鈞和小江在街頭偶遇,小江想看看當年那個蠢蠢的小鈞有沒有變聰明一些,他靈機一動,說:“當初小茜立了個flag,說一定要減肥,她想著第一天跑一米,第二天跑兩米,第三天跑三米……第n天跑n米。我問你,小茜一共跑了多少米。”小鈞左思右想,就是想不出來,他心底暗罵小茜,沒事立什麼flag!但是他並不想讓小江看扁,所以想請你偷偷地幫忙算一下小茜這n天一共跑了多少米,小鈞傻傻的,你能幫幫他嗎?
Input
輸入一個整數n(n<109),表示跑了n天。
Output
輸出單行結果,表示總共跑了多少米。
Sample Input
6
Sample Output
21
正常寫肯定時間超限,用求和公式
#include<stdio.h>
int main()
{
long long int n,s;
scanf("%lld",&n);
s=n*(n+1)/2;
printf("%lld\n",s);
return 0;
}
4.(水題)
抗戰時期,小飛作為特工,成功打入了敵方內部,為我方提供了許多關鍵性的情報。為了防止電報被截而洩露機密,小飛和他的聯絡人小琿制定了一個密碼本,內容如下:電報中的0實際上是2,1實際就是1,2實際是1/2,4實際是1/4,8實際是1/8,16實際是1/16。小飛的聯絡人小琿,專門負責翻譯他的電報,並計算翻譯過後的實際數字的加和,便能懂得小飛想傳達的資訊。可今天小琿比較忙,你作為他的助理,哈哈~那就請你按照規定進行求和叭~你能幫幫他嗎?
Input
第一行輸入一個數字N(1≤N≤2000),表示電報中數字的數量;
第二行輸入N個數字,表示電報中的數字;
Output輸出單行結果,即按規定計算出的加和(保留四位小數)。
Sample Input
10
1 2 2 2 1 4 4 8 8 16
Sample Output
4.3125
#include <stdio.h>
int main()
{
int i,n,a[100000];
double s=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)
s+=2;
else
if(a[i]==2||a[i]==4||a[i]==8||a[i]==16)
s+=(double)1/a[i];
else
s+=a[i];
}
printf("%.4lf\n",s);
return 0;
}
5.
有人送了苗苗一個小火車的玩具,小火車由n個車廂組成,按順序從1到n編號(所有車輛的編號都是不同的)。有天,她一不小心,哎呀!把小火車的車廂順序都給搞亂了,這可怎麼辦呀!她只希望能夠按照編號從小到大的順序重新排列,可是她每次只能將其中兩節車廂的位置互相交換,這繞來繞去的可把她給繞暈了啊。她實在是太懶了,只想儘可能少的移動車廂。苗苗想知道最少的移動次數,你能幫幫她嗎?
Input
第一行為一個正整數n(n<1000),表示有n節車廂。
第二行為n個正整數,用空格分開,表示目前車廂序號的排列情況。
Output
輸出單行結果,表示至少交換多少次,才能完成排序。
Sample Input
5
3 1 2 5 4
Sample Output
3
(直接i跟i+1後面的最小交換)
#include <stdio.h>
int a[10000];
int YANG(int j,int n)
{
int min=1000,i,c;
for(i=j;i<n;i++)
if(a[i]<min)
{
min=a[i];
c=i;
}
return c;
}
int main()
{
int n,i,s=0,j,t;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
int c=YANG(j,n);
if(a[i]>a[c])
{
t=a[i];
a[i]=a[c];
a[c]=t;
s++;
}
}
printf("%d",s);
return 0;
}
6.
Marjar Cola上市啦!!!為了吸引更多的顧客,吃貨公司的老闆小茜決定推出一項活動:集齊x個空瓶或y個瓶蓋,即可召喚神龍,免費獲得一瓶完整的Marjar Cola!!!WoW~哇哦!!!!
而現在呢,小斯最初有a個空的可樂瓶和b個可樂瓶蓋,他想盡可能多喝可樂(喝窮他!)。他想知道自己可以喝到幾瓶Marjar Cola,你能幫幫他嗎?
請注意:小斯只去吃貨公司買可樂,一瓶可樂也只包含一個可樂瓶和一個瓶蓋。並且小斯最初的可樂瓶和可樂蓋都是別人給的,不算自己喝的。
Input
輸入包括4個數,x,y,a,b(1 ≤ x, y, a, b ≤ 100)。
Output
輸出單行結果,小斯可以喝到幾瓶可樂,若為無數瓶,則輸出“INF”。
Sample Input
1 3 1 1
4 3 6 4
Sample Output
INF
4
#include <stdio.h>
int main()
{
int x,y,a,b,i;
while(~scanf("%d%d%d%d",&x,&y,&a,&b))
{
if(x==1||y==1)
{
printf("INF\n");
continue;
}
int s=0;i=0;
while(1)
{
if(a>=x)
{
s+=a/x;
b+=a/x;
a=a%x+a/x;
}
if(b>=y)
{
s+=b/y;
a+=b/y;
b=b/y+b%y;
}
if(a<x&&b<y)
break;
i++;
if(i>1000)
break;
}
if(i>=1000)
printf("INF\n");
else
printf("%d\n",s);
}
return 0;
}
7.
大家都知道實驗室裡小莉,小晨和小芹是非常非常要好的朋友,但是最近呢,這三個人感覺真的是太無聊太無聊太無聊了!有天,小莉突發奇想,想來測試一下她們仨的默契程度。她們三個人每人都自己找了一個矩形的木板,看這三個木板能不能拼成一個正方形。如果能,那就代表著她們真是的很有很有默契的咯~如果不能,或許就沒有那麼有默契辣。這可把小莉愁壞了啊,她們到底有沒有默契呀?你能幫幫她嗎?
Input
輸入包括三行,第一行代表第一個矩形的長h(h<1000)和寬w(w<1000),第二行代表第二個矩形的長h(h<1000)和寬w(w<1000),第三行代表第三個矩形的長h(h<1000)和寬w(w<1000)。
Output
輸出單行結果,如果有默契請輸出“YES”,否則輸出“NO”,輸出沒有雙引號。
Sample Input
8 2
1 6
7 6
Sample Output
YES
總是不對 找到後臺 問題出在了7 5 7 5 10 3上,後臺沒有2 2 2 2 2 2這組資料
思路:先對結構體進行排序,最大的在第一列,而且按從大到小排,判斷最後兩組資料有沒有相加等於最大的數,而且剩下的兩個數是不是相等,且與第二個資料相加是不是等於第一個數。
注意:判斷三個數是否想等,不能用2個連等號。
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct XY
{
int x,y;
}s[3];
bool cmp(struct XY a,struct XY b)
{
return a.x>b.x;
}
int main()
{
int i,t,z=0;
for(i=0;i<3;i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
if(s[i].x<s[i].y)
{
t=s[i].x;
s[i].x=s[i].y;
s[i].y=t;
}
}
if(s[0].x==s[1].x&&s[1].x==s[2].x&&s[0].y==s[1].y&&s[1].y==s[2].y&&s[0].x!=s[0].y)
printf("YES\n");
sort(s,s+3,cmp);
if(s[1].x+s[2].x==s[0].x)
{
if(s[1].y==s[2].y&&s[1].y+s[0].y==s[0].x)
z++;
}
if(s[1].x+s[2].y==s[0].x)
{
if(s[2].x==s[1].y&&s[1].y+s[0].y==s[0].x)
z++;
}
if(s[2].y+s[1].y==s[0].x)
{
if(s[1].x==s[2].x&&s[1].x+s[0].y==s[0].x)
z++;
}
if(s[1].y+s[2].x==s[0].x)
{
if(s[1].x==s[2].y&&s[1].x+s[0].y==s[0].x)
z++;
}
if(z>0)
printf("YES\n");
else
printf("NO\n");
return 0;
}