T1 Arpa and a research in Mexican wave
题意:
有n个人,最多有k个人站起来,每秒都有一个人站起来或者是坐下,详情见题目里的note。
解法:
t小于k的时候直接输出t,t大于n的时候就是k−(t−n)。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,t;
cin>>n>>k>>t;
if(t<=k)
cout<<t;
else if(t>k&&t<=n)
cout<<k;
else
cout<<k-(t-n);
return 0;
}
网址:这一题
小结:
**此类题目水题。**
T2 Arpa and an exam about geometry
题意:
输入n个数字,在平面上构成n个以(i,Xi)为坐标的点,问是否可以将这些点连成两条不重叠的平行线?可以输出"YES".
解法:
利用斜率.
代码:
#include<bits/stdc++.h>
using namespace std;
int s[3000],n;
bool judge(double k)
{
int p=-1;
for(int i=2; i<=n; i++)
{
if(s[i]-s[1]==(i-1)*k)
continue;
if(p==-1)
p=i;
else if(s[i]-s[p]!=(i-p)*k)
return 0;
}
return p!=-1;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; i++)
scanf("%d",&s[i]);
if(judge(s[2]-s[1])||judge((s[3]-s[1])*1.0/2)||judge(s[3]-s[2]))
printf("Yes\n");
else
printf("No\n");
}
}
网址:这一题
小结:
**此类题目需要特判。**
T3 Five Dimensional Points
题意:
现在给n个这样的点,现在定义good点:以这个点开始与任何两个点相连都不是锐角。
反之如果有任何一组点组成的连线是锐角就是bad点。
解法:
找规律.
代码:
#include<bits/stdc++.h>
using namespace std;
int x[1000][1000];
int y[12];
int g(int a)
{
int b=0;
for(int i=1; i<=a-2; i++)
b+=i;
return b;
}
int f(int a,int b,int c)
{
int d=0;
for(int i=1; i<=5; i++)
d+=(x[b][i]-x[a][i])*(x[c][i]-x[a][i]);
if(d<=0)
return 1;
else
return 0;
}
int main()
{
int a,b=0,c=0;
cin>>a;
for(int i=1; i<=a; i++)
for(int j=1; j<=5; j++)
cin>>x[i][j];
for(int i=1; i<=a; i++)
{
b=0;
int o=0;
for(int j=1; j<=a; j++)
{
for(int k=1; k<=a; k++)
{
if(j<k&&i!=j&&i!=k)
{
if(f(i,j,k)==1)
b++;
if(f(i,j,k)==0)
{
o++;
break;
}
}
}
if(o!=0)
{
i++;
break;
}
}
if(c==11)
{
cout<<0;
return 0;
}
if(b==g(a))
{
c++;
y[c]=i;
}
}
// cout<<g(10);
cout<<c<<endl;
for(int i=1; i<=c; i++)
cout<<y[i]<<" ";
return 0;
}
网址:这一题
小结:
**此类题目需要特判。**
T4 Polycarpus’ Dice
题意:
给你n个骰子,然后每个骰子有d[i]面,给你一个a,a表示这n个骰子所扔的点数和
然后问你,每一个骰子有多少个数不能投掷到~
解法:
找规律.
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10000000;
LL max6[N];
int main()
{
LL n, A;
cin >> n >> A ;
LL h = 0;
for(int i = 0; i < n; i++)
{
cin >> max6[i];
h += max6[i];
}
for(int i = 0; i < n; i++)
{
LL ans = 0;
LL hou = A + 1 - n;
if(max6[i] > hou) ans += (max6[i] - hou);
LL y = A - (h - max6[i]);
if(y > 0) ans += (y - 1);
cout << ans<<" ";
}
cout << endl;
return 0;
}
网址:这一题
小结:
**此类题目可以先手算找规律。**
T5 Little Elephant and LCM
题意:
给你一个a序列,找出一个b序列,1=≤bi≤=ai,使得max(bi)=lcm(bi),问这样的bi序列有多少个。
解法:
暴力优化.
代码:
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
#define MAXN 100000
#define MOD 1000000007
long long a[MAXN+10],n,p[MAXN+10],cnt,ans;
void Read(long long &x){
char c;
while((c=getchar())&&c!=EOF){
if(c>='0'&&c<='9'){
x=c-'0';
while((c=getchar())&&c>='0'&&c<='9')
x=x*10+c-'0';
ungetc(c,stdin);
return;
}
}
}
void isfactor(long long n){
long long t=sqrt(n+0.5),i;
cnt=0;
for(i=1;i<=t;i++)
if(n%i==0)
p[++cnt]=i;
i=cnt;
cnt*=2;
if(t*t==n)
cnt--,i--;
for(;i;i--){
p[cnt-i+1]=n/p[i];
}
}
long long pow(long long a,long long b){
long long ret=1;
while(b){
if(b&1)
ret=ret*a%MOD;
b>>=1;
a=a*a%MOD;
}
return ret;
}
int main()
{
long long i,j,k,t,s;
Read(n);
for(i=1;i<=n;i++)
Read(a[i]);
sort(a+1,a+n+1);
for(i=1;i<=a[n];i++){
isfactor(i);
t=0;
s=1;
for(j=2;j<=cnt;j++){
k=lower_bound(a+t+1,a+n+1,p[j])-a-1;
s=s*pow(j-1,k-t)%MOD;
t=k;
}
s=s*(pow(cnt,n-t)+MOD-pow(cnt-1,n-t))%MOD;
ans=(ans+s)%MOD;
}
printf("%I64d\n",ans);
}(代码是抄的,自己还在琢磨中)
网址:这一题
小结:
**此类题目较难。**