吃透这本书?吃透这本书。
结构体的两种定义方式
typedef struct{
int x,y;
}node;
struct node{
int x,y;
};
组合数的求法有:暴力、杨辉三角、柯西定理、分解质因数。详情请见我的另一篇博客https://blog.csdn.net/qq_41635132/article/details/81713031
素数判定 有普通判定,普通筛,欧拉筛,杜教筛等等,详见我的博客,
https://blog.csdn.net/qq_41635132/article/details/82423386
知识有点多,不破不立,既然向往明天,何在乎荆棘!
指针 不要幻想我在这里讲清楚,我就不,哼!(其实是我不会,,)
比较灵活的void*,可以转换称其他指针,真的强
比如malloc这个函数(int *)malloc(sizeof(int)),就是用到了这个知识点。
例题
UVa 1339(Ancient Cipher)
思维题,只是一个排序而已,排序这个课题先留着这一张学完了就搞排序。
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int lena,lenb;
int a[26],b[26];
int main(){
while(cin>>s1>>s2){
lena=s1.length(),lenb=s2.length();
if(lena!=lenb)puts("NO");
else{
memset(a,0,sizeof a),memset(b,0,sizeof b);
for(int i=0;i<lena;i++)a[s1[i]-'A']++,b[s2[i]-'A']++;
sort(a,a+26);sort(b,b+26);
bool flag=true;
for(int i=0;i<26;i++){
if(a[i]!=b[i]){flag=false;break;}
}
if(flag)puts("YES");
else puts("NO");
}
}
return 0;
}
UVa 489 (Hangman Judge)
https://vjudge.net/problem/UVA-489
做一个映射就好了。
#include<bits/stdc++.h>
using namespace std;
int a[26],len,num,t;
char s[100];
int main(){
int T;
for(scanf("%d",&T);~T;scanf("%d",&T)){
printf("Round %d\n",T);
memset(a,0,sizeof a),num=t=0;
scanf("%s",s),len=strlen(s);
for(int i=0;i<len;i++)num+=!a[s[i]-'a'],a[s[i]-'a']=1;
scanf("%s",s),len=strlen(s);
for(int i=0;i<len;i++){
if(!~a[s[i]-'a'])continue;
else if(!a[s[i]-'a'])a[s[i]-'a']=-1,t++;
else a[s[i]-'a']=-1,num--;
if(t>=7){puts("You lose.");break;}
if(!num){puts("You win.");break;}
}
if(num&&t<7)puts("You chickened out.");
}
return 0;
}
UVa 133 (The Dole Queue)
https://vjudge.net/problem/UVA-133
#include<bits/stdc++.h>
using namespace std;
bool in[25];
int n,m,k,L;
int go(int s,int p,int step){
while(step--)do{s=(s+p+n-1)%n+1;}while(!in[s]);
return s;
}
int main(){
while(~scanf("%d%d%d",&n,&k,&m)&&(n||k||m)){
memset(in,true,sizeof in),L=n;
int p1=n,p2=1;
while(L){
p1=go(p1,1,k),p2=go(p2,-1,m);
if(p1==p2)printf("%3d",p1),L--;
else printf("%3d%3d",p1,p2),L-=2;
in[p1]=in[p2]=false;
if(L)printf(",");
}
puts("");
}
return 0;
}
UVa 213 (Message Decoding)
https://vjudge.net/problem/UVA-213
这道题看博客了,scanf(“%1d”,&x);学到了
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
char s[N],key[8][1<<8],c;
int val,len,l;
void read(){
len=1;
l=strlen(s);
for(int i=val=0;i<l;i++)
if(val<((1<<len)-1))key[len][val++]=s[i];
else{
val=0;
key[++len][val++]=s[i];
}
}
void print(){
for(int i=val=0;i<len;i++){
do scanf("%c",&c);while(!isdigit(c));
val=val*2+(c-'0');
}
if(val>=((1<<len)-1))return;
else{
printf("%c",key[len][val]);
print();
}
}
int main(){
int l1,l2,l3;
while(gets(s)!=NULL){
if(!s[0])continue;
memset(key,0,sizeof key);
read();
while(scanf("%1d%1d%1d",&l1,&l2,&l3),len=4*l1+2*l2+l3)print();
puts("");
}
return 0;
}
UVa 512 (Spreadsheet Tracking)
https://vjudge.net/problem/UVA-512
50*50,随便模拟啊,怎么暴力都不会超时
#include<bits/stdc++.h>
using namespace std;
pair<int,int>MAP[55][55];
int l,c;
bool cmp(int a,int b){return a>b;}
void EX(){
int x1,y1,x2,y_2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y_2);
swap(MAP[x1][y1],MAP[x2][y_2]);
}
void DC(){
int n;scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
int x=a[i];
for(int i=1;i<=l;i++)
for(int j=x+1;j<=c;j++)
MAP[i][j-1]=MAP[i][j];
c--;
}
}
void DR(){
int n;scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
int x=a[i];
for(int i=x+1;i<=l;i++)
for(int j=1;j<=c;j++)
MAP[i-1][j]=MAP[i][j];
l--;
}
}
void IC(){
int n;scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
int x=a[i];
for(int i=1;i<=l;i++)
for(int j=c;j>=x;j--)
MAP[i][j+1]=MAP[i][j];
for(int i=1;i<=l;i++)MAP[i][x]={0,0};
c++;
}
}
void IR(){
int n;scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
int x=a[i];
for(int i=l;i>=x;i--)
for(int j=1;j<=c;j++)
MAP[i+1][j]=MAP[i][j];
for(int i=0;i<=c;i++)MAP[x][i]={0,0};
l++;
}
}
pair<int,int>find(pair<int,int>v){
for(int i=1;i<=l;i++)
for(int j=1;j<=c;j++)
if(MAP[i][j]==v)return {i,j};
return {0,0};
}
void print(){
for(int i=1;i<=l;i++){
for(int j=1;j<=c;j++){
cout<<"("<<MAP[i][j].first<<","<<MAP[i][j].second<<") ";
}
cout<<endl;
}
}
char command[5];
int main(){
int T=0;
while(~scanf("%d%d",&l,&c)&&(l||c)){
if(T)puts("");
for(int i=1;i<=l;i++)
for(int j=1;j<=c;j++)
MAP[i][j]={i,j};
int n;scanf("%d",&n);
while(n--){
scanf("%s",command);
if(command[0]=='E')EX();
else if(command[0]=='I'&&command[1]=='C')IC();
else if(command[0]=='I'&&command[1]=='R')IR();
else if(command[0]=='D'&&command[1]=='C')DC();
else if(command[0]=='D'&&command[1]=='R')DR();
}
printf("Spreadsheet #%d\n",++T);
scanf("%d",&n);
while(n--){
int a,b;scanf("%d%d",&a,&b);
pair<int,int>k=find({a,b});
if(k.first)printf("Cell data in (%d,%d) moved to (%d,%d)\n",a,b,k.first,k.second);
else printf("Cell data in (%d,%d) GONE\n",a,b);
}
}
return 0;
}
UVa 1589 (Xiangqi)
https://vjudge.net/problem/UVA-1589
啊啊啊啊啊,到底有什么BUG,对于象棋九段的我,竟然过不了,过几天再看看。
#include<bits/stdc++.h>
using namespace std;
char MAP[12][12],c;
int n,x,y,a,b;
int dir[8][2]={2,1,2,-1,-2,1,-2,-1,1,2,1,-2,-1,2,-1,-2};
bool faker(){
for(int i=x+1;i<=10;i++){
if(MAP[i][y]=='G')return true;
if(MAP[i][y]!=' ')return false;
}
return false;
}
bool killing(int xx,int yy){
if(xx<0||xx>3||yy<4||yy>6)return false;
for(int i=0;i<8;i++){
int xxx=xx+dir[i][0],yyy=yy+dir[i][1];
int xxxx=xx+dir[i][0]>0?1:-1,yyyy=yy+dir[i][1]>0?1:-1;
if(xxx<1||MAP[xxxx][yyyy]!=' ')continue;
if(MAP[xxx][yyy]=='H')return false;
}
for(int i=xx+1;i<=10;i++){
if(MAP[i][yy]=='R'||MAP[i][yy]=='G')return false;
else if(MAP[i][yy]!=' ')break;
}
for(int i=xx-1;i>=1;i--){
if(MAP[i][yy]=='R')return false;
else if(MAP[i][yy]!=' ')break;
}
for(int i=yy+1;i<=10;i++){
if(MAP[xx][i]=='R')return false;
else if(MAP[xx][i]!=' ')break;
}
for(int i=yy-1;i>=1;i--){
if(MAP[xx][i]=='R')return false;
else if(MAP[xx][i]!=' ')break;
}
bool flag=false;
for(int i=xx+1;i<=10;i++){
if(MAP[i][yy]=='C'&&flag)return false;
else if(MAP[i][yy]!=' '&&!flag)flag=true;
else if(MAP[i][yy]!=' ')break;
}
flag=false;
for(int i=xx-1;i>=1;i--){
if(MAP[i][yy]=='C'&&flag)return false;
else if(MAP[i][yy]!=' '&&!flag)flag=true;
else if(MAP[i][yy]!=' ')break;
}
flag=false;
for(int i=yy+1;i<=10;i++){
if(MAP[xx][i]=='C'&&flag)return false;
else if(MAP[xx][i]!=' '&&!false)flag=true;
else if(MAP[xx][i]!=' ')break;
}
flag=false;
for(int i=yy-1;i>=1;i--){
if(MAP[xx][i]=='C'&&flag)return false;
else if(MAP[xx][i]!=' '&&!flag)flag=true;
else if(MAP[xx][i]!=' ')break;
}
return true;
}
int main(){
while(cin>>n>>x>>y&&(n||x||y)){
memset(MAP,' ',sizeof MAP);
while(n--){
cin>>c>>a>>b;
MAP[a][b]=c;
}
if(faker())puts("NO");
else{
if(killing(x-1,y)||killing(x+1,y)||killing(x,y-1)||killing(x,y+1))puts("NO");
else puts("YES");
}
}
return 0;
}
UVa 201(Squares)
https://cn.vjudge.net/problem/UVA-201
还是无脑模拟而已,我这里建图了,因为这样思路比较清晰,其他的方法应该也行。
#include<bits/stdc++.h>
using namespace std;
bool MAP[12][12][2];
char c;
bool judge(int x,int y,bool type,int step){
if(!step)return true;
if(type){
if(MAP[x][y][0])return judge(x,y+1,type,step-1);
return false;
}
else{
if(MAP[x][y][1])return judge(x+1,y,type,step-1);
return false;
}
}
int main(){
int n,m,a,b,T=0;
while(cin>>n>>m){
if(T)cout<<endl<<"**********************************"<<endl<<endl;
cout<<"Problem #"<<++T<<endl<<endl;
memset(MAP,false,sizeof MAP);
while(m--){
cin>>c>>a>>b;
if(c=='H')MAP[a][b][0]=true;
else MAP[b][a][1]=true;
}
bool flag=false;
for(int d=1;d<n;d++){
int ans=0;
for(int i=1;i<=n-d;i++){
for(int j=1;j<=n-d;j++){
if(judge(i,j,true,d)&&judge(i,j,false,d)&&judge(i+d,j,true,d)&&judge(i,j+d,false,d))ans++; }
}
if(ans){
cout<<ans<<" square (s) of size "<<d<<endl;
flag=true;
}
}
if(!flag)cout<<"No completed squares can be found."<<endl;
}
return 0;
}
UVa 220(Othello)
https://cn.vjudge.net/problem/UVA-220
恶心,网上代码,,,
#include<bits/stdc++.h>
using namespace std;
char MAP[10][10];
int f[2][10][10];
int dx[]={-1,-1,-1, 1,1,1,0, 0};
int dy[]={-1, 0, 1,-1,0,1,1,-1};
void is(int a,char b,int x,int y){
for(int k=0;k<8;k++){
int tx=x+dx[k];
int ty=y+dy[k];
int num=0;
while(tx>=0&&ty>=0&&tx<8&&ty<8&&MAP[tx][ty]==b){
tx+=dx[k];
ty+=dy[k];
++num;
}
if(num>=1&&MAP[tx][ty]=='-')f[a][tx][ty]|=1<<k;
}
}
void init(){
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(MAP[i][j]=='W')is(0,'B',i,j);
else if(MAP[i][j]=='B')is(1,'W',i,j);
}
bool print(bool isprint,int p){
bool flag=false;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(f[p][i][j]){
if(flag&&isprint)cout<<" ";
flag=true;
if(isprint)cout<<'('<<i+1<<','<<j+1<<")";
else return flag;
}
if(isprint){
if(flag)cout<<endl;
else cout<<"No legal move."<<endl;
}
return flag;
}
void move(int x,int y,int p){
char ch;
if(p==0)ch='W';
else ch='B';
MAP[x][y]=ch;
for(int i=0;i<8;i++){
if(f[p][x][y]&1<<i){
int tx=x-dx[i];
int ty=y-dy[i];
while(tx>=0&&ty>=0&&tx<8&&ty<8&&MAP[tx][ty]!=ch){
MAP[tx][ty]=ch;
tx-=dx[i];
ty-=dy[i];
}
}
}
}
int main(){
int T;cin>>T;
while(T--){
memset(MAP,0,sizeof MAP);
for(int i=0;i<8;i++)cin>>MAP[i];
char ch[5];int p;
cin>>ch;
if(ch[0]=='W')p=0;
else p=1;
while(ch[0]!='Q'){
memset(f,0,sizeof f);
init();
cin>>ch;
if(ch[0]=='L')print(true,p);
else if(ch[0]=='M'){
if(!print(false, p))p^=1;
move(ch[1]-'0'-1,ch[2]-'0'-1, p);
p^=1;
int wnum=0;
int bnum=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++){
if(MAP[i][j]=='W')++wnum;
if(MAP[i][j]=='B')++bnum;
}
printf("Black - %2d White - %2d\n", bnum, wnum);
}
}
for(int i=0;i<8;i++)cout<<MAP[i]<<endl;
if(T!=0)cout<<endl;
}
return 0;
}
UVa 253(Cube painting)
https://cn.vjudge.net/problem/UVA-253
这样的模拟题才有意思嘛
#include<bits/stdc++.h>
using namespace std;
struct node{
char k[6];
void get(char *c){
for(int i=0;i<6;i++)k[i]=c[i];
}
void swapL(){
char temp=k[0];
k[0]=k[1],k[1]=k[5],k[5]=k[4],k[4]=temp;
}
void swapC(){
char temp=k[1];
k[1]=k[3],k[3]=k[4],k[4]=k[2],k[2]=temp;
}
void swapX(){
char temp=k[0];
k[0]=k[3],k[3]=k[5],k[5]=k[2],k[2]=temp;
}
}a[2];
bool judge(node A,node B){
for(int i=0;i<6;i++){
if(A.k[i]!=B.k[i])return false;
}
return true;
}
char c[20];
int main(){
//freopen("D:\\out.txt","w",stdout);
while(gets(c)!=NULL){
a[0].get(c),a[1].get(c+6);
bool flag=false;
for(int i=0;i<4;i++){
a[0].swapL();
for(int j=0;j<4;j++){
a[0].swapC();
for(int k=0;k<4;k++){
a[0].swapX();
if(judge(a[0],a[1])){flag=true;break;}
}
if(flag)break;
}
if(flag)break;
}
if(flag)puts("TRUE");
else puts("FALSE");
}
return 0;
}
UVa 1590(IP Networks)
https://cn.vjudge.net/problem/UVA-1590
模拟模拟模拟模拟,顺便了解下网络的知识。
#include<bits/stdc++.h>
using namespace std;
int a[9]={255,254,252,248,240,224,192,128,0};
int ip[4][1024],minip[4],hide[4];
int main(){
int m;
while(~scanf("%d",&m)){
memset(ip,0,sizeof ip);
for(int i=0;i<m;i++)scanf("%d.%d.%d.%d",&ip[0][i],&ip[1][i],&ip[2][i],&ip[3][i]);
for(int i=0;i<4;i++){
sort(ip[i],ip[i]+m);
int MAX=ip[i][m-1],MIN=ip[i][0],dif=0;
for(int j=1;j<=8;j++){
if(MAX%2!=MIN%2)dif=j;
MAX>>=1,MIN>>=1;
}
hide[i]=a[dif];
minip[i]=ip[i][0]&hide[i];
}
for(int i=0;i<4;i++){
if(hide[i]!=255){
for(i=i+1;i<4;i++)hide[i]=minip[i]=0;
break;
}
}
printf("%d.%d.%d.%d\n",minip[0],minip[1],minip[2],minip[3]);
printf("%d.%d.%d.%d\n",hide[0],hide[1],hide[2],hide[3]);
}
return 0;
}
UVa 12108(Extraodinarily Tried students)
https://vjudge.net/problem/UVA-12108
无脑模拟,感觉这一道题可以试一试线程的,有时间试一试。
#include<bits/stdc++.h>
using namespace std;
int Sleep,n;
struct node{
int L,S,now;
bool ok;
void get(){
cin>>L>>S>>now;
while(now>L+S)now-=L+S;
ok=(now<=L);
if(!ok)Sleep++;
}
void add(){
now++;
if(now>L+S)now-=L+S,ok=true;
else if(now==L+1&&Sleep<=(n-Sleep))now=1;
else if(now==L+1)ok=false;
}
}a[20];
void go(){
int sum=0;
for(int i=0;i<n;i++){
a[i].add();
if(!a[i].ok)sum++;
}
Sleep=sum;
}
int main(){
int Case=0;
while(cin>>n&&n){
Sleep=0;
for(int i=0;i<n;i++)a[i].get();
bool flag=false;
for(int i=1;i<10000;i++){
if(Sleep==0){
flag=true;
cout<<"Case "<<++Case<<": "<<i<<endl;
break;
}
go();
}
if(!flag)cout<<"Case "<<++Case<<": "<<-1<<endl;
}
return 0;
}
UVa 1591(Data Mining)
https://vjudge.net/problem/UVA-1591
智障题吧,那么简单题目那么长,,,
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,x,y,N,ansN,ansA,ansB;
while(cin>>n>>x>>y) {
ansN=n*y<<10;
for(int i=0;i<32;i++) {
for(int j=0;j<32;j++) {
N=(((n-1)*x+((n-1)*x<<i))>>j)+y;
if(N>=n*y&&N<ansN)ansA=i,ansB=j,ansN=N;
}
}
cout<<ansN<<" "<<ansA<<" "<<ansB<<endl;
}
return 0;
}
UVa 815(Flooded)
https://vjudge.net/problem/UVA-815
这道题排下序就好了,可能有疑问为啥不可能有多个水坑,可能题目描述了吧,紫书没说清楚。
#include<bits/stdc++.h>
using namespace std;
int MAP[1000];
int main(){
int n,m,Case=0;
double v;
while(cin>>n>>m&&(n||m)){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>MAP[i*m+j];
cin>>v;
int s=1;
double kk;
sort(MAP,MAP+n*m);
while(true){
if(s==n*m){
kk=v/s/100+MAP[s-1];
break;
}
v-=(MAP[s]-MAP[s-1])*s*100;
if(v<=0){
v+=(MAP[s]-MAP[s-1])*s*100;
kk=v/s/100+MAP[s-1];
break;
}
s++;
}
cout<<"Region "<<++Case<<endl;
cout<<fixed<<setprecision(2)<<"Water level is "<<kk<<" meters."<<endl;
cout<<s*1.0/m/n*100<<" percent of the region is under water."<<endl<<endl;
}
return 0;
}