ECJTU-ACM-20級選拔賽
點擊跳轉↑
1001
注意反斜杠的轉譯 printf("\\");
1002
要每個人都不一樣,從一開始,每個人分的的禮物加一即可,則問題轉化為了:首項為1,公差為1的數列前n項和與m的大小比較
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
long long n,m;
while(t--)
{
scanf("%lld%lld",&n,&m);
long long sum = (m+1)*m/2;
if(n>=sum)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
1003
已經限制了題目和資料,省去了對年份的判斷,判斷月份即可
#include<stdio.h>
#include<string.h>
int m,d,rem;
void deal()
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
d-=31,m++;
else if(m==4||m==6||m==9||m==11)
d-=30,m++;
else if(m==2)
d-=28,m++;
}
int check()
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
if(d<=31)
return 1;
else if(m==4||m==6||m==9||m==11)
if(d<=30)
return 1;
else if(m==2)
if(d<=28)
return 1;
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d-%d%d",&m,&d,&rem);
d += rem;
while(check()==0)
{
deal();
}
printf("2077-%02d-%02d\n",m,d);
}
return 0;
}
1004
輸出n×2^m即可,注意資料型別用long long,int會爆
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
long long a,n;
while(t--)
{
scanf("%lld%lld",&a,&n);
while(n--)
{
a*=2;
}
printf("%lld\n",a);
}
return 0;
}
1005
資料范圍很嚇人,但是暴力遍歷,分解數字,累計即可
#include<stdio.h>
#include<string.h>
int main()
{
int n,m,num[11];
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(num,0,sizeof(num));
for(int i=n;i<=m;i++)
{
int l=i,k;
while(l)
{
k=l%10;
num[k]++;
l/=10;
}
}
for(int i=0;i<=9;i++)
{
printf("%d%c",num[i],i==9 ? '\n':' ');
}
}
return 0;
}
1006
字串處理,對各個數字進行存盤,遍歷程序中對當前的數字做判斷即可
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
int num[10];
char str[200005];
while(t--)
{
memset(num,0,sizeof(num));
scanf("%s",str);
int ans=strlen(str);
for(int i=0;i<strlen(str);i++)
{
int a=str[i]-'0';
int b=10-a;
if(num[b]!=0)
num[b]--,ans-=2;
else
num[a]++;
}
printf("%d\n",ans);
}
return 0;
}
1007
思維題,推導可知,如果是兩段長度不等的區間,總和要相等,其中一段必然會出現兩個相等的數,那么直接取這兩個數(區間長度都為1的兩段)就已經滿足題意了,所以問題轉化成:判斷序列中有沒有兩個位置的值相等
#include<stdio.h>
#include<string.h>
int main()
{
int n;
int a,vis[1005];
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
int flag = 0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(vis[a]!=0)
flag=1;
else
vis[a]++;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
1008
思維題,博弈(意會)
因為對于兩個人來說,都要先讓自己贏得多,其次才是對方贏的少,
粗略考慮:對方出手時,都不還手浪費體力,最后兩個人都可以最大化獲勝次數,滿足題意,
特殊考慮:先手不能不出,則先手的那方必然會少一次獲勝次數,
#include<stdio.h>
#include<string.h>
int main()
{
int t,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&x,&y);
printf("%d %d\n",x-1,y);
}
return 0;
}
1009
字串加法,區別在不用進位,那么就要對最后的答案進行特殊處理和特判,
首先要刪去所有前導0,例如:09對應的答案是9,0001對應的答案是1,當然,若答案全為0,也要輸出0.
#include<stdio.h>
#include<string.h>
char a[200005],b[200005];
int a1[200005],b1[200005],c[200005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",a,b);
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
memset(c,0,sizeof(c));
int la=strlen(a),lb=strlen(b);
for(int i=0;i<la;i++) a1[la-1-i] = a[i]-'0';
for(int i=0;i<lb;i++) b1[lb-1-i] = b[i]-'0';
int len = la>lb ? la:lb;
for(int i=0;i<len;i++)
c[i] = (a1[i]+b1[i]) % 10;
int flag=0;
for(int i=len-1;i>=0;i--)
{
if(c[i]==0 && flag==0 && i==0)
printf("0");
if(c[i]==0 && flag==0)
continue;
flag=1;
printf("%d",c[i]);
}
printf("\n");
}
return 0;
}
1010
數學規律題,根據矩陣數字擺放規則,推匯出每個位置上數字的特定公式即可
#include<stdio.h>
#include<string.h>
int main()
{
long long n,x,y,ans;
while(scanf("%lld%lld%lld",&n,&x,&y)!=EOF)
{
ans = (x+3)*x/2;
if(x+y < n)
ans += (1+2*x+y)*y/2;
else
ans += (1+2*x+(n-x-1))*(n-x-1)/2 + (3*n-x-y-2)*(x+y-n+1)/2;
printf("%lld\n",ans);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236120.html
標籤:其他
