CANDY
普及- 难度。。。
数论推一下即可。。。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
//freopen("candy.in","r",stdin);
//freopen("candy.out","w",stdout);
int n,l,r;
scanf("%d%d%d",&n,&l,&r);
int v=l%n;
if(r-l+v<n) printf("%d",r-l+v);
else printf("%d",n-1);
return 0;
}
SORT
思路:先记录每个数据的排名,因为调换的次数较少,所以在一操作中进行重排名。将处在原、现数字中的排名加或减1,在处理相同数字的情况。(可惜我没能写出找a[x]的排名的方法,只能写排序了)
小数据能过,大数据会超时。。。
#include<bits/stdc++.h>
using namespace std;
struct num{
int s;
int k;
int p;
};
bool f1(num x,num y){
if(x.s<y.s) return 1;
else return 0;
}
bool f2(num x,num y){
if(x.k<y.k) return 1;
else return 0;
}
int main(){
//freopen("sort.in","r",stdin);
//freopen("sort.out","w",stdout);
int n,q;
scanf("%d%d",&n,&q);
num a[n+1];
for(int i=1;i<=n;i++){
scanf("%d",&a[i].s);
a[i].k=i;
}
sort(a+1,a+1+n,f1);
for(int i=1;i<=n;i++){
a[i].p=i;
}
sort(a+1,a+n+1,f2);
for(int i=1;i<=q;i++){
int d;
scanf("%d",&d);
if(d==1){
int x,v;
scanf("%d%d",&x,&v);
a[x].s=v;
}
else{
int x;
sort(a+1,a+1+n,f1);
for(int i=1;i<=n;i++){
a[i].p=i;
}
sort(a+1,a+n+1,f2);
scanf("%d",&x);
printf("%d\n",a[x].p);
}
}
return 0;
}
NETWORK
时间来不及了,写的骗分,估摸着二十个数据点能过八个。。。
#include<bits/stdc++.h>
using namespace std;
int cs[1000000];
int main(){
//freopen("network.in","r",stdin);
//freopen("network.out","w",stdout);
memset(cs,0,sizeof(cs));
int n;
cin>>n;
for(int i=1;i<=n;i++){
char g[20];
scanf("%s",g);
int a,b,c,d,e;
scanf("%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
if(g[0]=='S'){
cs[a+b*2-c+231*d+e*4]=i;
cout<<"OK"<<endl;
}
else{
if(cs[a+b*2-c+231*d+e*4]!=0){
cout<<cs[a+b*2-c+231*d+e*4]<<endl;
}
else cout<<"FAIL"<<endl;
}
}
return 0;
}
后来想的思路就是a,b,c,d,e都用字符串转数字来判断域名错误的情况。
FRUIT
用数组记录每个水果的存在情况,模拟。
#include<bits/stdc++.h>
using namespace std;
int main(){
//freopen("fruit.in","r",stdin);
//freopen("fruit.out","w",stdout);
int n;
scanf("%d",&n);
int a[n+1];
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int t=0;
bool f[n+1];
memset(f,0,sizeof(f));
while(t<n){
int u=-1;
for(int i=1;i<=n;i++){
if(u!=a[i]&&f[i]==0){
printf("%d ",i);
u=a[i];
a[i]=-1;
f[i]=1;
t++;
}
}
printf("\n");
}
return 0;
}